Ошибка выдачи сценария "=: не найдено"

Программа с именем path_helperпо умолчанию запускается из различных /etc/*rc-файлов оболочки.

$ grep path_helper /etc/* 2>/dev/null
/etc/csh.login:#if ( -x /usr/libexec/path_helper ) then
/etc/csh.login:#    eval `/usr/libexec/path_helper -c`
/etc/profile:#if [ -x /usr/libexec/path_helper ]; then
/etc/profile:#  eval `/usr/libexec/path_helper -s`
/etc/zprofile:#if [ -x /usr/libexec/path_helper ]; then
/etc/zprofile:# eval `/usr/libexec/path_helper -s`
$ 

Это, очевидно, не значение по умолчанию; Я отключил path_helperи управляю PATHв своих собственных файлах rc.

4
01.09.2018, 17:13
2 ответа

Присвоение переменных не должно включать $и пробелы вокруг =. Я бы также дважды процитировал задание. Таким образом, назначение переменной должно выглядеть следующим образом.

a="/is115/idm/dsproj/scripts/l.txt"

Судя по дальнейшему чтению скрипта, вы хотите сохранить содержимое файла 1.txtв $a, а не сам путь к файлу. Для этого можно использовать следующее задание.

read -r a < /is115/idm/dsproj/scripts/l.txt

(read -rчитает первую строку файла, удаляет начальные и конечные пробелы и табуляции (, принимая значение по умолчанию$IFS)и сохраняет его в предоставленной переменной)


Вы также можете заключить в двойные кавычки переменную $aв операторе if.

if [ "$a" -gt 0 ];

Вы также можете использоватьhttps://www.shellcheck.net/для проверки синтаксиса вашего скрипта.

11
27.01.2020, 20:46

Вот почему вы видите эту ошибку:

$a = /is115/idm/dsproj/scripts/l.txt

В этом месте кода переменная aне установлена. ksh заменит переменную пустой строкой, что приведет к:

 = /is115/idm/dsproj/scripts/l.txt

Затем ksh пытается выполнить строку, пытается найти команду =, не находит ее и выдает первую ошибку, которую вы видите.

Как указывает @Thomas, синтаксис присваивания переменной следующий:

varname=value

без $слева -и без пробелов вокруг =.https://www.shellcheck.net/укажет на эти ошибки.

Тогда у вас есть

    if [ $a -gt 0 ];

Поскольку aне имеет значения, ksh выполняет подстановку и пытается выполнить

    if [  -gt 0 ];

Команда [(да, это команда, псевдоним команды test)не понимает оператор ‑gtбез левого -операнда, и вы получаете 2-й сообщение об ошибке.

Команда [завершается со статусом, отличным от -нулевым, оператор ifзатем выполняет блок else, и вы получаете сообщение «все хорошо».

Вот почему важно заключать все переменные в одинарные скобки.[... ]

    if [ "$a" -gt 0 ];

В более общем случае всегда заключайте переменные в кавычки, если только вы не понимаете, когда конкретно следует опускать кавычки. См. также Последствия для безопасности, если забыли заключить переменную в кавычки в оболочках bash/POSIX

.
4
27.01.2020, 20:46

Теги

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