Условия да / нет [дубликат]

Этот вопрос уже здесь есть ответ:

Я запускаю следующий код как часть сценария ( #! / 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 «Никакое использование ...». Может ли кто-нибудь решить проблему? Спасибо заранее.

0
задан 15 November 2017 в 10:06

2 ответа

Вы пропускаете пробелы в своих тестовых командах. Эта часть:

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 ]), он имеет дело с неупомянутыми строками лучше и имеет более очевидное использование & & и || операторы.

2
ответ дан 2 November 2019 в 08:46

Ошибка является недостающим пространством. Эти [ ] конструкция всегда нуждается в пробелах, таким образом [foo] является неправильным, но [ foo ] корректно. Так, в Вашем случае, изменение

if [$Thorpe = Y]; then

к

if [ $Thorpe = Y ]; then

На более общих сведениях, почему был бы Вы муравей для создания жизней пользователей настолько трудно? Остановка осуществления программы и требование пользователей к старательно и вручную выводят вход, очень плохой дизайн. Особенно при просьбе имя файла, которое могло легко быть дано с помощью заполнения клавишей Tab и, очень вероятно, будет введено неправильно.

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

1
ответ дан 2 November 2019 в 08:46

Другие вопросы по тегам:

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