루프 내부에서 루프로 순차적으로 명명 된 변수에 어떻게 액세스 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1030532

  •  06-07-2019
  •  | 
  •  

문제

루프에서 다른 변수를 기준으로 번호가 매겨진 변수 세트를 만들 수 있는지 이해하려고합니다. 그런 다음 루프가 끝나기 전에 호출합니다.

예를 들어 나는 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}를 사용하여 변수를 간접적으로 참조 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top