请解释以下用法${#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
.