Первая попытка ограничить длину кода на 1 линии.
if [ [ "$1" != "-l" ]
&& [ "$1" != "-a" ]
&& [ "$1" != "-h" ]
&& [ -n "$1" ]
&& ([ "$1" = "-d" ]
|| [ "$1" = "-mv" ]
|| [ "$1" = "-dv" ]
|| [ "$1" = "-mr" ]
|| [ "$1" = "-dr" ]) ];
Я добавил фигурные скобки, чтобы понять, что вы имеете в виду с помощью или.
Теперь вы можете объединить все матчи с регулярным выражением:
if [[ ! ("$a" =~ ^-(l|a|h|d|)$)
&& "$a" =~ ^-(mv|dv|mr|dr)$ ]]; then
echo "Yes $a matches"
fi
но пересмотреть то, что вы тестируете. Тест будет действителен только тогда, когда он соответствует -mv/-dv/-mr/-dr
, поэтому вам не нужно тестировать параметры lah
.
if [[ "$a" =~ ^-(d|mv|dv|mr|dr)$ ]]; then
echo "Yes $a matches"
fi
Вы можете использовать переменный для извлечения параметров:
options="d|mv|dv|mr|dr"
if [[ "$a" =~ ^-(${options})$ ]]; then
echo "Yes $a matches"
fi
Everytime код становится трудно читать (а также для длинного кода или повторяющиеся утверждения), следует рассмотреть возможность использования функции.
Следующая функция коротка, но трудно читать:
options="d|mv|dv|mr|dr"
function checkoption1 {
[[ "$a" =~ ^-(${options})$ ]]
}
checkoption1 "$a" &&
echo "Yes $a matches"
я выбрал бы для немного более развернутой функции. Я покажу вам свои оригинальные тесты для lah
для показа возможностей.
# checkoption return 0 for match,
# returns 1 for forbidden option
# returns 2 for undefined option
function checkoption2 {
case "$1" in
-d|-mv|-dv|-mr|-dr) return 0 ;;
-l|-a|-h|"") return 1;;
*) return 2;;
esac
}
checkoption2 "$a" &&
echo "Yes $a matches"
Перед тем, как принять код, вы должны сделать несколько тестов.
Я сделал несколько тестов с небольшой петлей (теперь все ответы вместе)
function checkoption1 {
[[ "$a" =~ ^-(${options})$ ]]
}
# checkoption return 0 for match,
# returns 1 for forbidden option
# returns 2 for undefined option
function checkoption2 {
case "$1" in
-d|-mv|-dv|-mr|-dr) return 0 ;;
-l|-a|-h|"") return 1;;
*) return 2;;
esac
}
for a in -mv mv -mvx -ms -mr -dr; do
if [[ ! ("$a" =~ ^-(l|a|h|)$)
&& "$a" =~ ^-(d|mv|dv|mr|dr)$ ]]; then
echo "Yes $a matches"
fi
if [[ "$a" =~ ^-(d|mv|dv|mr|dr)$ ]]; then
echo "Yes $a matches"
fi
options="d|mv|dv|mr|dr"
if [[ "$a" =~ ^-(${options})$ ]]; then
echo "Yes $a matches"
fi
checkoption1 "$a" &&
echo "Yes $a matches"
checkoption2 "$a" &&
echo "Yes $a matches 2"
done
Возможно сделать список допустимых/недопустимых значений, а затем [проверить, что этот список делает/не содержит '$ 1 '] (http://stackoverflow.com/questions/8063228/how-do-i-check-if-a-variable-exists-in-a-list-in-bash) –
Возможно, вы хотите использовать команду 'getopt' для параметры командной строки синтаксического анализа для вас? –
@ G.Sliepen, [передовые практики] (http://mywiki.wooledge.org/BashFAQ/035) не связаны с 'getopt'. –