Bash if语句:比较不能用于赋值
在下面的Bash if语句:比较不能用于赋值,bash,if-statement,Bash,If Statement,在下面的test\u if2()按预期工作,但test\u if不工作。不同之处在于,在test_if()中,我执行变量赋值。错误在哪里 test_if() { declare file_path if [[ -n ${file_path=$(echo "")} || -n ${file_path=$(echo "Hi")} ]]; then echo Non null: ${file_path} else echo null
test\u if2()
按预期工作,但test\u if
不工作。不同之处在于,在test_if()
中,我执行变量赋值。错误在哪里
test_if() {
declare file_path
if [[ -n ${file_path=$(echo "")} || -n ${file_path=$(echo "Hi")} ]]; then
echo Non null: ${file_path}
else
echo null
fi
}
test_if2() {
declare file_path
declare greet="Hello"
if [[ -n $(echo "") || -n $(echo "Hi") ]]; then
echo Non null
else
echo null
fi
}
test_if #prints null
test_if2 #prints Non null
对于要查找的行为,请使用
:=
而不是=
${param=word}
如果param设置为空,则不进行赋值(这是声明param
所做的)。使用${param:=word}
也涵盖空参数的情况
您的问题是没有执行赋值,返回值为空
我在MacOS上测试了您的表情,如下所示:
file_path=Bye
echo ${file_path=$(echo "Hi")} # returns Bye
echo $file_path # returns Bye
或者:
unset file_path
echo ${file_path=$(echo "Hi")} # returns Hi
echo $file_path # returns Hi
最后,让我们看看在考虑未设置和空的情况下是否有不同的行为:
file_path=""
echo ${file_path=$(echo "Hi")} # returns nothing
echo $file_path # returns nothing
我们不妨完全重复您的代码:
declare file_path
echo ${file_path=$(echo "Hi")} # returns Nothing
echo $file_path # returns Nothing
因此,如果我们查看您的代码,就可以了解为什么test_if()返回“null”
因此,我将得出结论,${param=word}仅当param未设置时才进行赋值。请考虑这个代码:
test_if() {
declare file_path
if [[ -n ${file_path:=$(echo "")} || -n ${file_path:=$(echo "Hi")} ]]; then
echo Non null: ${file_path}
else
echo null
fi
}
echo "test_if() returns $(test_if)" # test_if() returns Non null: Hi
如果参数为空或未设置,则使用
:=
指定一个值。因此,这将使您的代码正常工作,因为您声明了文件路径,但最初没有分配值,将其保留为空(但已设置)。对于您要查找的行为,请使用:=
而不是=
${param=word}
如果param设置为空,则不进行赋值(这是声明param
所做的)。使用${param:=word}
也涵盖空参数的情况
您的问题是没有执行赋值,返回值为空
我在MacOS上测试了您的表情,如下所示:
file_path=Bye
echo ${file_path=$(echo "Hi")} # returns Bye
echo $file_path # returns Bye
或者:
unset file_path
echo ${file_path=$(echo "Hi")} # returns Hi
echo $file_path # returns Hi
最后,让我们看看在考虑未设置和空的情况下是否有不同的行为:
file_path=""
echo ${file_path=$(echo "Hi")} # returns nothing
echo $file_path # returns nothing
我们不妨完全重复您的代码:
declare file_path
echo ${file_path=$(echo "Hi")} # returns Nothing
echo $file_path # returns Nothing
因此,如果我们查看您的代码,就可以了解为什么test_if()返回“null”
因此,我将得出结论,${param=word}仅当param未设置时才进行赋值。请考虑这个代码:
test_if() {
declare file_path
if [[ -n ${file_path:=$(echo "")} || -n ${file_path:=$(echo "Hi")} ]]; then
echo Non null: ${file_path}
else
echo null
fi
}
echo "test_if() returns $(test_if)" # test_if() returns Non null: Hi
如果参数为空或未设置,则使用:=
指定一个值。因此,这将使您的代码正常工作,因为您声明了file_path,但最初没有指定值,将其保留为空(但已设置)
你的情况也是如此
第一个条件设置了file_path=“
,由于对空字符串的-n
测试失败,它会尝试第二个条件
但是,第二个将不会设置file_path=“HI”
,因为它已设置为”
——因此第二个-n
测试也会失败
你的情况也是如此
第一个条件设置了file_path=“
,由于对空字符串的-n
测试失败,它会尝试第二个条件
但是,第二个测试不会设置
file\u path=“HI”
,因为它已经设置为”
,第二个-n
测试也因此失败。我在MAC上再次查看了该行为,得到了不同的结果。${param=word}正在无条件地返回word,而没有赋值给param。我已经更新了我的帖子。无论如何,我的观点是,尝试使用:=代替。请注意,只有在变量中没有值时,才会分配值。由于您在声明file_path时没有分配它,我认为${:=}是您想要的构造。它修复了代码。很好。此外,由于我在循环中使用此结构,因此在if
之前,我必须取消设置变量或为其赋值null,我在MAC上再次查看了该行为,并得到了不同的结果。${param=word}正在无条件地返回word,而没有赋值给param。我已经更新了我的帖子。无论如何,我的观点是,尝试使用:=代替。请注意,只有在变量中没有值时,才会分配值。由于您在声明file_path时没有分配它,我认为${:=}是您想要的构造。它修复了代码。很好。此外,由于我在循环中使用此构造,我必须在if
之前取消设置变量或为其赋值null,正确的方法是使用:=
并在if
之前将变量设置为null
。相关链接:@Roland-很高兴你同意我的观点-:=
就是你想要的。@Roland设置变量是否未设置。我试图回答您为什么会遇到问题。正确的方法是使用:=
并在if
之前将变量设置为null
。相关链接:@Roland-很高兴你同意我的观点-:=
就是你想要的。@Roland设置变量是否未设置。我试着回答你为什么会遇到问题。第一个-n${file_path=$(echo“”)}
?@tedlynmo最初不是echo
,而是调用一个可以返回空字符串的函数。我决定将其替换为echo”“
,使其尽可能接近原始脚本。好的,我明白了。马克的答案似乎可以解决问题,还是还缺少什么?第一个-n${file_path=$(echo“”)}
的目的是什么?@tedlynmo最初我会调用一个可以返回空字符串的函数,而不是echo
。我决定将其替换为echo”“
,使其尽可能接近原始脚本。好的,我明白了。马克的回答似乎可以解决问题,还是还缺少什么?