如何创建根据命令行开关调用其他脚本的 bash 脚本

如何创建根据命令行开关调用其他脚本的 bash 脚本

我对 bash 非常陌生,需要创建一个脚本,该脚本根据所采用的命令行开关调用另一个脚本。

我们将其称为 stuff.sh

应该stuff.sh --help像普通程序中的帮助一样运行,并向用户提供他可以做什么的列表

  • -a 你可以做类似的事情。
  • -b 你可以做类似的事情。
  • -c 这是极其奇特的东西。

当我用它执行脚本时stuff.sh - a应该做一些事情,比如说在sudo它前面调用另一个脚本。

我怎能这样做?

有没有什么想法可以让刚接触 Bash 的人都轻松理解?

谢谢你!

答案1

#!/bin/bash

function show_help() {
    cat << ENDHELP
-a you can do stuff like that.
-b you can do stuff like that.
-c this is extremely fancy stuff.
ENDHELP
}

case $1 in
    --help)
        show_help
    ;;
    -a)
        sudo /path/to/other/script
    ;;
    -b)
        do_some_stuff
        do_another_stuff
    ;;
    -c)
        do_extremely_fancy_stuff
        do_another_extremely_fancy_stuff
        run_as_many_commands_as_you_want
    ;;
    *)
        echo "Run $0 --help"
    ;;
esac
  • $0是脚本名称。
  • $1是第一个命令行参数,$2是第二个,依此类推。

阅读 bash手册页以供参考。

答案2

如果您同意使用-h而不是 ,那么--help您也可以使用getopts,这非常方便。然后您需要的代码(根据 Eric Carvalho 的回答修改):

#!/bin/bash

function show_help() {
    cat << ENDHELP
-a you can do stuff like that.
-b you can do stuff like this.
-c this is extremely fancy stuff.
ENDHELP
}

#checks if there are any arguments by (ab)using the short-circuited OR
(( $# )) || echo "No arguments. Run $0 --help"

while getopts 'habc' opt; do
        case "$opt" in
            h)
                show_help
            ;;
            a)
                echo "sudo /path/to/other/script"
            ;;
            b)
                echo "do_some_stuff"
                echo "do_another_stuff"
            ;;
            c)
                echo "do_extremely_fancy_stuff"
                echo "do_another_extremely_fancy_stuff"
                echo "run_as_many_commands_as_you_want"
            ;;
            *)
                echo "Run $0 --help"
            ;;
        esac
done

现在你可以将多个选项传递给你的 shellscript,所以如果你想运行 a、b 和 c,你可以这样做

./script.bash -a -b -c

甚至

./script.bash -abc

选项字符串'habc'会告诉您哪些选项是允许的,getopts会自动告诉您不支持的选项。您还可以向选项添加参数(例如要运行的其他脚本的名称),然后需要在:选项后面添加冒号(),然后将参数存储在中$OPTARG。请参阅这个(不完整的)维基页面如何做到这一点。

PS 您还可以使用(旧版)getopt(不带s)getopt有点难,但允许您使用--help

相关内容