28

我不知道这是否可能,但我想编写类似于带有选项的常规可执行文件的 shell 脚本。作为一个非常简单的示例,考虑一个配置为可执行的 shell 脚本 foo.sh:

    ./foo.sh
    ./foo.sh -o

并且代码的foo.sh工作方式类似于

    #!/bin/sh
    if  ## option -o is turned on
        ## do something
    else
        ## do something different
    endif

是否有可能以及如何做到这一点?谢谢。

4

4 回答 4

32
$ cat stack.sh 
#!/bin/sh
if  [[ $1 = "-o" ]]; then
    echo "Option -o turned on"
else
    echo "You did not use option -o"
fi

$ bash stack.sh -o
Option -o turned on

$ bash stack.sh
You did not use option -o

供参考:

$1 = First positional parameter
$2 = Second positional parameter
.. = ..
$n = n th positional parameter

有关更简洁/灵活的选项,请阅读其他线程:使用 getopts 处理长短命令行选项

于 2013-01-25T00:33:47.157 回答
20

这是如何在一个脚本中执行此操作的方法:

#!/usr/bin/sh
#
# Examlple of using options in scripts
#

if [ $# -eq 0 ]
then
        echo "Missing options!"
        echo "(run $0 -h for help)"
        echo ""
        exit 0
fi

ECHO="false"

while getopts "he" OPTION; do
        case $OPTION in

                e)
                        ECHO="true"
                        ;;

                h)
                        echo "Usage:"
                        echo "args.sh -h "
                        echo "args.sh -e "
                        echo ""
                        echo "   -e     to execute echo \"hello world\""
                        echo "   -h     help (this output)"
                        exit 0
                        ;;

        esac
done

if [ $ECHO = "true" ]
then
        echo "Hello world";
fi

点击这里查看来源

于 2015-05-11T20:09:18.947 回答
4

是的,您可以为此目的使用内置的 shellgetopts或独立的 shell。getopt

于 2013-01-25T00:38:06.123 回答
0

您可以遍历参数并以任何顺序读取选项。这是一个例子。有关使用此代码的脚本,请参阅 -脚本示例

#Example
OPTION_1=""
option_array[0]="1"
option_array[1]="2"

options="$@"


set_options(){
    prev_option=""

    for option in $options;
    do
        case $prev_option in
            "-t" )
                OPTION_1=$option
            ;;
            "-d" )
                option_array+=("$option")
            ;;
            "-g" )

                option_array_2+=("$option")
            ;;

        esac

        prev_option="$option"

    done

}

function test()
{
    set_options

    echo $OPTION_1
    echo ${option_array[*]}
    echo ${option_array_2[*]}

}


test
于 2018-12-01T13:36:05.453 回答