图片来源: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
参考:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。