Ви НЕ використовувати eval
! Це становить великий ризик введення довільного виконання коду.
BashFAQ-50 - Я намагаюся ввести команду в змінну, але складні випадки завжди не вдається.
Помістіть його в масив і розгорніть всі слова подвійними лапками, "${arr[@]}"
щоб не дозволяти IFS
розділяти слова за рахунок Розбиття слів .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
і побачити вміст масиву всередині. declare -p
Дозволяє побачити вміст всередині масиву з кожним параметром команди в окремих індексів. Якщо один такий аргумент містить пробіли, цитування всередині під час додавання до масиву запобігає розбиттю через Word-Splitting.
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
не має масивів, тому найближчим до вас можна підійти, щоб скласти список елементів у позиційних параметрах. Ось POSIX sh
спосіб запуску поштової програми
# 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" "$@"
}
Зауважте, що цей підхід може обробляти лише прості команди без перенаправлення. Він не може обробляти перенаправлення, конвеєри, цикли для / while, якщо оператори тощо
Інший поширений випадок використання - це при запуску 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[@]}"