如果不满足条件,则取消设置变量并移至下一行

Unset variables and move on to the next line if condition not met

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

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

您可以在一行中执行此操作,如

[ ! -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

你的代码有问题

一、作业

mynew=`echo "var4"`

是一种昂贵的(因为它涉及一个子shell)和间接的说法

mynew="$var4"

非常简单明了。

其次,我们需要将变量名传递给 unset,而不是值。因此:

unset $var1 $var2 $var3 $var4

是错误的,除非您想取消设置名称包含在 var1var4 中的变量。对于 unset $var1,shell 会将 var1 中包含的值解释为要取消设置的变量的名称。如果值为空,unset不做任何动作,视为正常。

解决方案

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

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

如果 ifelse 中的操作是单个语句,如您的示例所示,您可以使用 &&|| 如@Inian 的回答所示构造。


更多信息

[[ "$var4" ]]也可以写成:

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

[[ -n "$var4" ]]   # $var4 is not empty