простой сценарий bash с инструкцией if else плюс проблема с отладкой

#linux #bash #shell #unix

#linux #bash #оболочка #unix

Вопрос:

Я работаю над простым сценарием bash, и независимо от того, что вводит пользователь choice , результат первого условия всегда печатается. Может кто-нибудь объяснить, что здесь происходит? Кстати, как вы отлаживаете такой сценарий bash? Когда я пытаюсь отлаживать в ecplise с помощью плагина shell script, единственным вариантом является «ant build», который, когда я пытаюсь, ничего не делает arrgggh!

 if [ -f $1 ]
then
    echo "Are you sure you want to delete $1? Y for yes, N for no"
    read choice
    if [ $choice="Y" ]
    then
        echo "okay"
    else
        echo "file was not deleted"
    fi 
fi
 

Ответ №1:

[ $choice="Y" ] Заменяет $choice , затем проверяет, является ли добавленная к нему замена на ‘=»Y»‘ непустой строкой. Вы имели в виду [ "$choice" = Y ] .

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

1. Это работает для условного оператора. Однако затем переменной выбора присваивается значение Y, чего я не хочу. Как мне этого избежать?

2. @ignacio — когда я впервые прочитал это, я анализировал это как «Замена $choice на «Y» … что невозможно, потому что $choice — это значение rvalue . Читая его снова, я вижу, что вы имеете в виду «Заменяет $choice его значением», а значение интерпретируется как переменная, которой присваивается значение «Y». После того, как все сказано и сделано, $choice остается равным ‘N’, а $ N равно ‘Y’.

3. Он не заменяет «выбор». Он проверяет, является ли строка «$choice = Y» непустой.

4. @IgnacioVazquez-Abrams: Итак, какой еще способ сделать то, что я хочу, без использования read . т.е. Я хочу сравнить значение переменной choice со строкой «Y», но я не хочу изменять значение choice .

Ответ №2:

Если вы думаете, что вы запускаете свой скрипт без каких-либо аргументов. В этом случае $1 ни к чему не относится и [ -f $1 ] всегда имеет значение true. Попробуйте запустить свой скрипт с аргументом, чтобы выяснить.

Ответ №3:

Для отслеживания выполнения вашего скрипта используйте

 set -x
 

Это заставит оболочку печатать значения так, как их видит интерпретатор, построчно… однако в этом случае это не говорит вам очень много:

 $ cat /tmp/test.sh 
set -x
if [ -f $1 ]
then
    echo "Are you sure you want to delete $1? Y for yes, N for no"
    read choice
    if [ $choice="Y" ]
    then
        echo "okay"
    else
        echo "file was not deleted"
    fi 
fi



$ bash /tmp/test.sh 
  '[' -f ']'
  echo 'Are you sure you want to delete ? Y for yes, N for no'
Are you sure you want to delete ? Y for yes, N for no
  read choice
N
  '[' N=Y ']'
  echo okay
okay
 

Ну … на самом деле, он буквально говорит вам, что ‘[ $ choice =»Y» ]’ неверно, но он не говорит вам, почему это неправильно или как это исправить.

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

1. Как сказал Игнасио, когда [ имеет только нулевой / один аргумент, он обрабатывает его как строку, что является истинным, если оно не пустое. So '[' N=Y ']' в основном показывает тест на пустоту N=Y строки.