Почему $ IFS по умолчанию расширяется до новой строки, когда «для слова в $ string» разделяется на пробелы? - PullRequest
0 голосов
/ 22 мая 2018

Когда я выполняю приведенный ниже код из командной строки:

(
    mystring="foo:bar baz rab"
    for word in $mystring; do
      echo "Word: $word"
    done
)

В результате я получаю:

Word: foo:bar
Word: baz
Word: rab

Это означает, что $IFS будет интерпретироваться как пробелперсонаж.Но затем я пытаюсь изменить это, выполнив следующие действия:

echo "foo:bar${IFS}baz${IFS}rab"

И напечатает:

foo:bar
baz
rab

Что теперь означает, что $IFS - это \n.Я бы ожидал "foo:bar baz rab"

Что является причиной этого несоответствия?

1 Ответ

0 голосов
/ 22 мая 2018

IFS содержит три символа по умолчанию: пробел (первый), табуляция (второй), символ новой строки (третий).

Это означает, что любой из этих трех символов может действовать какразделитель слов.$* использует только первое из этих трех для разделения слов.

Если вы хотите сгенерировать строку из массива, разделенного первым символом в IFS, рассмотрите:

# Combine array elements with the first character in IFS using ${array[*]}
array=( foo:bar baz rab )
echo "${array[*]}"
...