如何在 bash 中使用 getopts

如何在 bash 中使用 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 

谁能帮助我了解如何正确使用 getopts?

答案1

getopts只支持单字符选项名,并且支持集群:如果不带参数则-sp相当于单独传递-sand ,如果带参数则为带参数的选项。这是类 Unix 系统上的正常约定:在一个破折号之后,每个字符都是一个单独的选项(直到一个带有参数的选项);在双破折号之后,所有内容(直到)都是选项名称。-p-s-sp-s---=

因此getopts ":sp:r" o声明了三个选项:-s-r带参数和-p带参数。您似乎只需要两个选项,并且都不需要参数,因此正确的规范是sr,用法是script.sh script.sh -sorscript.sh -rscript.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

领导:说不要向用户报告未知选项。未知的选项仍然会$o导致?。如果您这样做,您应该在$o时打印一条消息?。无论哪种方式,如果选项未知,您都应该以失败状态退出。

我修复的其他错误:

  • 添加了语法;;中缺失的内容case
  • exit 1成功案例中删除。
  • 添加变量替换周围缺少双引号
  • --在可能以 开头的命令参数前面添加了缺失-
  • 添加了错误处理。

请注意,它是拼写的getopts,而不是getopt。有一个名为的单独实用程序getopt,它具有相同的目的,但工作方式不同,并且更难使用。它也不支持单个破折号引入的多字符选项,但它支持双破折号引入的长选项。

相关内容