${#1} 的值是多少?

Pra*_*sad 9 shell

请解释以下用法${#1}

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 24

${#1}$1函数的第一个参数的长度(以字符数表示)。

所以(( ${#1} == 0 ))是测试第一个参数是否为空(或未设置,未设置的参数在展开时显示为空)的复杂方法。

要测试空参数,规范的方法是:

[ -z "$1" ]
Run Code Online (Sandbox Code Playgroud)

但在那里,更可能的目的是检查是否向函数提供了参数,在这种情况下,语法将是:

[ "$#" -eq 0 ]
Run Code Online (Sandbox Code Playgroud)

(或者(($# == 0))如果你想让你的脚本 ksh/bash/zsh 特定)。

然而,在这两种情况下,类似 Bourne 的 shell 都有捷径:

test=${1:--} # set test to $1, or "-" if $1 is empty or not provided
test=${1--}  # set test to $1, or "-" if $1 is not provided
Run Code Online (Sandbox Code Playgroud)

现在,如果目的是将它传递给cat或其他文本实用程序,以便-在没有提供参数时传递(意味着标准输入),那么您可能根本不需要任何这些。

代替:

getlable() {
  test=${1--}
  cat -- "$test"
}
Run Code Online (Sandbox Code Playgroud)

做就是了:

getlable() {
  cat -- "$@"
}
Run Code Online (Sandbox Code Playgroud)

函数的参数列表将按原样传递给cat。如果没有参数,cat将不接收任何参数(然后从 stdin 中读取,就好像它是单个-参数一样)。如果有一个或多个参数,它们都将按原样传递给cat.