for 루프의 매개변수 값 인쇄

for 루프의 매개변수 값 인쇄

이게 스크립트야

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

즉, 인덱스를 반복하는 대신 매개변수를 반복하고 인덱스를 개별적으로 증가시킵니다.

접근 방식에 대한 몇 가지 참고 사항:

  • 목록 컨텍스트에서 따옴표가 없는 매개변수 확장을 유지하는 것은 매우 특별한 의미를 갖습니다.넌 거의 그러고 싶지 않을 거야.

  • echo임의의 데이터를 출력하는 데 사용할 수 없습니다..

  • `...`이제 명령 대체 형식을 피해야 합니다. 대신 사용하십시오 $(...).

  • 따옴표 없이 명령을 대체하면 분할+글로브도 호출되므로 주의해서 사용해야 합니다. 여기서 당신은 사용하고 있습니다나뉘다부분은 의존하는 현재 값을 의미합니다 $IFS. 의 출력에는 seq와일드카드가 포함되어 있지 않으므로 문제가 발생하지 않습니다.전반적인 상황부분.

  • seq표준 명령이 아니며 모든 시스템에서 찾을 수 없습니다. 숫자를 반복하는 것은 어쨌든 최선의 방법은 아닙니다. 전체 출력을 메모리에 저장하고 분할하는 것을 의미하기 때문에(메모리에 추가 복사본이 생성됨) 이는 쉘이 내장되어 있더라도 다음을 실행하여 지원됩니다. 프로세스 내의 별도 유틸리티.

  • she-bang(첫 번째 줄)을 넣지 않으면 POSIX 쉘 (이전 시스템에서는 Bourne(POSIX가 아닌) 쉘일 수도 있음) #! /path/to/interpreter -에 의해 해석된다는 유일한 보장이 있으므로 다음이 필요합니다. sh구문이 POSIX 표준을 준수하는지 확인하세요. sh에서 제공하는 시스템 에서도 bash런타임에 모든 확장이 활성화되는 것은 아닙니다.bashsh

    위의 코드는 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

관련 정보