많은 값을 계산하고 각 줄에 숫자가 있는 변수에 저장하는 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
답변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를 사용합니다.)