本站支持 ActivityPub: [email protected]

getopts用法

图片来源: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 国际许可协议进行许可。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注