在运行时传递参数时,使用getopt(s)运行脚本的特定部分

时间:2014-08-28 21:12:38

标签: android bash shell getopt getopts

我已经编写了一个用于在android上配置SSH daemom等的长bash脚本。问题是,它已经太长了有时其他用户或我可能只想配置脚本必须提供的某些方面。每次运行时都不必遍历整个脚本,我想添加一些选项来指示将要运行的内容,但是当没有指定任何内容时仍然能够运行脚本。

类似的东西:

myscript -d -o -p

或者

myscript -dop    

可以找到脚本here。我觉得这里发布的时间太长了。

基本上它分成了5个这样的区块:

#!/system/xbin/bash

echo "---SECTION-ONE---"

read
if test then  

while true
do

我抬头使用了getopts并且不能完全包围它,但是没有一个与我正在做的事情相匹配的例子。这就是我在这里发帖的原因;)一如既往地感谢任何一次进攻。

2 个答案:

答案 0 :(得分:2)

您可以将脚本的不同主体分解为可在存在选项时调用的函数。

#!/bin/bash

printing_stuff (){
    echo "---SECTION-ONE---"
}

test_input (){
    read -p "Enter something: " input
    if [[ $input == something ]]; then
        echo "test successful"
        # do some stuff
    fi
}

body_loop (){
    while true; do
        echo "this is the loop"
        # some stuff
        break
    done
}

if [[ $@ ]]; then
    while getopts "dop" opt; do
        case $opt in
            d)
                printing_stuff
                ;;
            o)
                test_input
                ;;
            p)
                body_loop
                ;;
            \?)
                ;;
        esac
    done
else
    printing_stuff
    test_input
    body_loop
fi

如果脚本的参数存在,则[[ $@ ]]测试仅运行getopts循环,否则运行所有内容。

答案 1 :(得分:1)

以下是这些选项的示例,但如果有更多信息,我会进行编辑。这假设参数不带任何变量文本:

#!/bin/bash

usage() {
    echo "$0 [-d] [-o] [-p]"
    exit 1
}

d=false o=false p=false

while getopts "dop" option; do
    case "${option}" in
        d)
            d=true
            ;;
        o)
            o=true
            ;;
        p)
            p=true
            ;;
        *)
            usage
            ;;
    esac
done

echo "d = $d"
echo "o = $o"
echo "p = $p"

使用示例:

$ ./test.sh -dop
d = true
o = true
p = true
$ ./test.sh -d -o -p
d = true
o = true
p = true
$ ./test.sh -d
d = true
o = false
p = false

您可以将变量值设置为您要测试的任何值,例如:

if [ "$d" == "true" ]; then
    # do something
else
    # do something else
fi