저는 bash 스크립팅이 처음이고 호출될 때 script.sh -sp
열 및 행 개수와 함께 URL을 인쇄하는 getopts를 사용하여 스크립트를 작성하려고 합니다. 옵션이 호출 되면 script.sh -r
파일 형식만 인쇄됩니다.
스크립트:
#!/bin/bash
#define the URL
URL='https://github.com/RamiKrispin/coronavirus/tree/master/data_raw'
#define file name
filename=$(basename "$URL")
#dowload the file
wget -q "${URL}"
while getopts ":sp:r" o; do
case $o in
sp ) echo URL: $URL #print the URL address
awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' $filename #print the column count and row count
r ) file $filename #print the file type
exit 1
esac
done
getopts를 올바르게 사용하는 방법을 이해하는 데 도움을 줄 수 있는 사람이 있습니까?
답변1
getopts
단일 문자 옵션 이름만 지원되며 클러스터링이 지원됩니다. 매개변수가 없으면 -sp
전달하는 것과 동일 -s
하고 매개변수가 있는 경우에는 매개변수가 있는 옵션입니다. 이는 Unix 계열 시스템의 일반적인 규칙입니다. 대시 뒤의 각 문자는 별도의 옵션(인수가 있는 옵션까지)입니다. 이중 대시 뒤의 모든 문자(최대)는 옵션 이름입니다.-p
-s
-s
p
-s
-
--
=
따라서 매개변수 없음 옵션과 매개변수 포함 옵션의 getopts ":sp:r" o
세 가지 옵션이 선언됩니다 . 두 가지 옵션만 필요하고 둘 다 인수가 필요하지 않으므로 올바른 사양은 사용법이 or 또는 or 등 입니다.-s
-r
-p
sr
script.sh
script.sh -s
script.sh -r
script.sh -rs
script.sh -r -s
while getopts sr o; do
case $o in
s)
echo "URL: $URL" #print the URL address
awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' -- "$filename" #print the column count and row count
;;
r) file -- "$filename";; #print the file type
\?) exit 3;; #invalid option
esac
done
shift $((OPTIND - 1)) # remove options, keep non-option arguments
if [ $# -ne 0 ]; then
echo >&2 "$0: unexpected argument: $1"
exit 3
fi
경영진은 :
알려지지 않은 옵션을 사용자에게 보고하지 말라고 말합니다. 알 수 없는 옵션이 계속 $o
발생합니다 ?
. 이렇게 하면 $o
메시지를 인쇄 해야 합니다 ?
. 어느 쪽이든 옵션을 알 수 없으면 실패 상태로 종료해야 합니다.
내가 고친 다른 버그:
;;
문법 에 누락된 내용을 추가했습니다case
.exit 1
성공한 사례에서 제거되었습니다.- 다음에 추가변수 대체에 큰따옴표가 누락되었습니다..
--
로 시작될 수 있는 명령 매개변수 앞에 누락된 부분이 추가되었습니다-
.- 오류 처리가 추가되었습니다.
getopts
가 아니라 로 표기된다는 점에 유의하세요 getopt
. getopt
동일한 목적을 제공하지만 다르게 작동하고 사용하기가 더 어려운 별도의 유틸리티가 있습니다 . 또한 단일 대시로 시작되는 다중 문자 옵션은 지원하지 않지만 이중 대시로 시작되는 긴 옵션은 지원합니다.