Как эффективно проверять аргументы, передаваемые скрипту bash?

Как указывает @stolenmoment, новые разрешения точки монтирования отражают разрешения корневого каталога смонтированной файловой системы.

На самом деле вы пытаетесь разрешить worldдоступ к файловой системе для этого монтирования, а не редактировать фактические метаданные разрешений файловой системы.Это может быть необходимо при монтировании файловой системы FATили NTFS, где семантика разрешений FAT/NTFSне соответствует семантике UNIX-это приводит к тому, что смонтированная файловая система доступна только для mountпользователя (при использовании родного драйвера Linux; ntfs-3gпо умолчанию разрешает доступ к миру ).

Решение состоит в том, чтобы mountфайловая система использовала -o umask 000или что-то подобное.

0
14.11.2021, 17:33
2 ответа

Я обычно делаю это так, дайте мне знать, если это может вам помочь:

get_opts()
{
    while [[ $# -gt 0 ]]
    do
        key="$1"
        case $key in
            -u|--user)
                shift
                USER="$1"
                shift
                ;;
            -s|--server)
                shift
                SERVER="$1"
                shift
                ;;
            -h|--help)
                usage
                exit
                ;;
            -v|--version)
                version
                exit
            ;;
        *)  TASK="$1"
            shift
            shift
            ;;
        esac
    done
}
get_opts $*

Затем вы можете добавить использование функции, версию и т. д.

usage()
{
    echo "[-v] [-h] [-u user] [-s server] task"
}

Не идеальный, но хороший способ начать.

НОВЫЙ ПРИМЕР. Скопируйте этот код в файл. (Не забудьтеchmod +x)Это должно сделать то, что вам нужно.

#!/bin/bash
VERSION="0.0.1"
ACCEPTED_SERVER="server"
ACCEPTED_USER="user"

usage()
{
    echo " $(basename $0) [-v] [-h] -u user -s server"
    exit
}

version()
{
    echo "Current version: $VERSION"
}

get_opts()
{
    while [[ $# -gt 0 ]]
    do
        key="$1"
        case $key in
            -u|--user)
                shift
                USER="$1"
                shift
                ;;
            -s|--server)
                shift
                SERVER="$1"
                shift
                ;;
            -h|--help)
                usage
                exit
                ;;
            -v|--version)
                version
                exit
            ;;
        esac
    done
}

# echo " arguments: $#"
get_opts $*
if [ $# -gt 4 ] || [ $# -lt 1 ]; then
    usage
fi
echo "$SERVER -- $ACCEPTED_SERVER"
if ! [ "$SERVER" = "$ACCEPTED_SERVER" ]; then
    echo "Wrong server: $SERVER"
    echo "Try with user: $ACCEPTED_SERVER"
    usage
else
    echo "Correct server: $SERVER"

fi
if ! [ "$USER" = "$ACCEPTED_USER" ]; then
    echo "Wrong user: $USER"
    echo "Try with user: $ACCEPTED_USER"
    usage
else
    echo "Correct user: $USER"
fi

echo "Correct! - Server: $SERVER - User: $USER"
-2
14.11.2021, 18:43

Сценарий, который принимает только один аргумент, который должен быть либо a, b, либо c:

.
#!/bin/bash

if [[ $# -ne 1 ]]; then
    echo 'Too many/few arguments, expecting one' >&2
    exit 1
fi

case $1 in
    a|b|c)  # Ok
        ;;
    *)
        # The wrong first argument.
        echo 'Expected "a", "b", or "c"' >&2
        exit 1
esac

# rest of code here

Если вы хотите выполнить правильный синтаксический анализ параметров и принять -a, -bили -cкак параметры, не принимающие аргументы, и -dкак параметры, принимающие аргументы.

#!/bin/bash

# Default values:
opt_a=false
opt_b=false
opt_c=false
opt_d='no value given'

# It's the : after d that signifies that it takes an option argument.

while getopts abcd: opt; do
    case $opt in
        a) opt_a=true ;;
        b) opt_b=true ;;
        c) opt_c=true ;;
        d) opt_d=$OPTARG ;;
        *) echo 'error in command line parsing' >&2
           exit 1
    esac
done

shift "$(( OPTIND - 1 ))"

# Command line parsing is done now.
# The code below acts on the used options.
# This code would typically do sanity checks,
# like emitting errors for incompatible options, 
# missing options etc.

"$opt_a" && echo 'Got the -a option'
"$opt_b" && echo 'Got the -b option'
"$opt_c" && echo 'Got the -c option'

printf 'Option -d: %s\n' "$opt_d"

if [[ $# -gt 0 ]]; then
    echo 'Further operands:'
    printf '\t%s\n' "$@"
fi

# The rest of your code goes here.

Тестирование:

$./script -d 'hello bumblebee' -ac
Got the -a option
Got the -c option
Option -d: hello bumblebee
$./script
Option -d: no value given
$./script -q
script: illegal option -- q
error in command line parsing
$./script -adboo 1 2 3
Got the -a option
Option -d: boo
Further operands:
        1
        2
        3

Анализ опции завершается на первом аргументе опции, отличной от -, или на --. Обратите внимание, что поскольку -dпринимает аргумент, -aберется в качестве этого аргумента в приведенном ниже примере:

$./script -d -a -- -c -b
Option -d: -a
Further operands:
        -c
        -b
1
15.11.2021, 19:50

Теги

Похожие вопросы