[英]Bash for loop on variable numbers
我遇到大量編號變量的情況。 我想評估每個變量,如果條件匹配,則將變量設置為特定的字符串。
#!/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
我該如何解決。
在
bash
使用語法{!var}
使用間接變量擴展 。
在man bash
頁面上,
如果parameter的第一個字符是感嘆號(!) ,則會引入變量間接訪問級別。 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
間接分配在這里可以使用,但是在這種特定情況下,數組看起來很合適:
#!/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
考慮使用數組而不是數字變量:
#!/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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.