![如何使用调用者命令在 bash 脚本中仅返回行号?](https://linux22.com/image/215849/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%B0%83%E7%94%A8%E8%80%85%E5%91%BD%E4%BB%A4%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BB%85%E8%BF%94%E5%9B%9E%E8%A1%8C%E5%8F%B7%EF%BC%9F.png)
新手问题,希望有人能帮忙。
我正在 bash 脚本中编写一个内置错误检查的函数。我想返回一条包含行号的错误消息,例如
Error, parameter not provided, please check line 57
我找到了该caller
命令,但这会返回
57 filename.sh
我曾想过使用正则表达式仅提取数字,但这似乎有点矫枉过正,并且调用者命令本身似乎没有选项仅返回行号。
bash 有没有办法只返回我想要的内容?
请注意,调用可能位于第 50、500 或 5000 行,因此从左 x 字符获取将不起作用。
答案1
caller
中的指令返回bash
两个空格分隔的值:调用者的行号和文件名。例如,
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