do_command()
私のスクリプトには、コマンドを印刷して実行する機能があります。コマンドをbash文字列配列に入れてから、この関数を使用してprint_executeしたいと思います。しかし、if文でこれを試すと失敗します。スクリプトは次のとおりです。
#!/bin/bash
do_command () {
echo "$@";
$@;
}
comms=( "wget -O test http://speedtest.ftp.otenet.gr/files/test100k.db" # just a download test \
"/bin/bash -c 'if [ -f test ]; then mv test test.old; fi'" # replace previous test \
);
for comm in "${comms[@]}"; do do_command "$comm"; done
私は一重引用符+二重引用符のさまざまな組み合わせを試してみましたが、ifステートメントをそこに入れるかパラメータとして入れました/bin/bash
が、まだこれを行う方法を見つけることができませんでした。この特定の組み合わせを使用すると、最後の行の出力は次のようになります。
/bin/bash -c 'if [ -f test ]; then mv test test.old; fi'
[: -c: line 1: unexpected EOF while looking for matching `''
[: -c: line 2: syntax error: unexpected end of file
ただし、印刷された行をコピーしてプロンプトに貼り付けると、エラーなしで実行されます。
ファイル/配列からifステートメントを読み、スクリプトで実行する方法はありますか?
ベストアンサー1
その後、トークン(引用符なし)が、、、、、...である引数が/bin/bash -c 'if [ -f test ]; then mv test test.old; fi'
生成され、実行のためにBashに与えられたコマンドはです。不均衡な見積もりがあるため、構文エラーが発生します。 (残りのargsは、実行されたコマンドの位置引数に移動されます。)$@
/bin/bash
-c
'if
[
-c
'if
"$@"
また、スクリプトには1つのパラメータしかないため、引用符では機能しないため、すべて単一の文字列として保持されます。
望むより:変数に保存されたコマンドをどのように実行できますか?
これらのコマンドを保存するには、以下を使用して実行する必要がありますeval
。
execute() {
printf "executing {{ %s }}\n" "$1"
eval "$1"
}
cmds=("echo foo bar"
"if true; then echo yes; fi"
"foo=123; echo \"\$foo\""
'echo "$(date)"'
"echo \"what's \$foo now?\""
)
for c in "${cmds[@]}"; do
execute "$c"
done
複雑なコマンドを使用しているにもかかわらず、依然として一般的な参照地獄の問題が発生する可能性があります。
コマンドを関数に入れて、それを使用してset -x
何が起こるのかを印刷することを検討できますが、出力は異なります。