Bash变量声明与赋值
在bash中,Bash变量声明与赋值,bash,sh,Bash,Sh,在bash中,declare关键字是可选的,因此my\u var=“foobar”与declare my\u var=“foobar”相同。bash/dash实际上是将新值赋给变量,还是只声明新变量并隐藏同名的现有变量 #!/bin/sh GetValue () { echo "foobar"; return 1; } var1="$(GetValue)" && echo "Successed!" || echo "Failed!"; # Failed! d
declare
关键字是可选的,因此my\u var=“foobar”
与declare my\u var=“foobar”
相同。bash/dash实际上是将新值赋给变量,还是只声明新变量并隐藏同名的现有变量
#!/bin/sh
GetValue ()
{
echo "foobar";
return 1;
}
var1="$(GetValue)" && echo "Successed!" || echo "Failed!"; # Failed!
declare var2="$(GetValue)" && echo "Successed!" || echo "Failed!"; # Successed!
在上面的代码段中,虽然两个变量都已成功声明和赋值,但使用
declare
会在状态代码之间产生差异。为什么?函数GetValue
以及将字符串打印到stdout也会返回代码1
。因此,从函数赋值给变量var1
,虽然将值设置为foobar
,但设置退出代码1
,这是一个非零代码,导致调用|
后的部分
但是请记住,declare
也会发生同样的情况,但是您看到成功的原因是,当declare
内置函数作用于变量时,函数的退出代码1
被抑制。所以
var2="$(GetValue)" # sets a non-zero exit code 1
declare var2 # sets a success exit code 0
由于最后一个前台命令的退出代码是用于评估成功/失败的代码,因此将调用&&
之后的部分,即echo“Successed!”
因此,您声称在变量赋值中使用declare
会对退出代码产生影响的说法是不正确的,因为这两种方法仍然保持不变,因为它们都设置了退出代码1
,从而触发了错误的情况
var1="$(GetValue)" && echo "Successed!" || echo "Failed!";
var2="$(GetValue)" && echo "Successed!" || echo "Failed!";
建议在使用内置的local
、declare
和export
var=5
declare -i var
优于声明-i var=5
有关该主题的更多参考,请参阅。解释了这一确切情况。提示:使用(以及更好的-its)检查脚本是否健全,这通常比在这里键入问题更快。(注意:我不是在劝阻你提问。只是介绍了一个我觉得非常有用的工具。)尽管它的名称,declare
实际上只是用来设置名称的属性或(使用-p
)显示分配给名称的值。如果var2
未定义,则在declare var2
之后仍保持未定义状态。