сценарий оболочки - несколько тестов на равенство в одном операторе if

$ awk 'NR==FNR{a[$2]=$1; next} {sub(" ?$"," "a[$5]); print}' file2 file1
471808241 29164840 1 10001 156197396 610146
471722917 21067410 1 31001 135961856 531101
471941441 20774160 1 7001  180995072 707012
471568655 29042630 1 15001 157502996 615246
471524711 20716360 1 4001  180226817 704011
471873918 29583520 1 2001  128567298 502216
471568650 29042631 1 15002 157502910 685221
  • NR==FNR если номер текущей строки совпадает с номером строки в файле, это будет верно только для первого файлового аргумента file2
  • a[$2]= 1 доллар; next сохранить пару ключ-значение из строк file2, next используется для пропуска остальной части кода
  • sub(" ?$"," "a[$5]) используйте подстановку, чтобы заменить необязательный пробел в конце строки пробелом и значением из массива a на основе 5-го столбца в качестве ключа
  • print, затем распечатайте измененные входные строки из file1
0
24.03.2017, 02:00
3 ответа

Ваша проблема в том, что [«Да»] и [«Нет»] эквивалентны [-n «Да»] и [-n «Нет»] и поэтому всегда оценивается как истина.

Правильный синтаксис:

if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; then
...
if [ "$th" = "no" ] || [ "$th" = "No" ]; then

Или:

if [ "$th" = "yes" -o "$th" = "Yes" ]; then
...
if [ "$th" = "no" -o "$th" = "No" ]; then

Или, если вы используете bash в качестве интерпретатора оболочки Борна:

if [ "${th,,}" = "yes" ]; then
...
if [ "${th,,}" = "no" ]; then

( $ {th ,,} заменяется строчным значением переменной th )

3
28.01.2020, 02:16

(1) Когда вы проверяете на ["Да" ], а затем на ["Нет" ], вам все равно нужно сравнивать с th в обеих частях:

[ "$th" = "yes" ] || [ "$th" = "Yes" ]

и

[ "$th" = "нет" ] || [ "$th" = "нет" ]

(2) Для раздела, если [ "$th" = "да" ] || [ "$th" = "да" ] , вам нужно расширить этот блок кода, чтобы включить все до проверки на No и использовать elif в этой точке, чтобы объединить это как один большой составной if-elif-fi оператор.

Вот он с исправлениями, упомянутыми выше:

echo -n "Are you thirsty?"
read th

if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; then

    echo "What would you like to drink?"
    read th

    if [ "$th" = "water" ]; then
      echo "Clear crisp and refreshing."
    elif [ "$th" = "beer" ]; then
      echo "Let me see some ID."
    elif [ "$th" = "wine" ]; then
      echo "One box or Two?"
    else
      echo "Coming right up."
    fi

elif [ "$th" = "no" ] || [ "$th" = "No" ]; then
    echo "Come back when you are thirsty."
fi
0
28.01.2020, 02:16

Ваши тесты не работают так, как вы думаете.

if [ "$var" = "value" ] || [ "Value" ];

Это не делает двух тестов на равенство. Он проверяет первый случай, а затем, если это не удается, проверяет, существует ли «Значение» , что он и делает, потому что это нужно для проверки. Таким образом, он всегда проходил через , затем , соответствующий if . Вы, вероятно, захотите:

if [ "$var" = value" ] || [ "$var" = "Value" ]

Еще лучше было бы изучить case..esac block:

case "$var" in
    value|Value)
        do_stuff
        ;;
    other|Other)
        do_something_else
        ;;
esac
2
28.01.2020, 02:16

Теги

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