如何使用调用者命令在 bash 脚本中仅返回行号?

如何使用调用者命令在 bash 脚本中仅返回行号?

新手问题,希望有人能帮忙。

我正在 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

相关内容