Bash - переменная, содержащая несколько аргументов с кавычками
Я генерирую переменную bash, содержащую все мои аргументы, и эти аргументы содержат пробелы.
Когда я запускаю команду с этими аргументами - например. ls $args - кавычки неправильно интерпретируются.
Вот пример - также создание и удаление необходимых файлов.
#!/bin/bash
f1="file n1"
f2="file n2"
# create files
touch "$f1" "$f2"
# concatenate arguments
args="\"$f1\" \"$f2\""
# Print arguments, then launch 'ls' command
echo "arguments :" $args
ls $args
# delete files
rm "$f1" "$f2"
С этим у меня есть некоторые ошибки "нет такого файла" для "файла, n1" , "file и n2"
Ответы
Ответ 1
Вы можете использовать array для аргументов, что-то вроде этого:
args=( "$f1" "$f2" )
ls "${args[@]}"
(Проблема, с которой вы сейчас сталкиваетесь, заключается в том, что после интерполяции не было различий между пространствами внутри и между именами.)
Ответ 2
Используйте eval
, это сначала оценит любые расширения и цитирование, а затем выполнит результирующую строку, как если бы она была введена в оболочку.
args="'$f1' '$f2'"
eval ls $args
eval будет выполнять ls 'file n1' 'file n2'
Была очень похожая проблема, пытаясь передать аргументы в переменных, полученных из /etc/default/
в start_stop_daemon
в сценариях инициализации.
Ответ 3
Это, вероятно, самый худший ответ, но вы можете изменить IFS. Это "внутренний разделитель полей" и по умолчанию равен пробелу + tab + новая строка.
#!/bin/sh
IFS=,
MAR="-n,my file"
cat $MAR
script выше будет cat
. Первый аргумент будет -n
(пронумерованные строки), а второй аргумент будет my file
.
Ответ 4
Используйте set
, чтобы установить переменные в качестве позиционных параметров; то цитирование будет сохранено, если вы ссылаетесь на них через "$ @" или "$ 1", "$ 2" и т.д. Обязательно используйте двойные кавычки, которые содержат имена переменных.
set -- "$f1" "$f2"
touch "[email protected]"
ls "[email protected]"
rm "[email protected]"
Ответ 5
Вот мой рецепт concat цитированных аргументов - в основном используется для чтения script. Но также удобно комментировать некоторые аргументы легко:
PARAM1="a param with white spaces"
PARAM2="some other funny param"
PARAM3="third spaced param"
#...
PARAMS=$PARAM1
PARAMS+='" "'
PARAMS+=$PARAM2
PARAMS+='" "'
PARAMS+=$PARAM3
#...
eval command '"'$PARAMS'"'