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
.
Если вам нужна строка без интерполяции в 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
Куда вы поставили обратную косую черту? Во всех кавычках или только во внутренних, как это?
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
, чтобы разрешить его слишком рано.