图片来源:https://www.pixiv.net/en/artworks/101040610
基本语法
getopts用来在shell脚本中解析命令行传入的选项
getopts optstring name [arg...]optstring
optstring指定要解析哪些选项,哪些选项需要额外参数(如-f选项需要一个用户指定的文件名),需要额外参数的选项后面添加冒号
比如下面这条命令,使用tar创建一个tar包“test.tar”
tar -cf test.tar file1 file2其中, c选项表示“创建”,不需要参数;f选项指定生成的文件名,需要参数。所以解析这两个选项的optstring应该写成
cf:
#或者
f:c特殊变量
OPTARG:对于需要额外参数的选项,解析出来的参数存储在OPTARG变量中OPTIND:下一个未解析的参数的在执行命令中的索引
解析错误
- 默认情况下,解析错误时变量
name的值会被设置为“?”,OPTARG会被unset - 如果optstring第一个字符是“:”,则
OPTARG会被设置为解析错误的字符
示例
下面编写一个简单的备份文件脚本,演示getopts的用法
脚本的基本功能和用法:
- 执行“
bakup.sh filename”,会把filename重命名为filename.bak - 使用
s选项可以自定义文件后缀,如执行“bakup.sh -s backup filename”会将文件重命名为filename.backup - 使用
c选项会复制原文件,而不是重命名c - 两个选项当然也可以一起用:
bakup.sh -cs backup filename或者bakup.sh -s backup -c filename
#! /usr/bin/env bash
suffix=bak
docopy=false
while getopts s:ch opt
do
case $opt in
s) suffix="$OPTARG" ;;
c) docopy=true ;;
h|?)
printf "Usage: %s [-s suffix][-c] file\n" `basename "$0"`
exit 1
;;
esac
done
# 通过$OPTIND计算选项和选项参数的数量,将他们都移除,这样 “$1” 就可以直接取到"file"位置的文件名
shift $(( $OPTIND - 1 ))
# 使用联-c选项则复制,否则仅重命名
if [ $docopy = true ];then
cp "$1"{,.$suffix}
else
mv "$1"{,.$suffix}
fi参考: