Программа с именем 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.
Присвоение переменных не должно включать $
и пробелы вокруг =
. Я бы также дважды процитировал задание. Таким образом, назначение переменной должно выглядеть следующим образом.
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/для проверки синтаксиса вашего скрипта.
Вот почему вы видите эту ошибку:
$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
.