인수로 제공한 단어의 발음을 다운로드하도록 설계된 다음 스크립트가 있습니다.
#!/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도 아니었습니다(그러나 bash
POSIX 모드에서도 대부분의 다른 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
와 유사하게 변수에 이름이 저장된 매개변수의 내용으로 확장됩니다 .zsh
P
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