我是 bash 脚本编写的新手,我正在尝试使用 getopts 编写一个脚本,以便在调用时script.sh -sp
打印出 URL 以及列和行计数。当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
and ,如果带参数则为带参数的选项。这是类 Unix 系统上的正常约定:在一个破折号之后,每个字符都是一个单独的选项(直到一个带有参数的选项);在双破折号之后,所有内容(直到)都是选项名称。-p
-s
-s
p
-s
-
--
=
因此getopts ":sp:r" o
声明了三个选项:-s
不-r
带参数和-p
带参数。您似乎只需要两个选项,并且都不需要参数,因此正确的规范是sr
,用法是script.sh
script.sh -s
orscript.sh -r
或script.sh -rs
orscript.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
,它具有相同的目的,但工作方式不同,并且更难使用。它也不支持单个破折号引入的多字符选项,但它支持双破折号引入的长选项。