一部のタスクを自動化しようとしていますが、スクリプトに引数として渡された値をエスケープする問題に直面しています。
myScript.sh
#!/bin/bash
loadPatch -name $1
$1
最初のパラメータは、「p12.9.5-bug34」などの値を持つことができます。
次のように実行
myScript p12.9.5-bug34
結果がない成功したかどうかの出力を確認しましたが、echo $?
必要なアクションは発生しませんでした。
$1
スクリプトのテストをこの実際の値に置き換えて、期待どおりに機能します。loadPatch
受信したパラメータを確認するために印刷ステートメントを配置することはできません。
したがって、ここにいくつかのエスケープの問題があると仮定し、パラメータを使用する前にパラメータをエスケープするために使用できる関数/ユーティリティがあるかどうかを知る必要があります。
他のエラーが見つかったら教えてください。
答え1
他の人がこのタイトルを検索できるので、この質問に答えてください。
- zshのみ:
print -r -- ${(q)var} ${(qq)var} ${(qqq)var} ${(qqqq)var}
さまざまな種類の参照に使用されます。 - ksh93、zsh または bash:
printf %q "$var"
BusyBox(および上記のすべての項目)
vars を使用すると、ash、bash、ksh の違いがなくなります。
q1="'" q2="'\''" printf '%s\n' "'${var//$q1/$q2}'"
ダッシュと以前のシェル(${var//pat/str}が見つからないシェル)にはありません。
一番携帯していいですか?
printf "'%s'\n" "$(printf '%s' "$var" | sed "s/'/'\\\\''/g")" Or printf '%s\n' "$var" | sed "s/'/'\\\\''/g; 1s/^/'/; \$s/$/'/"
改善を歓迎します!
答え2
ファイル名の特殊文字が問題にならないことに同意します。
時々、スクリプトが私が期待したフォルダで実行されていないことがわかりました。 "loadPatch -name"を "echo"に置き換えると、$ 1が予想される値であることを確認できます。これが期待している場合は、次の行を追加して、現在のディレクトリが期待したものと同じであることを確認してください。
ls -l $1
pwd