2012-12-31 1 views
8

가능한 중복 :이 AS3 또는 Java 인 경우
Ternary operator (?:) in Bashbash에 인라인 if와 할당 (3 진 조건부)이 있습니까?

, 나는 다음을 수행합니다 : 필요, 불필요하게 복잡한 것 같다

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt"; 

그러나 쉘

, 몇 줄의 코드와 꽤 많은 반복 코드가 포함되어 있습니다.

if [ $useDefault ]; then 
    fileName="$dirName/$defaultName.txt" 
else 
    fileName="$dirName/$customName.txt" 
fi 

모든 것을 한 줄로 압축 할 수는 있지만 명료하게 희생됩니다.

셸에서 변수 할당을 사용하여 인라인 if을 작성하는 더 좋은 방법이 있습니까?

+0

윌리엄 퍼셀 (William Purcell)의 대답은 나의 것보다 덜 직접적이지만 '$ useDefault'가 기본 이름을 사용할지 여부를 제어한다고 가정하면 클리너 솔루션이 될 수 있습니다. –

+0

나는 모든 것을 정확하게 인용 할 내 대답을 업데이트했다. –

답변

9

쉘에는 ?: 조건 연산자가 없지만,이 같은 좀 덜 중복 코드를 만들 수 :

if [ $useDefault ]; then 
    tmpname="$defaultName" 
else 
    tmpname="$customName" 
fi 
fileName="$dirName/$tmpname.txt" 

또는 당신이 ?: 연산자와 같은 역할을 자신의 쉘 기능을 작성할 수

cond() { 
    if [ "$1" ] ; then 
     echo "$2" 
    else 
     echo "$3" 
    fi 
} 

fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt" 

그래도 과장 될 수 있습니다. (그리고 세 가지 인수 모두를 평가합니다.)

고든 데이비슨 (Gordon Davisson)에게 감사의 말을 인용 해 주신 덕분에 $(...) 내에 중첩됩니다.

+0

첫 번째 해결책은 반복적 인 코드를 저장하지만 실제로 나는 응답을 받아 들인 이유 인'cond' 함수를 정말 좋아합니다. – IQAndreas

+0

'fileName = "$ dirname/$ (cond"$ useDefault ""$ defaultName ""$ customName ")과 같이 큰 따옴표 안에'$ (cond ...) - 문자열에 대한 거의 확실하게 원치 않는 추가 구문 분석을 방지합니다. cond 반환합니다. –

+0

@GordonDavisson : 나는 그것에 대해 생각했지만 변수 참조를 따옴표 밖에서'$ useDefault' 외로 남겨 둡니다. 나는 좋은 해결책이 있는지 확신하지 못한다. –

16

그냥 쓰기 : 그것은 useDefault을 확인하지 않기 때문에

fileName=${customName:-$defaultName}.txt 

그것은 당신이 무엇을 같은 꽤있다. 대신, 그냥 customName 설정되어 있는지 확인합니다. 기본값 인 useDefault을 설정하는 대신 customName의 설정을 해제하면됩니다.

+0

이': -' 연산자에 대한 자세한 정보를 제공해 주시겠습니까? (또는 Google에서 검색 할 수있는 이름) – IQAndreas

+1

bash 맨 페이지에서': -'를 검색하면됩니다. 'sh' 문서는'매개 변수 확장 '과 같은 제목 아래에 이것을 기술 할 것입니다. –

+4

bash의 경우 [매개 변수 확장] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion)을 참조하십시오. POSIX 셸의 경우 [매개 변수 확장] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02)을 참조하십시오. –