#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
строки.