Сценарий оболочки:
#!/bin/sh
a="foo bar"
case $a in
"foo bar")
echo case 1
;;
esac
case foo bar in
"foo bar")
echo case 2
;;
esac
Выполнение этого с bash
приводит к следующему выводу и ошибке.
case 1
foo: line 10: syntax error near unexpected token `bar'
foo: line 10: `case foo bar in'
Выполнение этого с dash
:
case 1
foo: 10: foo: Syntax error: word unexpected (expecting "in")` leads to the following output and error.
Я не понимаю, почему первый оператор case
выполняется успешно, а второй нет.
Согласно документу POSIX по адресу http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05, в любом случае произойдет разделение полей, поэтому после того, как $a
расширится до foo bar
в первом выражении case
, оно должно быть эквивалентно второму.
Так что оба должны потерпеть неудачу. Почему первый оператор case
выполняется успешно?
touch "foo bar"
. Тогда, по вашей логике,a="foo bar"; ls $a
должен отображать файлfoo bar
, ноls foo bar
не должен этого делать, потому что первая представляет собой одну строку, а вторая — нет. Но на самом деле обе команды не работают, потому что в в обоих случаях, и в обоих случаях у нас есть два слова, а не одно, после разделения поля. - person Lone Learner   schedule 20.01.2016case $a
, а не вls $a
. - person Lone Learner   schedule 20.01.2016I am trying to understand
Вы никогда не просили разъяснений. Вы только что начали объяснять разделение полей. - person 123   schedule 20.01.2016case
нет разделения полей. В вашем комментарии указано, что в первом случае это одна строка. Почему? Я этого не понял. Вот почему я прокомментировал то, что прокомментировал. Через 5 минут ответ @l3x ниже объяснил, что разделение полей не происходит вcase
, и я принял его как правильный ответ. Я не просил каких-либо разъяснений в комментарии, потому что я уже задал его в своем вопросе. Я только что опубликовал то, что выглядело как противоречие вашему комментарию, чтобы сделать комментарий коротким и запустить дискуссию. - person Lone Learner   schedule 20.01.2016