![Bash에서는 중괄호 확장에 정수 변수를 사용할 수 있습니까?](https://linux55.com/image/27657/Bash%EC%97%90%EC%84%9C%EB%8A%94%20%EC%A4%91%EA%B4%84%ED%98%B8%20%ED%99%95%EC%9E%A5%EC%97%90%20%EC%A0%95%EC%88%98%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
다음 bash 스크립트가 있습니다.
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
첫 번째 for
루프(아니요upperlim
루프 제어의 변수)는 잘 작동하지만 두 번째 for
루프(그리고루프 제어의 변수 upperlim
)는 그렇지 않습니다. 두 번째 for
루프가 제대로 작동하도록 수정하는 방법이 있습니까 ? 시간 내 주셔서 감사합니다.
답변1
그 이유는 bash의 이벤트 순서 때문입니다. 버팀대 확장이 발생합니다.앞으로변수가 확장됩니다. 목표를 달성하려면 C 스타일 for 루프를 사용해야 합니다.
upperlim=10
for ((i=0; i<=upperlim; i++)); do
echo "$i"
done
답변2
내장 함수만 사용하여 자신의 스타일로 이 작업을 수행하려면 eval을 사용해야 합니다.
d=12
for i in `eval echo {0..$d}`
do
echo $i
done
하지만 함께 seq
:
lowerlimit=0
upperlimit=12
for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done
개인적으로는 seq
.
답변3
POSIX 방식
휴대성을 중요시한다면POSIX 표준의 예:
i=2
END=5
while [ "$i" -le "$END" ]; do
echo "$i"
i=$(($i+1))
done
산출:
2
3
4
5
상황은아니요POSIX:
(( ))
USD 없음(일반적인 확장임에도 불구하고)POSIX 자체가 언급했듯이.[[
.[
여기서는 충분합니다. 또한보십시오:https://stackoverflow.com/questions/13542832/bash-if-difference- Between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
, 언급된 변수와 함께 사용할 수 없습니다.Bash 매뉴얼을 통해.let i=i+1
:POSIX 7 2. 쉘 명령 언어단어가 포함되어 있지 않으며 4.3.42에서let
실패합니다 .bash --posix
USD가 필요할 수도 있지만
i=$i+1
확실하지 않습니다.POSIX 7 2.6.4 산술 확장설명하다:쉘 변수인 경우엑스선택적으로 앞에 더하기 또는 빼기 기호를 포함하고 산술 확장을 포함하여 유효한 정수 상수를 형성하는 값을 포함하며
"$((x))"
동일한"$(($x))"
값을 반환해야 합니다.$((x+1))
하지만 말 그대로 확장이x+1
변수가 아니라는 뜻은 아니다 .
답변4
for i in $(seq ${1:-1} ${2:-10}); do
echo $i
done
i=${1:-1}
while (( $i <= ${2:-10} )); do
echo $i
i=$(($i + 1))
done