Ola*_*ola 4 scripting bash shell-script getopts
我是 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
Run Code Online (Sandbox Code Playgroud)
谁能帮助我了解如何正确使用 getopts?
getopts只支持单字符选项名,并且支持集群:如果不带参数则-sp相当于单独传递-sand ,如果带参数则为带参数的选项。这是类 Unix 系统上的正常约定:在一个破折号之后,每个字符都是一个单独的选项(直到一个带有参数的选项);在双破折号之后,所有内容(直到)都是选项名称。-p-s-sp-s---=
因此getopts ":sp:r" o声明了三个选项:-s不-r带参数和-p带参数。您似乎只需要两个选项,并且都不需要参数,因此正确的规范是sr,用法是script.sh script.sh -sorscript.sh -r或script.sh -rsorscript.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
Run Code Online (Sandbox Code Playgroud)
领导:说不要向用户报告未知选项。未知的选项仍然会$o导致?。$o如果您这样做,您应该在时打印一条消息?。无论哪种方式,如果选项未知,您都应该以失败状态退出。
我修复的其他错误:
;;中缺失的内容case。exit 1成功案例中删除。--在可能以 开头的命令参数前面添加了缺失-。请注意,它是拼写的getopts,而不是getopt。有一个名为的单独实用程序,getopt它具有相同的目的,但工作方式不同,并且更难使用。它也不支持单个破折号引入的多字符选项,但它支持双破折号引入的长选项。