이게 스크립트야
user@linux:~$ cat script.sh
#!/bin/bash
for i in `seq $#`
do
echo $i
done
user@linux:~$
산출
user@linux:~$ ./script.sh a b c
1
2
3
user@linux:~$
원하는 출력
숫자뿐만 아니라...이런 매개변수 값을 얻고 싶습니다.
user@linux:~$ ./script.sh a b c
1 - a
2 - b
3 - c
user@linux:~$
답변1
#! /bin/sh -
i=1
for arg do
printf '%2d: %s\n' "$i" "$arg"
i=$((i + 1))
done
즉, 인덱스를 반복하는 대신 매개변수를 반복하고 인덱스를 개별적으로 증가시킵니다.
접근 방식에 대한 몇 가지 참고 사항:
목록 컨텍스트에서 따옴표가 없는 매개변수 확장을 유지하는 것은 매우 특별한 의미를 갖습니다.넌 거의 그러고 싶지 않을 거야.
`...`
이제 명령 대체 형식을 피해야 합니다. 대신 사용하십시오$(...)
.따옴표 없이 명령을 대체하면 분할+글로브도 호출되므로 주의해서 사용해야 합니다. 여기서 당신은 사용하고 있습니다나뉘다부분은 의존하는 현재 값을 의미합니다
$IFS
. 의 출력에는seq
와일드카드가 포함되어 있지 않으므로 문제가 발생하지 않습니다.전반적인 상황부분.seq
표준 명령이 아니며 모든 시스템에서 찾을 수 없습니다. 숫자를 반복하는 것은 어쨌든 최선의 방법은 아닙니다. 전체 출력을 메모리에 저장하고 분할하는 것을 의미하기 때문에(메모리에 추가 복사본이 생성됨) 이는 쉘이 내장되어 있더라도 다음을 실행하여 지원됩니다. 프로세스 내의 별도 유틸리티.she-bang(첫 번째 줄)을 넣지 않으면 POSIX 쉘 (이전 시스템에서는 Bourne(POSIX가 아닌) 쉘일 수도 있음)
#! /path/to/interpreter -
에 의해 해석된다는 유일한 보장이 있으므로 다음이 필요합니다.sh
구문이 POSIX 표준을 준수하는지 확인하세요.sh
에서 제공하는 시스템 에서도bash
런타임에 모든 확장이 활성화되는 것은 아닙니다.bash
sh
위의 코드는 POSIX와 호환되지만(.NET에서도 작동함
bash
) Bourne과 호환되지 않습니다($((...))
Bourne 쉘에서는 산술 확장 구문을 사용할 수 없기 때문입니다). Solaris 10 이하에서는#! /usr/xpg4/bin/sh -
(대부분) POSIX 호환 인터프리터를 얻으 려면 she-bang을 로 변경해야 합니다.
답변2
#!/bin/bash
for ((i=1; i<=$#; i++))
do
echo "$i - ${!i}"
done