【问题标题】:bash / Variable value is empty after the loopbash / 循环后变量值为空
【发布时间】:2016-07-30 15:20:15
【问题描述】:

我是 bash 的新手并尝试了一个简单的循环,但我的变量的值在它之后丢失了,我不明白为什么 - 我看过几个类似的问题,但它们都与一段时间的子 shell 执行有关环形 。我没有做但仍然面临问题 - 有人可以解释我的错误在哪里吗?

#!/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    

我正在执行此操作:

[root@lubo ~]# ./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   

提前致谢

【问题讨论】:

    标签: bash loops variables


    【解决方案1】:

    需要使用declare动态构造变量名。

    declare "ss$i=0"
    

    【讨论】:

    • 谢谢,这以某种方式改变了情况,但脚本仍在尝试将 ss1=1 作为命令执行,而不是为变量 ss1 赋值:./ss.sh:第 11 行:ss1= 0:找不到命令。/ss.sh:第 17 行:ss1=1:找不到命令
    • 这些错误消息表明您没有在这些行上使用declare。一个简单的赋值必须有一个字面量词作为 LHS;任何参数扩展都需要declare 命令。
    • 谢谢,我用 declare 做到了 - 现在找不到命令不再出现,但是在执行 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}')
    }
    

    或者,如果您只想要未开始编号的列表,

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

    【讨论】:

    • 非常感谢您的快速回答,我正在尝试执行以下操作来解析一个包含服务状态的文本文件 - NotStarted 或 Else(运行、初始化、故障等) .) 这是您的建议的输出: [root@hp44fd96d3f8-2 ~]# cat ss1.out 1Initialising [root@hp44fd96d3f8-2 ~]# cat ss2.out 2NotStarted [root@hp44fd96d3f8-2 ~]# ./ss .sh 1 1 1 1 [root@hp44fd96d3f8-2 ~]#
    • 抱歉格式化,不知道如何选择代码或在回答时转到新行,无论如何 - 我想给每个 ss$i 一个值 1 = NotStarted 或 0 = Running。例如 ss1=1 , ss2 = 1 , ss3 = 0 , ss4 =1 等等
    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    相关资源
    最近更新 更多