sh -c 내에서 루프를 실행하는 방법

sh -c 내에서 루프를 실행하는 방법

을 사용할 때 무엇을 이스케이프해야 하는지 이해할 수 없습니다 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'

새로운 호출이 필요한 경우 shBourne/rc/fish와 같은 다른 셸에서 루프를 실행하세요.

물론 여기서도 다음과 같이 할 수 있습니다.

for i in 1 2 3 4; do
  printf '%s\n' "$i"
done

관련 정보