呼び出し元コマンドを使用してbashスクリプトから行番号のみを返す方法は?

呼び出し元コマンドを使用してbashスクリプトから行番号のみを返す方法は?

初心者の質問です。誰かが助けてくれることを願っています。

エラーチェック機能が組み込まれたbashスクリプトに関数を作成しています。行番号を含むエラーメッセージを返したいです。

Error, parameter not provided, please check line 57

コマンドが見つかりましcallerたが、これが返されます。

57 filename.sh

数値だけを抽出するために正規表現を使用する方法を考えてみましたが、これは過度に見え、呼び出し元のコマンド自体には行番号だけを返すオプションがないようです。

bashで私が欲しいものだけを返す方法はありますか?

呼び出しが行50、500、または5000にある可能性があるため、左側のx文字からのインポートは機能しません。

答え1

callerinディレクティブは、bashスペースで区切られた2つの値、つまり呼び出し元の行番号とファイル名を返します。例えば、

57 filename.sh

ここでやるべきことは、最初のパラメータを選択することだけです。awkこれは非常に簡単に実行できます。

caller | awk '{ print $1 }'

結果

57

答え2

テキストを表示し、help callerテキストの最初の単語である行番号を返します。

bash readコマンドを使用して単語に分割できます。

read lineno rest <<< "$(caller)"

正規表現を使用すると、それほど面倒ではありません。

[[ $(caller) =~ ^([[:digit:]]+) ]] && lineno=${BASH_REMATCH[1]}

#!/bin/bash
                                          # line 2
a() { b; }                                # line 3
b() { c; }                                # line 4
c() {                                     # line 5
    caller                                # line 6
    out=$(caller); echo "$out"            # line 7
    i=0                                   # line 8
    while true; do                        # line 9
        c=$(caller $i)                    # line 10
        [[ -z "$c" ]] && break            # line 11
        printf '%d = %s\n' $((i++)) "$c"  # line 12
    done                                  # line 13
}                                         # line 14
a                                         # line 15

出力

4 caller.sh
4 caller.sh
0 = 4 b caller.sh
1 = 3 a caller.sh
2 = 15 main caller.sh

関連情報