最初の引数のデフォルト値がコマンドラインの値である場合、2番目の引数をどのように渡しますか?

最初の引数のデフォルト値がコマンドラインの値である場合、2番目の引数をどのように渡しますか?
cdcl()          { vlog -source -lint +define+"${1:-DEBUG}" -sv "${2:-*.sv}"; }

上記は私の機能で、.bashrcファイルで定義しました。以下は私のコマンドラインです

% cdcl 'RANDOM' 'abc.sv'

これは私に>>を与えるvlog -source -lint +define+RANDOM -sv abc.sv

コマンドラインで最初のプレースホルダ値の提供をスキップし、2番目のプレースホルダのみを提供する方法はありますか?

答え1

関数が1つの引数でのみ呼び出されることを確認し、この場合を異なる方法で処理できます。

cdcl() {
  if (($# == 1)); then
    vlog -source -lint +define+DEBUG -sv "$1"
  else
    vlog -source -lint +define+"${1:-DEBUG}" -sv "${2:-*.sv}"
  fi
}

答え2

関数はコロン(例:"${1:-DEBUG}"and not)を使用したデフォルトの拡張機能を使用するため、"${1-DEBUG}"null値もデフォルト値の使用をトリガーします。""null値を使用または渡すことができる''ので、

cdcl "" abc.sv

関数を実行する必要があります。

vlog -source -lint +define+DEBUG -sv abc.sv

この機能を有効にすると、"${1-DEBUG}"値が設定されていない場合にのみデフォルト値がトリガされ、不可能な場合は$1$2が設定されていないか既に定義されている場合にのみデフォルト値がトリガされます。順番に行う必要があり、リストに「穴」があってはなりません。

このように空の文字列を渡すのは良い解決策ではなく、たとえば、適切なデフォルト値を使用getoptして同様の引数を受け入れるように関数内で使用することを決定することもできます。cdcl -d RANDOM -s abc.sv

答え3

あなたの質問を正しく理解したら、最初の引数をスクリプトに渡すのをスキップしてそれを使用しますが、RANDOM入力する必要はありません。パラメーターの順序を復元できます。

cdcl() {
  local f_pattern="${1:-*.sv}"
  echo "vlog -source -lint +define+${2:-DEBUG} -sv $f_pattern"
  # vlog -source -lint +define+"${2:-DEBUG}" -sv "$f_pattern"
}

echoここでは、使用するコマンドとパラメータを印刷するために使用します。自信があれば削除してくださいecho

関連情報