루프 내부에서 루프로 순차적으로 명명 된 변수에 어떻게 액세스 할 수 있습니까?
문제
루프에서 다른 변수를 기준으로 번호가 매겨진 변수 세트를 만들 수 있는지 이해하려고합니다. 그런 다음 루프가 끝나기 전에 호출합니다.
예를 들어 나는 Question이라는 스크립트를 썼습니다 (주먹 명령은 변수 $ 탭의 내용이 무엇인지 보여주는 것입니다)
(23:32:12\[deco@S.Man)
[~/bin]$ listQpsk 40|grep -w [1-4]
40 SMANHUBAQPSK1 1 1344 1195 88
40 SMANHUBAQPSK1 2 1668 1470 88
40 SMANHUBAQPSK1 3 1881 1539 81
40 SMANHUBAQPSK1 4 1686 1409 83
(23:18:42\[deco@S.Man)
[~/bin]$ cat question
#!/usr/bin/bash
tab=`listQpsk 40|grep -w [1-4]`
seq=1
num=4
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
done
echo $count1
echo $count2
echo $count3
echo $count4
내가 이것을 실행할 때 나는 얻는다
(23:32:23\[deco@S.Man)
[~/bin]$ ./question
1195
1471
1538
1409
이것이 바로 내가 기대할 수있는 것이지만, 루프의 일부가 방금 생성 된 변수의 값을 반향하도록 ECHO 명령을 Terly 루프 내부로 이동하는 방법이 있습니다. 같은 것 :
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
echo "$count$seq"
done
추신 : 서식이 꺼져 있다면 죄송합니다 ... 여기에 처음 게시했는데, Reddit의 Markdown 만 알고 있습니다.
해결책
간접 사용 :
until [[ $seq -gt $num ]];do
var="count$seq"
eval $var=$(echo "$tab"|awk -v seq=$seq '$3==seq {print $5}') # awk loves to do grep's job
let seq+=1 # another way
echo "${!var}" # indirection
done
다른 평가가 필요하지 않습니다.
다른 팁
당신의 질문에 정확히 대답하지는 않지만 ... 배쉬가 배열 변수가 있다는 것을 알고 있습니까?
seq=1
num=4
until [[ $seq -gt $num ]];do
count[$seq]=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
done
echo ${count[*]}
또는 배열없이 :
seq=1
num=4
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
eval echo \$count$seq
seq=$(($seq+1))
done
예, 이렇게 (적어도 Bash에서) :
$ count1=xyz
$ seq=1
$ value=`eval echo \$\{count$seq\}`
$ echo $value
이 시도:
varName=a
for i in 1 2 3
do
eval $varName$i=stuff
eval var=\$$varName$i
echo $var
done
일부 버전의 쉘은 또한 $ {! var}를 사용하여 변수를 간접적으로 참조 할 수 있습니다.
제휴하지 않습니다 StackOverflow