Аннотация :Безопасное решение "расширения имени файла" (для моего -script2):
IFS=' ' read -a arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo
Наивное решение с использованием переменной un -в кавычках для ее разделения на слова (на основе значения IFS )также подвергает содержимое расширению имени файла *, ? и [ (не менее ).
Эта конкретная строка работает правильно:
$ set "a string with spaces"
$ printf '<%s>--' $1; echo
<a>--<string>--<with>--<spaces>--
Но эта строка явно не работает:
$ set "a bad * string with spaces"
$ printf '<%s>--' $1; echo
<a>--<bad>--<file1>--<file2>--<string>--<with>--<spaces>--
Звездочка расширилась на файлы в PWD.
Одним из способов (, который очень часто упускают из виду, но который также очень полезен )для получения раскрытия переменной без «расширения пути», является использование здесь -документа.
IFS=' ' read -ra arr <<-_EOF_
$1
_EOF_
printf '<%s>--' "${arr[@]}" ; echo;
Как описано в руководстве:
If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, … …
Обратите внимание, что "расширение пути" не применяется .
Двоюродным братом документа здесь -является строка здесь -, которая делает код короче:
IFS=' ' read -ra arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo;
Просто помните, что (внутри двойных кавычек )символы \, $ и `являются особыми.
Из руководства:
the character sequence \ is ignored, and \ must be used to quote the characters \, $, and `
В Tcl фигурные скобки аналогичны одинарным кавычкам оболочки. :Подстановка переменных не выполняется. Вам нужно изменить
var1={^$line}
# to
var1="^$line"
и аналогично для 2-го нед.
Однако я не понимаю, почему вы используете 2 awk в конвейере :похоже, вы хотите найти IP-адреса из policy-unique_single_line-src-dst-ip.txt
, которые появляются в столбце 1 канала -с разделителямиsort-address-name-ip.txt
:
set ips [exec cut {-d|} -f1 sort-address-name-ip.txt | grep -Fxf policy-unique_single_line-src-dst-ip.txt]