簡體   English   中英

重擊變量數循環

[英]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}"在這種情況下評估字符串中變量的值varvar1var2var3 ...和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM