for 루프에서 $1 $2...와 같은 매개변수를 사용하는 방법은 무엇입니까? [복사]

for 루프에서 $1 $2...와 같은 매개변수를 사용하는 방법은 무엇입니까? [복사]

인수로 제공한 단어의 발음을 다운로드하도록 설계된 다음 스크립트가 있습니다.

#!/bin/bash 
m=$#
for ((i=1;i<=m;i++));do

echo $i
#wget https://ssl.gstatic.com/dictionary/static/sounds/de/0/"$i".mp3
done

이 명령을 통해 실행하면

./a.sh personality brave selfish

표준 출력으로 인쇄해야 합니다.

personality 
brave 
selfish

하지만 인쇄됩니다

1
2
3

이 문제를 해결하는 데 도움을 주실 수 있나요?

ps: for 루프 없이 $1로 스크립트를 작성하면 잘 작동하지만 동시에 많은 파일을 다운로드하고 싶습니다.

답변1

Bourne과 유사한 쉘에서는 다음과 같습니다.

for arg
do printf 'Something with "%s"\n' "$arg"
done

for즉, 위치 인수( $1, ...)는 기본적으로 반복됩니다 $2(한 부분을 지정하지 않은 경우 in ...).

이는 다음보다 이식성이 뛰어납니다.

for arg; do
  printf 'Something with "%s"\n' "$arg"
done

2016 버전의 표준 이전에는 POSIX도 아니고 Bourne도 아니었습니다(그러나 bashPOSIX 모드에서도 대부분의 다른 Bourne 유사 셸에서 사용할 수 있음).

또는 다음보다:

for arg in "$@"; do
  printf 'Something with "%s"\n' "$arg"
done

이것은 POSIX이지만 Bourne 쉘이나 ksh88에서 공백 문자가 포함되지 않은 경우 $IFS또는 Bourne 쉘의 일부 버전에서 인수가 포함되지 않은 경우 또는 일부 쉘(일부 bash매개변수 포함)에서는 제대로 작동하지 않습니다. ) 이 -u옵션이 활성화됩니다.

아니면

for arg do
  printf 'Something with "%s"\n' "$arg"
done

이것은 POSIX와 Bourne이지만 매우 오래된 재 기반 쉘에서는 작동하지 않습니다. 나는 개인적으로 이것을 무시하고 그 구문을 직접 사용할 것입니다. 왜냐하면 나는 그것이 가장 명확하다고 생각하고 내가 작성한 코드가 그런 신비한 쉘에 의해 해석되는 것을 원하지 않기 때문입니다.

자세한 내용은 다음을 방문하십시오.


이제 해당 요소를 $i반복 하고 액세스 하려는 경우 다음을 수행할 수 있습니다.[1..$#]

POSIX 셸에서:

i=1
for arg do
  printf '%s\n' "Arg $i: $arg"
  i=$((i + 1))
done

또는:

i=1
while [ "$i" -le "$#" ]; do
  eval "arg=\${$i}"
  printf '%s\n' "Arg $i: $arg"
  i=$((i + 1))
done

또는bash

for ((i = 1; i <= $#; i++ )); do
  printf '%s\n' "Arg $i: ${!i}"
done

${!i}간접 변수 확장입니다. 즉, 매개 변수 확장 플래그 i와 유사하게 변수에 이름이 저장된 매개변수의 내용으로 확장됩니다 .zshP

for ((i = 1; i <= $#; i++ )); do
  printf '%s\n' "Arg $i: ${(P)i}"
done

에서는 배열을 통해 위치 매개변수에 액세스 zsh할 수도 있습니다 $argv( 에서처럼 csh).

for ((i = 1; i <= $#; i++ )); do
  printf '%s\n' "Arg $i: $argv[i]"
done

답변2

나는 arg-1이 null이 아닐 때 루프를 계속한다는 뜻입니다 shift.[ -n "$1" ]

#! /bin/bash 
while [ -n "$1" ]; do
  echo "$1"
  wget "https://ssl.gstatic.com/dictionary/static/sounds/de/0/$1.mp3"
  shift
done

답변3

가장 간단한 방법

#!/bin/bash
for i
do
 echo $i
done

그리고 달리다

./a.sh personality brave selfish

이것이 표준 출력에 인쇄되는 내용입니다.

personality
brave
selfish

관련 정보