Баш-массивы, по сути, массивы. Это не строки, которые анализируются по требованию. Когда вы создадите массив, элементы будут такими, какие они есть, и они не изменятся задним числом.
Однако ничто в вашем примере не создает массив. Если вы хотите создать массив из аргумента 2, вам нужно будет использовать другой синтаксис:
strings_to_find=($2)
Хотя ваш strings_to_find
не является массив, Баш позволяет обращаться к нему, как если бы это был массив один элемент. Таким образом, ${#strings_to_find[@]}
всегда будет одним, независимо от содержимого strings_to_find
. Кроме того, ваша линия:
for string in ${strings_to_find[@]}
на самом деле не отличается от
for string in $strings_to_find
Так что расширение не котируется, то это будет слово-сплит, используя текущее значение IFS
.
Если вы используете массив, большую часть времени вы не хотите писать for string in ${strings_to_find[@]}
, потому что это только что собирает элементы массива в строку, а затем снова разделяет их слово, что теряет исходную структуру массива. Как правило, вы избежите софистика, используя двойные кавычки:
strings_to_find=(...)
for string in "${strings_to_find[@]}"
Что касается вашего второго вопроса, то значение IFS
не изменяет грамматику оболочки. Независимо от значения IFS
слова в команде разделяются пробелами без кавычек. После того, как строка анализируется, оболочка выполняет параметр и другие расширения для каждого слова. Как упоминалось выше, если расширение не цитируется, расширенный текст затем разбивается на строки, используя значение IFS
.
Если слово не содержит никаких расширений, словосочетание не выполняется. И даже если слово содержит разложения, слово-расщепление выполняется только на самом разложении.Так что, если вы пишете:
IFS=:
my_function a:b:c
my_function
будет вызвана с одним аргументом; не происходит расширения, поэтому расщепление слов не происходит. Тем не менее, если вы используете , некорректный внутри функции, расширение $1
будет разбито на слово (если оно разворачивается в контексте, в котором происходит разбиение слов).
С другой стороны,
IFS=:
args=a:b:c
my_function $args
заставит my_function
быть вызвана с тремя аргументами.
И, наконец,
IFS=:
args=c
my_function a:b:$args
точно так же, как и при первом вызове, потому что нет в разложении нет :
.
Эта страница 'man' вы нашли эту цитату? Кажется, я не могу найти правильную справочную страницу для этого. – Sother
@Sother: 'Ручная страница bash (1) строка 1758'. В случае возникновения проблем выполните поиск по шаблону в 'bash'. – sjsam
Эта цитата полезна (и я бы подчеркнул «результаты других расширений»), но в последнем абзаце этого раздела («разбиение слов») есть четкое утверждение: «Обратите внимание, что если разложение не происходит, расщепление не происходит выполнено." – rici