을 사용할 때 무엇을 이스케이프해야 하는지 이해할 수 없습니다 sh -c
.
for 루프를 실행하고 싶다고 가정해 보겠습니다 for i in {1..4}; do echo $i; done
. 그 자체로는 잘 작동합니다. : 에 전달하면 eval
이스케이프해야 하지만 작동하도록 할 수 없습니다 .$
eval "for i in {1..4}; do echo \$i; done"
sh -c "[...]"
$ sh -c "for i in {1..4}; do echo $i; done"
4
$ sh -c "for i in {1..4}; do echo \$i; done"
{1..4}
$ sh -c "for i in \{1..4\}; do echo \$i; done"
{1..4}
$ sh -c "for i in \{1..4\}\; do echo \$i\; done"
sh: 1: Syntax error: end of file unexpected
이에 대한 자세한 정보는 어디서 찾을 수 있나요?
답변1
-c
일반적인 관행은 작은따옴표(뒤)로 스크립트를 정의하는 것입니다. 사용해야 할 다른 부분은 {1..4}
구성이 작동하는 셸입니다.
$ bash -c 'for i in {1..4}; do echo $i; done' # also work with ksh and zsh
대시(yours)와 함께 작동하도록 하는 대안은 sh
대화식으로 사용하는 셸에서 확장하는 것입니다(대화식 셸로 bash 또는 zsh를 사용한다고 가정합니다).
$ dash -c 'for i do echo $i; done' mysh {1..4}
1
2
3
4
답변2
{1..4}
csh
중괄호 확장 연산자에서 확장된 zsh 연산자이며 {x,y}
현재 다른 일부 쉘에서 지원되지만 POSIX sh 연산자는 아닙니다(최근까지 POSIX는 실제로필수의 echo {1..4}
) 를 출력합니다 {1..4}
.
zsh 또는 현재 지원되는 다른 쉘에서도 {x..y}
정수 변수를 증가시키는 루프를 수행하는 가장 좋은 방법은 아닙니다. 결국 모든 값의 목록을 할당하게 되기 때문입니다(여기서는 4개의 값만 할당되지만 확장성이 좋지 않습니다). for i in $(seq 4)
( seq
존재하다아니요표준 명령)의 현재 값에 의존한다는 점을 제외하면 동일한 문제가 있습니다 $IFS
.
ksh93, bash, zsh에서는 다음을 사용합니다.
for (( i = 1; i <= 4; i++ )); do
printf '%s\n' "$i"
done
일반적으로 더 나은 것으로 간주됩니다. 또한 음수 값을 허용하고 인덱스가 증가하는 방식을 더 효과적으로 제어할 수 있습니다.
이 {x..y}
방법의 장점은 여러 범위에 걸쳐 반복하거나, 문자에 대해 반복하거나, 패딩을 사용할 수 있다는 것입니다(이는 셸 및 해당 버전에 따라 다름).
for i in {1..5} {9..12} x{0..3} {f..p} {001..0010}; do
...
done
에서는 zsh
다음 항목도 참조하세요.
i=; repeat 4 printf '%s\n' $((++i))
POSIX에서는 sh
다음을 수행합니다.
i=1; while [ "$i" -le 4 ]; do
printf '%s\n' "$i"
i=$(( i + 1 ))
done
또는:
sh -c '
i=1; while [ "$i" -le 4 ]; do
printf "%s\n" "$i"
i=$(( i + 1 ))
done'
새로운 호출이 필요한 경우 sh
Bourne/rc/fish와 같은 다른 셸에서 루프를 실행하세요.
물론 여기서도 다음과 같이 할 수 있습니다.
for i in 1 2 3 4; do
printf '%s\n' "$i"
done