使用 `$1` 和后备默认值的别名打印参数和后备值

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)

我不明白为什么会这样。应该如何正确操作?我怎样才能自己调试这种问题?

Sté*_*las 5

别名只是在另一轮 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被分配空字符串。