gpt4 book ai didi

功能测试结果的 bash 命令分组

转载 作者:行者123 更新时间:2023-11-28 20:19:03 25 4
gpt4 key购买 nike

我习惯于使用这样的行来测试变量是否具有非空值(或给出消息和保释):

test $variable || (echo "Value of \$variable cannot be null."; exit 1)

我对在我的脚本中使用函数还很陌生,但我有一个案例,我需要确保传递一个非空值或从函数中退出。但是,“或”案例的命令分组在函数内部的工作方式不同。我写了这个小测试脚本来演示:

 $ cat -n bubu.sh
1 #!/bin/bash
2
3 read -p "give a value for variable \$foo: " -e -i "bar" foo
4
5 function firstfunc {
6 test $1 || (echo "no value"; return 1)
7 echo it looks like \"$1\" is the first value of \$foo
8 return 0
9 }
10
11 function secondfunc {
12 test $1 || return 1
13 echo it looks like \"$1\" is the second value of \$foo
14 return 0
15 }
16 echo "first function:"
17 firstfunc $foo
18 echo returned $?
19
20 echo "second function:"
21 secondfunc $foo
22 echo returned $?

在变量值的情况下输出是这样的:

$ ./bubu.sh
give a value for variable $foo: bar
first function:
it looks like "bar" is the first value of $foo
returned 0
second function:
it looks like "bar" is the second value of $foo
returned 0

以及在没有值的情况下的输出

$ ./bubu.sh
give a value for variable $foo:
first function:
no value
it looks like "" is the first value of $foo
returned 0
second function:
returned 1

在没有值的第一个函数中,我得到“或”命令组的第一个命令,并且“没有值”回显,但是返回命令被传递并且函数的其余部分被执行,向下返回。

为什么命令分组的括号在函数内部表现不同,或者我还遗漏了什么?

最佳答案

正如其他人所提到的,parens 创建了一个子 shell,exit 或 return 命令指示 bash 从子 shell 退出。你应该使用大括号。请注意,您可以使用 bash 参数替换以更简单的方式获得相同的效果。见下文。

你的行 test $variable || (echo "Value of\$variable cannot be null."; exit 1) 即使在函数上下文的“外部”也不应该工作。例如:

$ cat t.sh 
#!/bin/bash

a="hello"
test $a || (echo "Value of \$variable cannot be null."; exit 1)
echo First test passed

a=
test $a || (echo "Value of \$variable cannot be null."; exit 1)
echo Second test passed

给出:

$ ./t.sh 
First test passed
Value of $variable cannot be null.
Second test passed
$

我们看到第二个 echo 运行了,尽管它不应该运行。使用花括号是要走的路。

$ cat t.sh 
#!/bin/bash

a="hello"
test $a || { echo "Value of \$variable cannot be null."; exit 1 ; }
echo First test passed

a=
test $a || { echo "Value of \$variable cannot be null."; exit 1 ; }
echo Second test passed
$ ./t.sh
First test passed
Value of $variable cannot be null.
$

请注意,您可以使用 bash ${parameter:?err_msg} 结构来进行参数替换:

$ cat t.sh 
#!/bin/bash

a="hello"
: ${a:?'a is null or undefined! Exiting..'}
echo First test passed

a=
: ${a:?'a is null or undefined! Exiting..'}
echo Second test passed

$ ./t.sh
First test passed
./t.sh: line 9: a: a is null or undefined! Exiting..
$

关于功能测试结果的 bash 命令分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com