Сценарий оболочки с комментарием, команда не найдена при создании переменной

#shell

#оболочка

Вопрос:

У меня есть следующий скрипт, который работает:

 x=10
echo $x
now=$(date  '%Y-%m-%d')
echo $now
 

Однако, когда я добавляю строку комментария в начале:

 # comment
x=10
echo $x
now=$(date  '%Y-%m-%d')
echo $now
 

Я получаю следующее:

 x=10: command not found
x: undefined variable
 

Почему добавление комментария приводит к сбою скрипта?

если я сделаю следующее, это сработает:

 x=10
echo $x
now=$(date  '%Y-%m-%d')
# comment here
echo $now
 

Комментарии:

1. Есть ли у этого скрипта #! shebang в качестве первой строки или это просто голые команды?

2. Возможно, вы столкнулись с окончаниями строк в стиле DOS в файле?

3. Не знаю. Я использую vi для написания сценария

4. #!, похоже, ничего не изменил

5. xxd «script» или od -a «script» позволит вам искать забавных персонажей. Кроме того, является ли код, который вы публикуете, точным кодом, который не работает? Действительно ли комментарий # comment или это что-то другое?

Ответ №1:

Это причуда csh. (Прекратите использовать csh!) csh обработает скрипт, который не начинается с ‘#’, используя «стандартную оболочку» (цитата из справочной страницы csh). Когда сценарий начинается с ‘#’, csh анализирует его. Ваш скрипт не является допустимым csh.

Вероятно, вам следует добавить строку shebang, чтобы избежать проблем такого типа. То есть сделайте первую строку:

#!/bin/sh

Комментарии:

1. что такое csh и как я могу перестать его использовать?

2. @JohnB: вы можете изменить свою оболочку, выполнив chsh . Что такое csh? csh — зло. man csh может дать менее предвзятое описание.

3. csh — это оболочка. (Это программа, которая интерпретирует то, что вы вводите в командной строке.) Чтобы использовать другую оболочку, просто вызовите ее; например, введите ‘bash’. Ваш сценарий интерпретируется оболочкой, и из синтаксиса вашего скрипта следует, что вы ожидаете, что он будет интерпретироваться оболочкой bourne. Сделайте это явным, добавив строку shebang. Существует 2 основных типа оболочек: оболочки bourne и c-оболочки. Синтаксис несовместим.

4.Используйте все, что вам нравится, в качестве интерактивной оболочки. sh или bash лучше, чем cah или tcsh для сценариев, но tcsh, в частности, обладает некоторыми приятными интерактивными функциями. Пока у вас есть правильный shebang ( #! ) в верхней части ваших сценариев, вам не нужно использовать одну и ту же оболочку для написания сценариев и для интерактивного использования. Конечно, есть что сказать о согласованности, но это зависит от вас. Это !# решение вашей проблемы; chsh не имеет значения.

Ответ №2:

попробуйте что-то вроде этого

 #!/bin/sh
#
x=10
echo $x
now=$(date  '%Y-%m-%d')
echo $now
 

Это работает в моей системе (Ubuntu 11.04, 64bit). Если это не сработает, возможно, в вашем файле есть какой-то скрытый специальный символ.

Комментарии:

1. У меня не было #!/bin/sh