Я читаю пару книг по bash-скриптингу и пытаюсь понять правильную цитату и использование IFS
. Возможно, кто-то может помочь мне с небольшим примером, включающим имена файлов с кавычками. Делая это из командной строки, это работает для правильной распечатки имен файлов, даже если они содержат пробелы:
set - *
for i in "$@"; do echo $i; done
Это не работает, так как оно разбивается на пробелы:
set - `find . -name "*"`
for i in "$@"; do echo $i; done
И не делает:
IFS=$'\0' set - `find . -name "*" -print0`
for i in "$@"; do echo $i; done
И при этом комбинация, которая использует IFS=$'\n'
и -print
. Почему все это терпит неудачу?
Следующее также не выполняется, но в этом случае оно выдает ошибку («bash: синтаксическая ошибка рядом с неожиданным токеном« do »»). Зачем?
IFS=$'\n' for i in `find . -name "*" -type f`; do echo $i; done
но это работает (обратите внимание на «;»):
IFS=$'\n'; for i in `find . -name "*" -type f`; do echo $i; done
и это терпит неудачу, потому что имена файлов вообще не разделяются (цикл for
только один раз):
IFS=''; for i in `find . -name "*" -type f -print0`; do echo -e "$i\n"; done
Итак, еще раз, почему первые и третьи там терпят неудачу?
Наконец, я прав, полагая, что при установке IFS
''
совпадает с $'\0'
? (Я попробовал оба в этом непосредственно предыдущем примере.) Если так, то почему мне, очевидно, нужен $'\n'
а не просто \n
?
* Bash - это версия 4.3.42(1) в Ubuntu Gnome 16.04.