Bash for循环变量数

时间:2017-02-06 11:14:29

标签: linux bash loops variables for-loop

我的情况是我有大量的编号变量。我想评估每个变量,并在条件匹配时将变量设置为特定字符串。

#!/bin/bash
var1=""
var2="1233123213"
var3="22332323222324242"
var4=""
var5=""

for i in 1 2 3 4 5
do 
   if [ -z "$var{$}i" ]
      then
          var{$}i="None"
   fi
echo "var{$}i \r"
done

但问题是当我运行我接下来的脚本时。

{1} \r
{2} \r
{3} \r
{4} \r
{5} \r

我如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

  

bash中使用indirect variable expansion语法{!var}

man bash页面

  

如果参数的第一个字符是感叹号(!),则会引入一个变量间接级别。 Bash使用从参数的其余部分形成的变量的值作为变量的名称;然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展。感叹号必须紧跟左支撑才能引入间接。

将您的代码修改为以下内容,

for i in 1 2 3 4 5
do
     var="var$i"
     [ -z "${!var}" ] && declare "var$i"="none"
done

printf "var1=%s\n" "$var1"
printf "var2=%s\n" "$var2"
printf "var3=%s\n" "$var3"
printf "var4=%s\n" "$var4"
printf "var5=%s\n" "$var5"

在这种情况下,语法"${!var}"评估字符串var中变量的值var1var2var3 ...和declare语法在运行时设置变量值,仅适用于那些为空的变量。 现在打印这些变量会产生,

var1=none
var2=1233123213
var3=22332323222324242
var4=none
var5=none

答案 1 :(得分:1)

间接赋值在这里可行,但在这种特殊情况下,数组看起来非常合适:

#!/bin/bash
declare -a var=()
var+=("")
var+=(1233123213)
var+=(22332323222324242)
var+=("")
var+=("")

for i in "${!var[@]}"
do
  [[ "${var[$i]}" ]] || var[$i]="None"
  echo "Index: $i - Value: ${var[$i]}"
done

答案 2 :(得分:1)

考虑使用数组而不是编号变量:

#!/bin/bash
var[1]=""
var[2]="1233123213"
var[3]="22332323222324242"
var[4]=""
var[5]=""

for i in 1 2 3 4 5
do 
   if [ -z "${var[i]}" ]
      then
          var[i]="None"
   fi
echo "${var[i]} \r"
done