Вы не использовать eval
! Он имеет большой риск внедрения произвольного выполнения кода.
BashFAQ-50 - Я пытаюсь поместить команду в переменную, но в сложных случаях всегда не получается.
Поместите его в массив и заключите все слова в двойные кавычки, "${arr[@]}"
чтобы не допустить IFS
разделения слов из-за разделения слов .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
и посмотреть содержимое массива внутри. Это declare -p
позволяет вам видеть содержимое массива внутри с каждым параметром команды в отдельных индексах. Если один из таких аргументов содержит пробелы, цитирование внутри при добавлении в массив предотвратит его разделение из-за разделения слов.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
и выполните команды как
"${cmdArgs[@]}"
23:15:18
(или) полностью использовать bash
функцию для запуска команды,
cmd() {
date '+%H:%M:%S'
}
и вызовите функцию просто
cmd
POSIX sh
не имеет массивов, поэтому самое близкое, что вы можете сделать, - это создать список элементов в позиционных параметрах. Вот sh
способ POSIX для запуска почтовой программы
# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
subject=$1
shift
first=1
for addr; do
if [ "$first" = 1 ]; then set --; first=0; fi
set -- "$@" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "$@"
}
Обратите внимание, что этот подход может обрабатывать только простые команды без перенаправлений. Он не может обрабатывать перенаправления, конвейеры, циклы for / while, операторы if и т. Д.
Другой распространенный вариант использования - запуск curl
с несколькими полями заголовка и полезной нагрузкой. Вы всегда можете определить аргументы, как показано ниже, и вызвать curl
содержимое расширенного массива
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Другой пример,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
теперь, когда переменные определены, используйте массив для хранения аргументов вашей команды
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
а теперь сделайте правильное цитируемое расширение
curl "${curlCMD[@]}"