Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash if语句:比较不能用于赋值_Bash_If Statement - Fatal编程技术网

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”“
,使其尽可能接近原始脚本。好的,我明白了。马克的回答似乎可以解决问题,还是还缺少什么?