2016-07-30 173 views
0

我是bash的新手,嘗試一個簡單的循環,但變量的值在它失去後我無法理解爲什麼 - 我看過幾個類似的問題,但他們都與while循環的子shell執行有關。我沒有做,但仍然面臨問題 - 有人可以解釋我的錯誤在哪裏?bash /變量值在循環後爲空

#!/bin/bash 

check_ss()  
{  

command_list | awk '{print $1 $9}' > ss.out  

for i in {1..8}  
      do grep -Pa "\x3$i" ss.out > ss$i.out 
        if grep -w "NotStarted" ss$i.out 
          then 
            ss$i=0 
          else  
           ss$i=1  
        fi 
done 
} 
check_ss  
echo $ss1  
echo $ss2  
echo $ss3  
echo $ss4  

我在執行得到這個:

[[email protected] ~]# ./ss.sh  
./ss.sh: line 21: ss1=1: command not found  
./ss.sh: line 21: ss2=1: command not found  
./ss.sh: line 21: ss3=1: command not found  
./ss.sh: line 21: ss4=1: command not found  
./ss.sh: line 21: ss5=1: command not found  
./ss.sh: line 21: ss6=1: command not found  
./ss.sh: line 21: ss7=1: command not found  
./ss.sh: line 21: ss8=1: command not found 

在此先感謝

回答

5

您需要使用declare動態地構造一個變量名。

declare "ss$i=0" 
+0

謝謝,這在某種程度上改變的情況,但腳本仍試圖執行SS1 = 1作爲命令而不是一assinging值給變量SS1:./ss.sh:線11:SS1 = 0:找不到命令 ./ss.sh:第17行:ss1 = 1:找不到命令 –

+0

這些錯誤消息表明您沒有在這些行上使用'declare'。一個簡單的任務*必須*有一個文字作爲LHS;任何參數擴展都需要'declare'命令。 – chepner

+0

謝謝,我做了與聲明 - 現在沒有找到的命令不再出現,但當做echo $ ss1,echo $ ss2輸出爲空,看起來變量值丟失某處 –

2

數組將是動態變量名稱的更好替代。

check_ss() { 
    ss=() 
    command_list | awk '{print $1 $9}' > ss.out 

    for i in {1..8}; do 
     grep -Pa "\x3$i" ss.out > ss$i.out 
     if grep -w "NotStarted" ss$i.out; then 
      ss[$i]=0 
     else 
      ss[$i]=1 
     fi 
    done 
} 

check_ss  
echo ${ss[1]} 
echo ${ss[2]} 
echo ${ss[3]} 
echo ${ss[4]} 

你也可以擺脫臨時文件。

check_ss() { 
    ss=() 
    command_list | awk '{print $1 $9}' > ss.out 

    for i in {1..8}; do 
     if grep -Pa "\x3$i" ss.out | grep -w "NotStarted"; then 
      ss[$i]=0 
     else 
      ss[$i]=1 
     fi 
    done 
} 

我不知道你的輸入是什麼樣子完全相同,但你甚至可以進一步簡化它是這樣的:

check_ss() { 
    ss=() 
    while read i; do 
     ss[$i]=1 
    done < <(command_list | awk '$9=="NotStarted" {print $1}') 
} 

,或者如果你只是想NotStarted名單號,

ss=(command_list | awk '$9=="NotStarted" {print $1}') 
echo "${ss[@]}" 
+0

非常感謝您的快速答案,我正在嘗試執行以下操作來解析將包含服務狀態的文本文件 - NotStarted或Else(正在運行,正在初始化,故障等)以下是您的建議的輸出:[root @ hp44fd96d3f8-2 〜]#貓ss1.out 1Initialising [根@ hp44fd96d3f8-2〜]#貓ss2.out 2NotStarted [根@ hp44fd96d3f8-2〜]#./ss.sh [ root @ hp44fd96d3f8-2〜]# –

+0

對不起,格式化,不知道如何選擇代碼或在回答時轉到新的一行,無論如何 - 我想給每個ss $ i一個值1 = NotStarted或0 = Running。例如ss1 = 1,ss2 = 1,ss3 = 0,ss4 = 1等等 –