아래 코드에서는 option 을 제공할 때 r
인수 getopts
가 필요합니다.
while getopts ":hr::l:" opt; do
case $opt in
r ) echo "Run Numbers - argument = $OPTARG " ;;
l ) echo "Latency range - argument = $OPTARG" ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
-r
하지만 옵션 뒤에 하나가 아닌 두 개의 매개변수를 전달 해야 합니다 . 찾을 수 있는 단축키가 있나요?
답변1
단일 옵션을 사용하여 두 개의 인수를 전달할 수 없습니다 getopts
.
다음 대안을 권장합니다.
여러 매개변수 주위에 따옴표를 넣으세요.
이 경우 getopts는 이를 하나의 인수로 처리하지만 나중에 분할할 수 있습니다. 모든 매개변수를 한 번에 배열에 넣을 수도 있습니다.
#!/bin/bash while getopts ":hr:l:" opt; do case $opt in r ) echo "Run Numbers - argument = $OPTARG " set -f # disable glob IFS=' ' # split on space characters array=($OPTARG) ;; # use the split+glob operator l ) echo "Latency range - argument = $OPTARG" ;; h ) helptext graceful_exit ;; * ) usage clean_up exit 1 esac done echo "Number of arguments: ${#array[@]}" echo -n "Arguments are:" for i in "${array[@]}"; do echo -n " ${i}," done printf "\b \n"
예제를 실행하세요:
./script -r "123 456 789"
그리고 출력:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
쉼표(또는 기타 선호하는 문자)를 구분 기호로 사용하세요.
./script -r 123,456,789
위의 코드를 교체하면 됩니다
IFS=" "
.IFS=,
이 방법의 장점은 빈 요소를 허용한다는 것입니다. 주석 섹션에서 지적했듯이 이 솔루션은 일부 일반적인 프로그램에서 선택되었습니다lsblk -o NAME,FSTYPE,SIZE
.여러
-r
옵션 허용여러 개
-r
이지만 각각 하나의 매개변수만 사용합니다../script -r 123 -r 456 -r 789
그런 다음 매개변수가 하나씩 배열에 추가됩니다.
array+=("$OPTARG")
이것의 장점은 요소가 포함할 수 있는 문자에 제한이 없다는 것입니다. 이 도구는
awk -v var1=x -v var2=y
.