如果未满足条件,请取消设置变量并转到下一行

时间:2017-02-05 05:23:09

标签: shell ksh

我需要有人帮助我满足以下要求。

我有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

2 个答案:

答案 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

是错误的,除非您要取消设置名称包含在var1var4中的变量。使用unset $var1,shell会将var1中包含的值解释为要取消设置的变量的名称。如果该值为空,则取消设置将不会采取任何操作,这被认为是正常的。

<强>解决方案

通过上述更正,您可以像这样重写if块:

if [[ "$var4" ]]; then
  # var4 is set
  mynew="$var4"
else
  unset var1 var2 var3 var4
fi

如果ifelse中的操作是您的示例中的单个语句,则可以使用if和{{以紧凑形式在&&上面进行编写在@ Inian的答案中可以看到1}}构造。

更多信息

||也可以写成:

[[ "$var4" ]]

[[ ! -z "$var4" ]] # $var4 is not of zero length