/bin/shでShiftを使用する方法は?変身:そんなに変身できない

/bin/shでShiftを使用する方法は?変身:そんなに変身できない

私はスクリプトでshiftshell()ステートメントを使用する方法を理解しています。shただし、shift: can't shift that many 部分的にスクリプトを使用することはshift次のとおりです。

#!/bin/sh
.
.
.

test_sample(){
 while :; do
  case "${1-}" in 
  .
  .

  a)
   shift
     case "${1-}" in
     cmd1)
      echo "Test"
     cmd2)
      echo "Test 2"
     .
     .
     esac ;;

  b)
   shift
     case "${1-}" in
     cmd3)
      echo "Test 3"
     cmd4)
      echo "Test 4"
     .
     .
     esac ;;
   
  esac
  shift
done

return 0      
}

test_sample "$@"

スクリプトは、コマンドライン引数を使用してコマンドラインから呼び出されます。予想される動作は./test_sample.sh a cmd2「テスト2」出力を提供する必要があります。

誰でもこのエラーを解決する方法を教えてもらえますか?

よろしくお願いします!

PS:ここに欠けている情報があれば教えてください。

答え1

問題は、終了しないループがあり、代わりにshift変換する引数がなくなったときに使用しようとしていることです。

修正されたコード:

#!/bin/sh

main () {
        while [ "$#" -ne 0 ]; do
                case $1 in
                        a)
                                case $2 in
                                        cmd1) echo 'Test 1' ;;
                                        cmd2) echo 'Test 2' ;;
                                        *) echo 'error a' >&2; exit 1
                                esac ;;
                        b)
                                case $2 in
                                        cmd3) echo 'Test 3' ;;
                                        cmd4) echo 'Test 4' ;;
                                        *) echo 'error b' >&2; exit 1
                                esac ;;

                        *) echo 'error' >&2; exit 1
                esac

                shift 2
        done
}

main "$@"

これで、外部ループは残りのパラメータがあるかどうかをテストし、そうでない場合は終了します。

shiftまた、ループの終わりで2つのパラメータのうち1つのみを実行し、それ以降のパラメータを検出する$1ためにa使用します。b$2

次のコードは、正しいオプションに解析するために上記の内容を変更しますgetopts。これでa合計が変わるので、bそれぞれオプション引数を持つ-asums が必要です。-b

$ ./script -a cmd1 -bcmd3
Test 1
Test 3
#!/bin/sh

main () {
        OPTIND=1

        while getopts a:b: opt; do
                case $opt in
                        a)
                                case $OPTARG in
                                        cmd1) echo 'Test 1' ;;
                                        cmd2) echo 'Test 2' ;;
                                        *) echo 'error a' >&2; exit 1
                                esac ;;
                        b)
                                case $OPTARG in
                                        cmd3) echo 'Test 3' ;;
                                        cmd4) echo 'Test 4' ;;
                                        *) echo 'error b' >&2; exit 1
                                esac ;;

                        *) echo 'error' >&2; exit 1
                esac
        done
}

main "$@"

関連情報