Как написать скрипты оболочки Unix с параметрами?

Я не знаю, возможно ли это, но я хочу написать сценарии оболочки, которые действуют как обычные исполняемые файлы с параметрами. В качестве очень простого примера рассмотрим сценарий оболочки foo.sh, который настроен на выполнение:

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

и код foo.sh работает как

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

Возможно ли и как это сделать? Благодарю.

Ответ 1

$ 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

FYI:

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

Для более опрятных/гибких опций читайте эту другую ветку: Использование getopts для обработки длинных и коротких опций командной строки

Ответ 2

это способ, как это сделать в одном скрипте:

#!/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

щелкните здесь для получения источника

Ответ 3

Да, вы можете использовать встроенные средства getopts или автономный getopt для этой цели.

Ответ 4

Вы можете перебирать аргументы и читать параметры в любом порядке. Вот пример. Для скрипта, использующего этот код, см. Пример сценария

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

options="[email protected]"


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