我的情况是我有大量的编号变量。我想评估每个变量,并在条件匹配时将变量设置为特定字符串。
#!/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
我如何解决这个问题。
答案 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
中变量的值var1
,var2
,var3
...和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