我是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
提前致谢
答案 0 :(得分:5)
您需要使用declare
动态构建变量名称。
declare "ss$i=0"
答案 1 :(得分: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[@]}"