if
如何在、while
或语句的条件上下文中正确使用测试参数的自定义方法,例如,字符串是否是单词或版本号until
?
特别是(双)大括号似乎在测试一侧的方法有问题,例如-gt
.
我可以只调用一个方法吗?如果是,这样做的背景要求是什么?那么(双)括号内/外以及不同的语句中if
,while
以及until
- 它们如何对没有命令替换的调用函数做出反应?
如果我不使用命令替换来调用不同的测试方法,我仍然可以通过布尔运算符连接它们吗?
对于它们的连接,是否存在必须使用括号或双括号的用例?
什么时候需要命令扩展?我有时需要算术扩展来调用函数吗?
答案1
您希望您的函数像所有其他命令(包括该[
命令)一样通过退出状态返回成功/失败 true/false,方法是使用return
带有 0 作为 true/success 参数的内置函数以及 false/failure 的其他任何参数,或者仅返回该函数运行的最后一个命令的退出:
isnewer() {
[ "$1" -nt "$2" ]
# here returns with the status of the [ command
}
isvowel() {
case $1 in
([aeiouAEIOU]) true;; # or return 0
(*) false;; # or return 1
esac
}
该命令返回复合命令的退出状态case
,该命令本身返回其中执行的最后一个命令(因此此处的命令true
或false
命令的退出状态)。
然后在您的if
/while
语句中,您调用这些函数,而不是[
命令:
if isnewer /etc/passwd /etc/shadow; then
echo passwd newer than shadow
fi
if isvowel "$x" || isvowel "$y"; then...
至于您(我不清楚)对双大括号或双括号的引用, while[
只是一个普通命令(该test
命令的另一个名称),Korn shell 和一些衍生产品包括bash
:
- 一个
(( arithmetic expression ))
构造,它计算算术表达式(遵循类似于 C 语言的语法,并且在 shell 之间有所不同),如果结果数字不是 0,则返回 true/成功(像往常一样通过 0 退出状态)。该算术表达式语法确实有一些类似于 C 语言的比较和布尔运算符 (<
,>=
,||
,&&
...)。 - 一个构造,它计算条件表达式(使用它自己的语法,也因 shell 的不同而不同,并且让人想起解析其参数的
[[ conditional expression ]]
方式。该构造,如/命令,可用于执行许多类似上面的测试或比较字符串甚至数字。[
[
test
-nt
然而 bash 中没有双括号运算符。