bash - 如何创建带参数的 bash 脚本?

标签 bash

我已经知道 getopts,这很好,但令人讨厌的是,即使是强制参数,你也必须有一个标志。

理想情况下,我希望能够有一个脚本以这种形式接收参数:

script.sh [optional arguments] [anything required]

例如

script.sh -rvx output_file.txt

脚本说你必须有一个输出文件。有什么简单的方法可以做到这一点吗?

据我所知,对于 getopts,它必须看起来像:script.sh -rvx -f output_file.txt,这不是很干净。

必要时我也可以使用 python,但只有 2.4 可用,有点过时了。

最佳答案

不要使用内置的 getopts,而是使用 getopt(1)。它们(微妙地)不同并且擅长做不同的事情。对于您的场景,您可以这样做:

#!/bin/bash

eval set -- $(getopt -n $0 -o "-rvxl:" -- "$@")

declare r v x l
declare -a files
while [ $# -gt 0 ] ; do
        case "$1" in
                -r) r=1 ; shift ;;
                -v) v=1 ; shift ;;
                -x) x=1 ; shift ;;
                -l) shift ; l="$1" ; shift ;;
                --) shift ;;
                -*) echo "bad option '$1'" ; exit 1 ;;
                *) files=("${files[@]}" "$1") ; shift ;;
         esac
done

if [ ${#files} -eq 0 ] ; then
        echo output file required
        exit 1
fi

[ ! -z "$r" ] && echo "r on"
[ ! -z "$v" ] && echo "v on"
[ ! -z "$x" ] && echo "x on"

[ ! -z "$l" ] && echo "l == $l"

echo "output file(s): ${files[@]}"

编辑:为了完整起见,我提供了一个处理需要参数的选项的示例。

关于bash - 如何创建带参数的 bash 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587076/

相关文章:

linux - 使用awk处理多个文件

java - Bash 脚本无法将 Java 程序作为 cron 作业运行

linux - 删除未使用的文件夹和需要的副本

linux - 如何创建类似 $RANDOM 的 bash 变量

linux - bash 脚本上的奇怪错误

linux - 使用一个脚本在具有多个命名选项卡的命名 screen session 中启动多个脚本? [ Derby 安]

linux - sudo bang bang 到底是什么?

json - 在bash中使用awk合并两个Json文件

bash - 快速帮助 bash 脚本删除大文件的行

python - 使用新参数安排python脚本重新启动或对象重新初始化