Отлично, спасибо! Этот последний комментарий был недостающей информацией, которая ответила на мой заданный вопрос.
через Башруководствои, в частности, тема разделения слов.
Этот скрипт, называемый «args», помогает продемонстрировать примеры разделения слов:
#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo
Пример:
$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>
Все идет нормально. Я понимаю, как это работает.
Однако, когда я заменяю IFS непробельным символом, скажем,:
, скрипт не выполняет разбиение слов, если я передаю строку непосредственно в качестве аргумента.
$ ./args one:two:three
1 args: <one:two:three>
Тем не менее, сценарийделает выполнить разделение слов на одной и той же строке, если я (1) назначу строку переменной, а затем (2) передам строку в сценарий с помощью раскрытия параметров.
$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>
Зачем? В частности, почему передача строки в качестве аргумента подвергается разделению слов, если IFS не установлен, а разделители являются пробельными символами, но не тогда, когда IFS установлен на непробельные символы?
Когда я используюread
вместо этого сценария та же строка также подвергается разделению слов, как и ожидалось.
$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two three