3

前のコマンドの終了ステータスをチェックする機能があり、0でない場合は複数のコマンドを実行する必要があります(成功)

revert()
{
if [ $? -ne 0 ]
then
  echo $#
  for c in $@
  do
    Execute command contained in passed string
  done
  echo "Operation failed. Reverting..."
  exit 1
fi
}

この関数を呼び出そうとすると、次の出力が得られます。

revert "ls" "ls -la"
2
ls ls -la
auten.py  canReach.sh  chpass.sh  newUser.sh  popo  secdir.sh
auten.py  canReach.sh  chpass.sh  newUser.sh  popo  secdir.sh
No command '-la' found, did you mean:
 Command 'tla' from package 'tla' (universe)
-la: command not found

明らかにスペースが問題であり、このページでいくつかの解決策を試しましたが、得られたのは同じ出力と1つの巨大な頭痛だけです。
したがって、応答する前に、私の関数を試して、目的の出力が得られるかどうかを確認してください。ありがとうございました。

4

1 に答える 1

3

引用符で使用"$@"し、 でコマンドを実行しeval "$c"ます。

revert()
{
    (( $? == 0 )) && return 0

    for c in "$@"
    do
        eval "$c"
    done

    echo "Operation failed. Reverting..." >&2
    exit 1
}

x && y「if x then y」と読むことができます。これは、一般的なスクリプトの省略形です。その最初の行は次と同等です。

if (( $? == 0 )); then return 0; fi
于 2013-03-14T16:54:54.150 に答える