Если вы согласны с тем, что весь пакет (переменная/арифметика/расширение команд, подстановка и т. д. )поверх обработки кавычек, это подойдет:
echo '"a b" "x y"' >a.txt
eval "set -- $(<a.txt)"
for b do
printf 'b: %s\n' "$b"
done
b: a b
b: x y
Измените $(<a.txt)
на $(cat a.txt)
, если вы хотите, чтобы он работал в обычной оболочке, а не только вbash
(или других расширенных оболочках, таких как zsh
илиksh
). Вы можете использовать это только в том случае, если уверены, что можете контролировать содержимое a.txt
, в противном случае будет тривиально использовать ваш скрипт с помощью разделения с помощью ;
, расширения команды и т. д.
Однако, если вы просто хотите передать эти аргументы команде, вы можете использовать xargs
, которая будет просто обрабатывать кавычки, не выполняя никаких расширений.:
xargs <a.txt printf 'b: %s\n'
Но xargs
будет работать только с внешними командами, а не с функциями оболочки, будет игнорировать обратную косую черту внутри двойных кавычек, как и внутри одинарных кавычек, и не сможет анализировать многострочные строки.
Если с этими последними ограничениями все в порядке, вы все равно можете использовать xargs
в качестве анализатора котировок через оболочку или массив:
mapfile -t args < <(xargs <a.txt printf '%s\n')
for b in "${args[@]}"; do
printf 'b: %s\n' "$b"
done
Вы установили неправильную раскладку клавиатуры. У британцев двойная кавычка над цифрой 2. У США она рядом с клавишей Enter
.