#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