쉘 스크립트에서 루프를 사용하여 증가하는 숫자의 변수 값을 인쇄하는 방법은 무엇입니까?

쉘 스크립트에서 루프를 사용하여 증가하는 숫자의 변수 값을 인쇄하는 방법은 무엇입니까?

많은 값을 계산하고 각 줄에 숫자가 있는 변수에 저장하는 Bash 스크립트가 있습니다. 예를 들어, TC_5입력 csv 파일의 5번째 줄 값을 계산하는 as라는 변수가 있습니다 . 모든 값을 계산하고 명명 규칙에 따라 변수에 저장했으므로 TC_<Row_No>200행에 대해 값을 다음 위치에 저장했습니다.

TC_1
TC_2
.
.
TC_200

이제 이 모든 변수의 값을 수동으로 인쇄하는 대신 외부 파일에 함께 인쇄할 수 있는 루프를 작성하고 싶습니다. 이를 위해 다음과 같은 while 루프를 사용합니다.

i=0
while [ "$i" != 201 ]
do
    echo "TC_$i" >> Out
    i=`expr $i + 1`
done

echo 문이 변수를 파일 TC_<RowNo>에 인쇄하도록 위의 코드를 어떻게 수정합니까 ?Out

답변1

[ "$i" != 201 ]조건이 항상 true이기 때문에 현재 스크립트가 무한 루프에 갇혀 있습니다 .

$i반복할 때마다 증가 하여 사용해야 합니다.평가하다TC_<RowNo>변수의 내용을 인쇄합니다 (그러나안전하지 않아):

i=1
while [ "$i" -ne 201 ]
do
    eval printf '%s\\n' "\${TC_$i}"
    i=$((i+1))
done >> "Out"

처음 $i부터 1사용은 -ne정수 비교를 수행하고 루프 끝에서 리디렉션됩니다 while.

답변2

Bash에서 이와 같은 작업을 수행하는 가장 좋은 방법은 배열을 사용하는 것입니다.

TC[1]=something
TC[2]=somethingelse
...
TC[200]=somethingstillelse

i=1
while ((i <= 200)); do
    echo "${TC[i]}" >> Out
    ((i++))
done

그러나 실제로 인덱스를 일반 변수 이름에 포함하려면 간접 변수 참조를 사용할 수 있습니다.

TC_1=something
TC_2=somethingelse
...
TC_200=somethingstillelse

i=1
while ((i <= 200)); do
    varname=TC_$i    # Need to store the variable name in a variable first
    echo "${!varname}" >> Out    # The ! (and braces) trigger indirect expansion
    ((i++))
done

대시와 같은 기본 POSIX 셸에서는 이러한 기능을 사용할 수 없습니다. 스크립트가 일반 쉘이 아닌 bash에서 실행되는지 확인하십시오.

답변3

while루프를 약간 변경했는데 나에게 적합합니다 .

i=1
while [ "$i" != 201 ]
do
    echo $TC_$i >> Out
    i=`expr $i + 1`
done

앞에 있는 $를 확인 TC_$i하고 큰따옴표를 제거하세요. (cuonglm에서 제안한 시작값 수정을 포함시켰습니다.)

(High Sierra를 실행하는 Mac의 iTerm에서 GNU bash를 사용합니다.)

관련 정보