使用しないでくださいeval
!これには、任意のコード実行が導入される大きなリスクがあります。
BashFAQ-50-コマンドを変数に入れようとしていますが、複雑なケースは常に失敗します。
それを配列に入れ、単語の分割によって単語が分割さ"${arr[@]}"
れないように、すべての単語を二重引用符で展開IFS
します。
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
内部の配列の内容を確認してください。をdeclare -p
使用すると、内部の配列の内容を、各コマンドパラメータを個別のインデックスで確認できます。そのような引数の1つにスペースが含まれている場合、配列に追加するときに内部で引用すると、ワード分割により分割されなくなります。
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[@]}"