Этот вопрос уже здесь есть ответ:
Я запускаю следующий код как часть сценария ( #! / bin / bash
).
read -p "Do you want to make use of Thorpe volume attenuation in the watercolumn [Y/N]:" Thorpe
read -p "Do you want to include *.ati file? [Y/N]:" ati
Thorpe_att=T
ati_file=*
if [$Thorpe = Y]; then
if [$ati = Y]; then
echo "Usage of Thopre volume attenuation volume and *.ati file is accepted"
sed -i "4s/''/'$interp$surf$attenuation$Thorpe_att$ati_file'/" $Mod_Filename
else
echo "Only usage of Thopre volume attenuation volume is accepted"
sed -i "4s/''/'$interp$surf$attenuation$Thorpe_att'/" $Mod_Filename
fi
else
if [$ati = Y]; then
echo "Only usage of *.ati file is accepted"
sed -i "4s/''/'$interp$surf$attenuation$ati_file'/" $Mod_Filename
else
echo "Neither usage of Thopre volume attenuation volume nor *.ati file is accepted"
sed -i "4s/''/'$interp$surf$attenuation'/" $Mod_Filename
fi
fi
После запуска я получаю эту ошибку:
./mod.sh: line 50: [N: command not found
./mod.sh: line 59: [N: command not found
И после этого он печатает на терминале строку: echo «Никакое использование ...». Может ли кто-нибудь решить проблему? Спасибо заранее.
Вы пропускаете пробелы в своих тестовых командах. Эта часть:
if [$Thorpe = Y]; then
if [$ati = Y]; then
...
Должен быть
if [ $Thorpe = Y ]; then
if [ $ati = Y ]; then
...
Без пробелов, оболочка разворачивает значение $Thorpe
к N
и пытается работать [N
, который это рассматривает как команду. Это не распознает это как допустимую команду и производит ошибку, которую Вы видите.
Лично я предпочитаю использовать [[ $Thorpe = Y ]]
встроенный Bash, а не test
, ([ $Thorpe = Y ]
), он имеет дело с неупомянутыми строками лучше и имеет более очевидное использование & & и || операторы.
Ошибка является недостающим пространством. Эти [ ]
конструкция всегда нуждается в пробелах, таким образом [foo]
является неправильным, но [ foo ]
корректно. Так, в Вашем случае, изменение
if [$Thorpe = Y]; then
к
if [ $Thorpe = Y ]; then
На более общих сведениях, почему был бы Вы муравей для создания жизней пользователей настолько трудно? Остановка осуществления программы и требование пользователей к старательно и вручную выводят вход, очень плохой дизайн. Особенно при просьбе имя файла, которое могло легко быть дано с помощью заполнения клавишей Tab и, очень вероятно, будет введено неправильно.
Вместо того, чтобы вынудить пользователей ответить на вопросы, запишите свой сценарий так, чтобы он мог обработать параметры командной строки или, по крайней мере, сделать его так, чтобы любые аргументы передали, как, автоматически предполагается, безотносительно значений, которые Вы просите.