2016-07-30 87 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等等 –