Как мне проверить, является ли ввод одним словом или 2, разделенными разделителем «-«

#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. Как мне проверить, является ли ввод «одним словом» или двумя словами, разделенными разделителем «-«?
  2. Если ввод состоит из двух слов, как я могу их разделить?

Ответ №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