2016-10-10 2 views
1

: 나는 두 가지 옵션으로 입력을받을 수어떻게 입력 구분자로 구분 한 단어 또는 2 인 경우 내가 확인 할 "-"나는 다음 <code>ksh</code> 스크립트 도움이 필요

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": I는 입력이 "하나 개의 단어"또는 두 단어 구분 기호로 구분 있는지 확인하려면 어떻게해야

  1. "-"를?
  2. 입력이 두 단어 인 경우 어떻게 분리 할 수 ​​있습니까?

답변

0

시도해 볼 수 있습니다.

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 

예 :

[email protected]:/tmp/test$ ksh test.ksh 50-100 
50 
100 
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 
출력

비 쌍 515,
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%%-*} 제거 모두 오른쪽에서부터 (뒤로) 처음까지 - char까지.

이 임시 변수없이 할 수 있다는 것을 우리에게 상기시켜 것 광신적 인 미니멀


, 즉

min=${1%-*} ; max=${1#*-} 

그리고 한 줄의 환타지는

case "$1" in *-*) range="$1";min="${range%-*}";max="${range#*-}";;*) singleNum="$1";;esac; echo min=$min ... max=$max .,, singleNum=$singleNum 

만족 될 수 있습니다 -)

linux

+0

'IFS = '-''로 나눌 수도 있습니다. 그런 다음 쉘의 내장'$ # '을 사용하여 토큰 수를 찾을 수 있습니다. – tripleee

+0

@ tripleee : 좋은 생각. O.P.로부터 답장을받지 못 했으므로 도움이되지 않는 답을 위해 더 많은 시간을 낭비한다면 안됩니다. – shellter