一度だけ印刷するにはどうすればいいですか

一度だけ印刷するにはどうすればいいですか
#!/bin/bash

usage ()

 {

echo "run with 1st argument

       -mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)" 

echo "2nd argument 

      -struct or ifs or cases or asgn or default(struct) or all(all the 

       conditions)"

echo "3rd argument 

    -on (waveform) or off (no wave) or default(off)'
echo "run 

      - should take mux2 struct off as arguments"
}

if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then

if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then

  if [ "$3" == "on" ]; then

  iverilog -o mux "$1".v  "$1"TB.v -D "$2" 

  vvp mux

  gtkwave T.vcd

  elif [ "$3" == "off" -o "$3" == "" ]; then

  iverilog -o mux "$1".v  "$1"TB.v -D "$2" 

  vvp mux

  else

  usage

  fi

 elif [ "$2" == "all" ]; then

 $0 $1 struct $3

 $0 $1 ifs $3

 $0 $1 cases $3

 $0 $1 asgn $3

 elif [ "$2" =="" ]; then

 $0 $2 struct $3

 else

 usage

 fi

elif [ "$1" == "all" ]; then

$0 mux2 $2 $3

$0 mux4 $2 $3

$0 mux8 $2 $3

elif [ "$1" == "" ]; then

$0 mux2 stuct

else

usage

fi

次の引数を使用してスクリプトを実行すると、使用方法が複数回表示されます。

run all jhjjk
run all all kjkj

一度だけ印刷するにはどうすればいいでしょうか?

答え1

スクリプト内のパラメータとオプションを解析するには、取得あなたが探している機能を提供します。

ただし、スクリプトを実行するには、exit次の行の後に追加します。

echo "run 

      - should take mux2 struct off as arguments"
exit
}

答え2

の後にタイプミスがありdefault(off)'の代わりに とあります"。それ以外は問題なく動作します。コマンドのほとんどをコメントアウトし、echoデバッグ用に を入れました。最小限の例を作成すると便利な場合がよくあります。これにより、all最初の引数として が問題なく動作しました。以下は、修正を加えた元のスクリプトです。"インデントが改善されているため、デバッグがはるかに簡単になります。

#!/bin/bash

usage ()
 {
echo "run with 1st argument
  -mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)" 
echo "2nd argument 
  -struct or ifs or cases or asgn or default(struct) or all(all the conditions)"
echo "3rd argument
  -on (waveform) or off (no wave) or default(off)"
echo "run 
  - should take mux2 struct off as arguments"
}

if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
  if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
    if [ "$3" == "on" ]; then
      iverilog -o mux "$1".v  "$1"TB.v -D "$2" 
      vvp mux
      gtkwave T.vcd
    elif [ "$3" == "off" -o "$3" == "" ]; then
      iverilog -o mux "$1".v  "$1"TB.v -D "$2" 
      vvp mux
    else
      usage
    fi
  elif [ "$2" == "all" ]; then
    $0 $1 struct $3
    $0 $1 ifs $3
    $0 $1 cases $3
    $0 $1 asgn $3
  elif [ "$2" =="" ]; then
    $0 $2 struct $3
  else
    usage
  fi
elif [ "$1" == "all" ]; then
  $0 mux2 $2 $3
  $0 mux4 $2 $3
  $0 mux8 $2 $3
elif [ "$1" == "" ]; then
  $0 mux2 stuct
else
  usage
fi

以下は私が使用した、問題なく動作するバージョンです。

#!/bin/bash

usage ()
 {
echo "run with 1st argument
  -mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)" 
echo "2nd argument 
  -struct or ifs or cases or asgn or default(struct) or all(all the conditions)"
echo "3rd argument
  -on (waveform) or off (no wave) or default(off)"
echo "run 
  - should take mux2 struct off as arguments"
}

if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
  if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
    if [ "$3" == "on" ]; then
#      iverilog -o mux "$1".v  "$1"TB.v -D "$2" 
#      vvp mux
#      gtkwave T.vcd
echo 1
    elif [ "$3" == "off" -o "$3" == "" ]; then
#      iverilog -o mux "$1".v  "$1"TB.v -D "$2" 
#      vvp mux
echo 2
    else
      usage
    fi
  elif [ "$2" == "all" ]; then
#    $0 $1 struct $3
#    $0 $1 ifs $3
#    $0 $1 cases $3
#    $0 $1 asgn $3
echo 3
  elif [ "$2" =="" ]; then
#    $0 $2 struct $3
echo 4
  else
    usage
  fi
elif [ "$1" == "all" ]; then
#  $0 mux2 $2 $3
#  $0 mux4 $2 $3
#  $0 mux8 $2 $3
echo 5
elif [ "$1" == "" ]; then
#  $0 mux2 stuct
echo 6
else
  usage
fi

run all jhjjkrun all all kjkj両方とも期待どおりに返されます5


編集

再帰地獄から抜け出す最も簡単な方法は

$0 mux2 $2 $3
$0 mux4 $2 $3
$0 mux8 $2 $3

各コマンドのグループをサブルーチンにすることです。次に、分岐構造を使用してこれらのサブルーチンを呼び出すか、使用方法が意味をなさない場合は使用方法を出力します。私の意見では、再帰はこのタスクにはあまりにも面倒すぎます。

答え3

私は関数を使うことを好みますが、再帰的なソリューションを使用しなければならない場合:

#!/bin/bash  
usage()
{
         echo Usage without recursive check
         if [ "${USAGE_PRINTED}" = "notyet" ]; then
                 echo Usage xxxx
                 export USAGE_PRINTED="Yes the operator already understands it"
         else
                 echo "ok"

         fi
}

if [ -z "${USAGE_PRINTED}" ]; then
         export USAGE_PRINTED="notyet"
fi

if [ $# -gt 1 ]; then
         echo Parameters $*
         usage
         shift
         $0 $*
else
         echo Parameters $*
         usage
fi

このプログラムをパラメータ 1 2 3 4 で実行した場合の出力:

Parameters 1 2 3 4
Usage without recursive check
Usage xxxx
Parameters 2 3 4
Usage without recursive check
ok
Parameters 3 4
Usage without recursive check
ok
Parameters 4
Usage without recursive check
ok

「再帰チェックなしの使用」の行は問題を示しています。パラメータのシフトは、数ステップ後に再帰呼び出しを終了するために行われます。エコー「ok」は削除できます。

関連情報