我需要有人帮助我满足以下要求。
我有4个变量派生自while语句(var1,var2,var3,var4)。
在这个while循环中,我有一个if循环来检查(var4)条件并写入输出文件。
我的要求是如果var4不符合if条件,变量(var1,var2,var3,包括var4)不应包含在输出文件中。
我尝试使用unset ($var1, $var2, $var3, $var4)
,但它无效。
我的if循环:
if [! -z "var4"]
then
mynew=`echo "var4"`
else
unset ($var1,$var2,$var3,$var4)
fi
答案 0 :(得分:1)
您可以在一行中执行此操作,
[ ! -z "$var4" ] && read mynew <<<"${var4}" || unset var1 var2 var3 var4
# Checking if '$var4' is not empty
# Storing var4 variable value in 'mynew'
# If empty un-setting all the variables in one shot
(或)只是下面应该没问题
[ ! -z "$var4" ] && mynew="${var4}" || unset var1 var2 var3 var4
答案 1 :(得分:1)
代码中的问题
首先是作业
mynew=`echo "var4"`
是昂贵的(因为它涉及子shell)和间接的说法
mynew="$var4"
非常简单直接。
其次,我们需要将变量名称传递给unset
,而不是值。因此:
unset $var1 $var2 $var3 $var4
是错误的,除非您要取消设置名称包含在var1
到var4
中的变量。使用unset $var1
,shell会将var1
中包含的值解释为要取消设置的变量的名称。如果该值为空,则取消设置将不会采取任何操作,这被认为是正常的。
<强>解决方案强>
通过上述更正,您可以像这样重写if
块:
if [[ "$var4" ]]; then
# var4 is set
mynew="$var4"
else
unset var1 var2 var3 var4
fi
如果if
和else
中的操作是您的示例中的单个语句,则可以使用if
和{{以紧凑形式在&&
上面进行编写在@ Inian的答案中可以看到1}}构造。
更多信息
||
也可以写成:
[[ "$var4" ]]
或
[[ ! -z "$var4" ]] # $var4 is not of zero length