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

在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!
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
之后仍保持未定义状态。