@whitest
Развивающийся сисадмин

Как указать несколько условий с логическим ИЛИ для if, которые содержат *?

Есть скрипт, который должен принимать аргументы, вводимые пользователем. В нём нужно в цикле if then else указать несколько переменных в if, чтобы их начало было вроде qwerty*, asddfg* и т.д., то есть после определённого заданного набора символов можно подставить любой и if сочтёт это за положительный ответ.
В общем, примерно так:
if [[ $1 != video* || audio* || pic* ]]
then
echo error
else 
echo success
fi


Как только не пробовал, в чём беда, не понимаю. Если указывать только одно условие, то всё работает.
Возможно ли как-то переписать, главное чтобы можно было задать несколько условий.
  • Вопрос задан
  • 2096 просмотров
Решения вопроса 1
@RPG
|| разделяет выражения, $1 != video* является выражением, а просто audio* - нет.

Но я бы решил эту задачу через case:
case $1 in
video*|audio*|pic*) echo ok;;
*) echo error;;
esac
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
#!/bin/bash

test_parameter()
{
    echo "$1" | grep -q '\(video\|audio\|pic\)\*'
}

if ! test_parameter "$1"; then
    echo error
else
    echo success
fi

exit 0


Вывод
[guest@localhost sh]$ ./t.sh video
error
[guest@localhost sh]$ ./t.sh video*
success
[guest@localhost sh]$ ./t.sh audio
error
[guest@localhost sh]$ ./t.sh audio*
success
[guest@localhost sh]$ ./t.sh x
error
[guest@localhost sh]$


Ещё вариант (всё на функциях)
#!/bin/bash

error()
{
   echo "error: $1" 1>&2
}

ok()
{
   echo "success: $1" 1>&2
}

test_parameter()
{
    echo "$1" | grep -q '\(video\|audio\|pic\)\*'
}

main()
{
    if ! test_parameter "$1"; then
        error "incorrect parameter: \"$1\""
    else
        ok "parameter is correct"
    fi
}

main "$@" || exit 1

exit 0


Вывод
[guest@localhost sh]$ ./t.sh 
error: incorrect parameter: ""
[guest@localhost sh]$ ./t.sh video
error: incorrect parameter: "video"
[guest@localhost sh]$ ./t.sh video*
success: parameter is correct
[guest@localhost sh]$ ./t.sh audio
error: incorrect parameter: "audio"
[guest@localhost sh]$ ./t.sh audio*
success: parameter is correct
[guest@localhost sh]$ ./t.sh pic
error: incorrect parameter: "pic"
[guest@localhost sh]$ ./t.sh pic*
success: parameter is correct
[guest@localhost sh]$ ./t.sh x
error: incorrect parameter: "x"
[guest@localhost sh]$
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы