パラメータ置換とエラーメッセージ:行番号インジケータを抑制します。

パラメータ置換とエラーメッセージ:行番号インジケータを抑制します。

私のサンプルファイルは次のとおりです。

!/bin/bash
# argument-one

# Is first argument missing?

# First method
[[ "$1" == "" ]] && echo "Usage: $(basename $0) filename"; exit 1

# Second method
# filename=${1?"Usage: $(basename $0) filename"}

上記のスクリプトでは「きれいな」メッセージを受け取りました。

Usage: argument-one filename

引数なしで上記のスクリプトを実行すると、きちんと終了します。

ただし、7行をコメントアウトして10行のコメントを削除すると、プログラムは次のエラーメッセージで終了します。

./argument-one: line 10: 5: Usage: argument-one filename

このメッセージは、プログラムを終了させるプログラムに問題があることを示します。実際は使用問題である引数のない呼び出しでした。

ただし、10行目がより簡潔で、可能であれば変数も割り当てられるので、より良いです。

私の質問は、「メッセージ部分のみを保持し、./argument-one: line 10: 5:メッセージ部分を使用してフィルタリングまたは無効にする方法は何ですか?」です。

ありがとうございます。

答え1

特殊変数を使用して、$#特定のコマンドの引数の数をテストできます。

usage() {
  echo "Usage: $0 arg"
  exit 1
}

if [[ "$#" -eq 0 ]]; then
  usage
fi

echo "called with $1"
exit 0

実行されると、スクリプトは以下を提供します。

$ ./foo.sh
Usage: ./foo.sh arg

$ ./foo.sh bar
called with bar

答え2

パラメータ置換を使用して割り当てを実行できますが、エラーをキャッチして変更します。

filename=$((printf "${1:?}") 2>/dev/null || { echo "Usage $(basename $0) filename"; exit 1; })

(少ない文字数で使用printfできますが、echo追加のフォークが必要です)。 printf/echo は独自のサブシェルにあり、実際には /dev/null にあるサブシェルの標準エラーにパイプされます。

または、パラメータ置換を使用して割り当てられた変数が設定されていて空でないことをテストし、使用文字列を印刷して手動で終了することもできます(一度に1行)。

[ -z "${filename:=$1}" ] && { echo "Usage $(basename $0) filename"; exit 1; }

私は文字数が少なく、より明確で直接的で、再作業が少なくて済むので、2番目のオプションを選択する傾向があります。 1つの欠点は、ファイル名がすでに環境に設定されている場合、$ 1が使用されないことです。このような心配になったら、unset filenameあらかじめ準備してみてください。

関連情報