bash if文で文字列を評価します。

bash if文で文字列を評価します。

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何が起こるのかを印刷することを検討できますが、出力は異なります。

おすすめ記事