Если условие в локальной оболочке после соединения sFTP

Используя функции обработки строк, мы могли бы сделать это с помощью Perl следующим образом:

 printf '%s\n' "$STRING" |
 perl -nse '
      $_.= join "", <>;
      $k++ while ++($p = index($_, $s, $p));
      print $k, "\n" ;
 '    --     -s="$SUB_STRING" 

Пояснение:

° load up the whole string in $_

°  index function will return the position of a substring in a string OTW returns -1

° progressively match the substring and use the position found as the starting position for the next search. 

°  all this while increment the counter $k depicting substring found. 

Некоторые другие методы перечислены ниже:

Удалите строку и используйте регулярное выражение.

printf '%s\n' "$STRING" |
perl -slp -0777e '
        $_ = () = /$s/g;
 ' -- -s="$s" 

° Вставить строку в переменную $ _.

° передать подстроку из командной строки в perl с помощью опции -s.

° Теперь выполните сопоставление с $ _и в контексте списка получите совпадения, которые затем будут взяты в скалярном контексте для получения количества совпадений.

° опция -p автоматически печатает содержимое $ _.

Метод с использованием инструмента sed:

 esc_s=$(printf '%s\n' "$SUB_STRING" |\
 sed -e 's:[][\/.^$*]:\\&:g' -e 'H;1h;$!d;g;s/\n/\\n/g')

 printf '%s\n' "$STRING" |
 sed -ne '
         $!{N;s/^/\n/;D;}
         /'"$esc_s"'/{
               x;p;x
               s///;s/^/\n/;D
         }
 ' | wc -l

° В качестве подготовительного шага мы идем дальше и экранируем все символы, действующие как метасимволы, в левую часть оператора s/// в подстроке, что, если не сделать, приведет к сбою sed.

° Теперь мы вливаем всю строку в пространство шаблонов.

° затем мы продолжаем печатать пустую строку, место хранения является хорошим кандидатом, и удаляем подстроку из пространства шаблона.

° промыть... вспенить... повторять до тех пор, пока присутствует подстрока.

° Затем пустые строки передаются в инструмент wc, который дает нам количество строк = количество найденных подстрок.

Это версия оболочки:

 e=$STRING  N=0
 while 
     e=$(expr " $e" : " \(.*\)$SUB_STRING")
     case $e in "" ) break ;; esac
  do
           N=$(expr "$N" + 1)
  done
  echo "$N"
0
06.02.2020, 19:56
2 ответа

Чего вы пытаетесь достичь?

Для сценария bash ! инвертирует выходной сигнал. Если вы хотите увидеть пример в CLI, запустите:

ls ; echo $?

должен вернуть 0

! ls ; echo $?

вернет 1. Посмотрите внимательно в нижней части возврата, если ваша папка заполнена. Вы получите 0 или 1 в зависимости от того, как вы его запустите.

В вашем примере ! находится рядом с if (без пробела )Как !if, не ! if, и он инвертирует if в fi, а затем bash говорит, что fi не является командой. Попробуйте с пробелом между ! а если и посмотреть что будет. Не уверен, что вам нужно, чтобы произошло. Как я уже сказал, объясните желаемые результаты, и это поможет кому-то получить ваш ответ.

0
28.04.2021, 23:24
  1. Экраны оболочки обычно требуют ввода команды оболочки. все в одну строку. Попробуйте ввести

    !if [[ ! -s /directory1/subdirectory1/file1.txt ]]; then mv /directory1/subdirectory1/file1.txt /directory2/subdirectory2; fi
    

    (Вам не нужна точка с запятой в конце.)

  2. Если вы собираетесь выполнять одну и ту же команду много раз, вы можете упростить себе жизнь, поместив ее в (локальный )сценарий оболочки. Затем вы можете запустить его, набрав

    !my_conditional_mv
    

    (или как вы это называете ).

0
28.04.2021, 23:24

Теги

Похожие вопросы