初心者の質問です。誰かが助けてくれることを願っています。
エラーチェック機能が組み込まれたbashスクリプトに関数を作成しています。行番号を含むエラーメッセージを返したいです。
Error, parameter not provided, please check line 57
コマンドが見つかりましcaller
たが、これが返されます。
57 filename.sh
数値だけを抽出するために正規表現を使用する方法を考えてみましたが、これは過度に見え、呼び出し元のコマンド自体には行番号だけを返すオプションがないようです。
bashで私が欲しいものだけを返す方法はありますか?
呼び出しが行50、500、または5000にある可能性があるため、左側のx文字からのインポートは機能しません。
答え1
caller
inディレクティブは、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