jak*_*b.g 1 shell debugging alias troubleshooting
我想创建一个可以处理参数 ( $1)的别名,如果没有提供参数,可以回退到默认值。例如,
$ alias foo='NUM=${1:-42}; echo $NUM'
Run Code Online (Sandbox Code Playgroud)
在没有参数的情况下调用它可以按我的意愿工作:
$ foo
42
Run Code Online (Sandbox Code Playgroud)
但是使用参数调用时,它会打印我的值和默认值:
$ foo 69
42 69
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样。应该如何正确操作?我怎样才能自己调试这种问题?
别名只是在另一轮 shell 语法解释之前的文本替换,它们不带参数,所以之后:
foo 69
Run Code Online (Sandbox Code Playgroud)
该foo文本被替换NUM=${1:-42}; echo $NUM,然后将壳解释结果文本:
NUM=${1:-42}; echo $NUM 69
Run Code Online (Sandbox Code Playgroud)
$1 还没有设置,所以 NUM=42; echo 42 69
对于在当前 shell 中解释并带有参数的内联脚本,请改用函数:
foo() {
NUM=${1-42}
printf '%s\n' "$NUM"
}
Run Code Online (Sandbox Code Playgroud)
在这里使用${1-42}代替${1:-42},就像用户调用 一样foo '',我假设他们希望$NUM被分配空字符串。