Использование специального символа "и` в команде отправки в сценарии ожидания

if [ $( file -b $i ) == "directory" ]

Здесь две проблемы:

  • Используйте одиночный = для сравнения строк. См. man test для правильного синтаксиса (обратите внимание, что [ во многих случаях имеет реализацию, специфичную для оболочки, поэтому см. Справочную страницу вашей оболочки ), если у вас нет документацию для теста ). Если вам абсолютно необходим == , используйте вместо него [[], что является особенностью многих борновских оболочек, включая bash, ksh, zsh. ПРИМЕЧАНИЕ: хотя == существует в bash , начиная с версии 2.0 , «= следует использовать с командой test для соответствия POSIX». ( страница руководства bash ).

  • Цитируйте все переменные как "$ ()" . Особый интерес представляет $ i . Имена файлов с пробелом разбивают $ i на несколько слов из-за расширения слов оболочки.

Пример:

bash-4.3$ mkdir with\ space
bash-4.3$ i="./with space"
bash-4.3$ set -x
bash-4.3$ [ $( file -b $i ) == "directory" ] && echo "YES"
++ file -b ./with space
+ '[' cannot open '`./with'\''' '(No' such file or 'directory)' cannot open '`space'\''' '(No' such file or 'directory)' == directory ']'
bash: [: too many arguments

name=$( file -b $i )
if [ name == "directory" ]

Здесь проблемы:

  • имя не расширяется до переменной, здесь просто строка «имя». Вам потребуется "$ name" и снова single =

Кроме того, это не могло сработать, поскольку статус выхода test возвращается как false (статус выхода 1)

$ name=$(file -b /etc)
$ set -x
$ [ name == "directory" ]
+ '[' name '==' directory ']'
$ echo $?
+ echo 1
1

Вышеупомянутое тестировалось на оболочках bash и mksh .

1
12.03.2016, 14:25
2 ответа

Если вам нужна строка без интерполяции в Tcl (язык, который использует expect), и в ней нет {} символов или переменных, которые вы хотите расширить, то заключите ее в {}. Eg:

send { chage -l root | grep -i "Password expires" | if [[ `awk -F : '{print $2}' ` = "never" ]] ; then echo "password needs to be changed " ;else echo "skipping reset " ; fi;}
send \r
3
27.01.2020, 23:26

Куда вы поставили обратную косую черту? Во всех кавычках или только во внутренних, как это?

send " chage -l root | grep -i \"Password expires\" | if [[ `awk -F : '{print \$2}' ` = \"never\" ]] ; then echo \"password needs to be changed \" ;else echo \"skipping reset \" ; fi;\r"

И да, вам также нужно \ символ $ , потому что эта строка будет передана команде, и вы не нужен bash , чтобы разрешить его слишком рано.

0
27.01.2020, 23:26

Теги

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