Как я могу сократить этот скрипт?
CODE="A"
if test "$CODE" = "A"
then
PN="com.tencent.ig"
elif test "$CODE" = "a"
then
PN="com.tencent.ig"
elif test "$CODE" = "B"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "b"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "C"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "c"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "D"
then
PN="com.rekoo.pubgm"
elif test "$CODE" = "d"
then
PN="com.rekoo.pubgm"
else
echo -e "\a\t ERROR!"
echo -e "\a\t CODE KOSONG"
echo -e "\a\t MELAKUKAN EXIT OTOMATIS"
exit
fi
shell-script
IISomeOneII
источник
источник
bash
код? Или ты имеешь в виду другую оболочку?example.org
иexample.net
т. Д., Поскольку эти домены специально зарезервированы для этой цели в RFC 2606 и никогда не будут использоваться для реальных объектов.Ответы:
Используйте
case
оператор (переносимый, работает в любойsh
подобной оболочке):Я также рекомендую изменить имена переменных со всех заглавных букв (например
CODE
) на строчные или смешанные (например,code
илиCode
). Есть много заглавных букв, которые имеют особое значение, и повторное использование одного из них случайно может вызвать проблемы.Другие примечания: Стандартное соглашение - отправлять сообщения об ошибках в «стандартную ошибку», а не в «стандартный вывод»;
>&2
редирект это делает. Кроме того, если скрипт (или программа) дает сбой, лучше всего выйти с ненулевым состоянием (exit 1
), поэтому любой вызывающий контекст может сказать, что пошло не так. Также можно использовать разные статусы для обозначения разных проблем ( хороший пример см. В разделе «КОДЫ ВЫХОДА» наcurl
странице руководства ). (Благодарим Стефана Шазеласа и Монти Хардера за предложения здесь.)Я рекомендую
printf
вместоecho -e
(иecho -n
), потому что он более переносим между операционными системами, версиями, настройками и т. Д. У меня когда-то была куча моих скриптов, потому что обновление ОС включало версию bash, скомпилированную с различными опциями, которая изменилаecho
поведение.Двойные кавычки
$CODE
здесь на самом деле не нужны. Строка в acase
является одним из немногих контекстов, где их можно оставить без присмотра. Тем не менее, я предпочитаю заключать в кавычки ссылки на переменные, если на то нет особой причины, потому что трудно отслеживать, где это безопасно, а где нет, поэтому безопаснее просто привычно заключать их в двойные кавычки.источник
*
(и печатать ошибку) - шаблон[aA]
соответствует либо «a», либо «A», но не оба одновременно.readonly Exit_BadCode=1
чтобы он мог сказатьexit $Exit_BadCode
вместо этого.case "${CODE,}" in
, чтобы каждое из условных обозначений стало простымa)
иb)
т. Д.$CODE
. Я всегда называю это «статусом выхода», а не просто «кодом». Если сценарию нужно использовать много сотен ключей для ссылки на строки, использованиеcase
оператора становится громоздким.Предполагая, что вы используете
bash
релиз 4.0 или новее ...В коде я определяю ассоциативный массив, содержащий все доменные имена, каждое из которых связано с одной буквой в нижнем регистре.
$PN
Переменной присваивается доменное имя , соответствующее нижнему регистру$CODE
значение (${CODE,,}
возвращает значение$CODE
превратились в строчные буквы только) из этого массива, но если$CODE
не соответствует действительной записи вdomain
списке, он выходит из сценария с ошибка.${variable:?error message}
Подстановки параметров будет расширяться до значения$variable
(соответствующего домена в коде) , но было бы выйти из сценария с сообщением об ошибке , если значение пусто не доступно. Вы не получите точно такое же форматирование сообщения об ошибке, как в вашем коде, но оно по существу будет вести себя так же, если$CODE
недействительно:Если вы заботитесь о количестве символов, мы можем сократить это далее:
Помимо удаления ненужных новых строк, я также удалил
com.
из каждого домена (вместо этого он добавляется в назначенииPN
).Обратите внимание, что весь приведенный выше код будет работать даже для многосимвольного значения в
$CODE
(если вdomain
массиве существуют ключи в нижнем регистре ).Если бы
$CODE
вместо этого был числовой индекс, основанный на нуле, это немного упростило бы код:Это дополнительно сделало бы действительно легким чтение
domain
массива из вспомогательного файла, содержащего одну запись в строке:источник
declare -A domain
просто говорит, что этоdomain
должна быть переменная ассоциативного массива ("hash").$CODE
.$CODE
не установлен или пуст, но после этого он все равно сгенерирует правильное пользовательское сообщение об ошибке.Если ваша оболочка допускает массивы, самый короткий ответ должен быть таким, как в примере с bash:
Это предполагает, что это
$code
может быть только a, b, c или d.Если нет, добавьте тест как:
источник
${var,}
преобразуется в нижний регистр первого символа${var}
. @IISomeOneII${var,}
кажется, что Bash-специфичный, хотя. Я думаю, что ассоциативный массив будет работать в ksh и zsh тожеЯ собираюсь принять этот ответ в другом направлении. Вместо того, чтобы кодировать ваши данные в сценарий, поместите эти данные в отдельный файл данных, а затем используйте код для поиска файла:
Разделение этих проблем имеет несколько преимуществ:
look
для эффективного двоичного поиска (а не построчноgrep
илиawk
)источник
PN
чтобы установить правильное значение.Вы используете буквы для индексации значений, если вы должны использовать числа, это становится так просто, как:
Это переносимый код оболочки, который будет работать на большинстве оболочек.
Для Баша вы можете использовать:
pn=${!code}
или для Баша / КШ / ЗШ использования:pn=${@:code:1}
.письма
Если вам нужны пользовательские буквы (от a до z или от A до Z), они должны быть преобразованы в индекс:
В более длинном коде, чтобы уточнить смысл и значение каждой части:
Если вам нужно преобразовать значения в нижний регистр, используйте:
$(( asciival & ~32 ))
(убедитесь, что бит 6 значения ascii не установлен).код ошибки
Вывод, который ваш скрипт печатает при ошибке, довольно длинный (и особенный).
Самый универсальный способ справиться с этим - определить функцию:
А затем вызовите эту функцию с конкретными сообщениями, которые вам нужны.
Обратите внимание, что результирующее значение выхода дается как
exitcode
(пример здесь 27).Полный сценарий (с проверкой ошибок) становится:
источник