что означает» ЕСЛИ= » или » ЕСЛИ=»?

#bash #shell #sh #ifs

Вопрос:

IFS используется в качестве символов разделения слов, но что именно происходит, когда IFS является нулевым/пустым. Например , рассмотрим входной файл abc.txt с содержанием

 first line
second line
 

теперь , если я побегу

 IFS='' # or IFS= or assume IFS is null
for word in $(cat abc.txt)
do
 echo ${word}
done
 

Тогда выход будет

 first line
second line
 

обратите внимание , что в выводе были показаны две строки.
Теперь вопрос в том , почему появляются две строки вместо одной?
Если в качестве символа разделения слов не используется «ЕСЛИ», то, я думаю, вывод должен быть

 first line second line
 

Разве вывод не должен быть только в одной строке , так как n в данный момент также не является «ЕСЛИ»?

Комментарии:

1. Правильно, что он не разделяется на новой строке, но почему он должен просто отбрасывать новую строку? Это часть твоей word жизни .

2. <введите любимую поисковую систему здесь><введите любимую поисковую систему здесь> это ваш друг, воспользуйтесь им. Ваши сообщения о поиске, такие как: unix.stackexchange.com/questions/184863/…

3. Вы предполагаете, что тело цикла выполняется дважды: это не так.

Ответ №1:

У вас есть значение «ЕСЛИ», но оно равно пустому значению.

Предполагая, что вы используете оболочку, совместимую с POSIX, если IFS пуста, согласно стандарту IEEE Std 1003.1, 2004 (незначительное обновление до POSIX.1-2001), раздел 2.6.5 Разделение полей гласит::

Если значение IFS равно null, разделение полей не должно выполняться.

Таким образом, вы на самом деле не повторяете строки, а просто печатаете все за один раз. Если это уместно, пожалуйста, обратите внимание, что отмена IFS будет иметь совсем другое поведение (заставляя его вести себя так, как если бы он был заполнен по умолчанию, пробелом/вкладкой/новой строкой).

Ответ №2:

Все содержимое abc.txt назначается word на первой итерации цикла, включая вводы строк в конце каждой строки. Эти строки являются частью аргумента to echo , который записывает их в стандартный вывод.

Ваш цикл выполняется ровно один раз, с одним вызовом echo записи двух строк, считанных из файла.

(Добавьте declare -p word в тело цикла, чтобы увидеть полное значение word в одной и единственной итерации.)