#awk #ksh
#awk #ksh
Вопрос:
Мне нужна помощь со следующим ksh
сценарием:
ExpResult=`echo "$LoadString" | awk -F"-" '{print NF}'=2`
MinExp=`echo "$ExpResult" | tr -s " " | sed 's/^[ ]//g'| cut -d"-" -f1`
MaxExp=`echo "$ExpResult" | tr -s " " | sed 's/^[ ]//g'| cut -d"-" -f2`
Я могу получить ввод в виде двух вариантов: «50-100» или «50» (например)
У меня два вопроса:
- Как мне проверить, является ли ввод «одним словом» или двумя словами, разделенными разделителем «-«?
- Если ввод состоит из двух слов, как я могу их разделить?
Ответ №1:
Вместо того, чтобы вызывать внешнюю программу для анализа ваших входных данных, вы можете использовать внутреннюю case
инструкцию для проверки функций ввода и расширения параметров для преобразования ваших входных данных, т.Е.
# set a copy/paste value for $1
set -- 50-10
case "$1" in
*-* )
range="$1"
min="${range%-*}"
max="${range#*-}"
;;
* )
singleNum="$1"
;;
esac
echo min=$min ... max=$max
вывод
min=50 ... max=100
Попробуйте не использовать пару
unset min max
set -- other values
case ...
echo min= ... max= ... singleNum=$singleNum
вывод
min= ... max= ... singleNum=other
Надеюсь, обработка регистра понятна сама по себе, но расширение параметров может потребовать небольшого объяснения.
Оператор
min=${range%-*}
говорит удалить из правой части расширенного значения (50-100) все, что начинается с последнего -
до конца строки. При этом значение 50
остается неизменным.
Обратное происходит с
max=${range#*-}
Говорит удалить из левой части расширенного значения все, что угодно, вплоть до первого -
символа. Это оставляет 100
.
Поскольку в этой строке есть только один -
символ, вам не нужно беспокоиться о других версиях ${var##*-}
, в которых говорится удалить все слева до последнего совпадения -
, и наоборот ${var%%-*}
, удалить все справа (назад) до самого первого -
символа.
Фанатичные минималисты напомнят нам, что это можно сделать без временной переменной, т.е.
min=${1%-*} ; max=${1#*-}
И однострочные фантазеры могут быть удовлетворены
case "$1" in *-* ) range="$1";min="${range%-*}";max="${range#*-}";;* ) singleNum="$1";;esac; echo min=$min ... max=$max .,, singleNum=$singleNum
🙂
Я
Комментарии:
1.
IFS='-'
Также приходит на ум разделение с помощью. Затем вы можете использовать встроенную оболочку$#
, чтобы найти количество токенов.2. @tripleee : хорошая идея. Не получил ответа от O.P., так что не стоит, если я буду тратить больше времени на ответ, который не помогает или нет.
Ответ №2:
вы можете попробовать это;
LoadString=$1
MinExp=`echo "$LoadString" | awk -F"-" '{if (NF==2) print $1}`
MaxExp=`echo "$LoadString" | awk -F"-" '{if (NF==2) print $2}`
echo $MinExp
echo $MaxExp
например:
user@host:/tmp/test$ ksh test.ksh 50-100
50
100