2011-01-25 11 views
2

나는 다음과 같은 논리를 사용하는 스크립트가 있습니다. 그러나 bash 설명서의 Shell Parameter Expansion 섹션을 읽는 중 하나의 단계로 수행 할 수 있어야합니다. 그러나, 나는 그것을 어떻게하는지 주위에 내 머리를 감쌀 수 없다.배쉬 매개 변수 확장

이 나는 ​​시도했다 :

ACTION=${1:-echo}    # ends up with $1 in $ACTION 

ACTION=${1:+} 
ACTION=${ACTION:-echo}   # ends up always 'echo' 

하고 중첩의 몇 가지 방법이 있지만 중첩는 지금까지 내가 말할 수있는 허용 될 것으로 보인다.

실용적인 해결책이 있다는 것을 알고 있지만, 지금 가능하다면 진정으로 궁금합니다. 그것은 3 진수 연산자로는 직선적 인 것이지만, bash에는 하나가 있다고 생각하지 않습니다.

가능하다면 if/else 구문없이 2 단계 프로세스 인 것처럼 보이지만 기능의 조합 만 사용하는 논리를보고 싶습니다.

감사합니다. elderarthis에 대한


편집 :

스크립트의 나머지 부분은 그냥 :

find . -name "*\?[NMSD]=[AD]" -exec ${ACTION} rm -f "{}" + 

난 그냥 실제로 인수를합니다 통과, 따라서, 자신에 대한 전성 검사로 ACTION=echo을 원하는 ($ {ACTION}을 무효화하여 삭제를 수행하고, args를 전달하지 않으면 에코가 사라집니다.

A nd 나는 TIMTOWTDI를 안다;

$ cat honk.sh 
#!/bin/bash 
ACTION=${1-echo} 
echo $ACTION 
$ ./honk.sh 
echo 
$ ./honk.sh foo 
foo 

마지막 요구 사항을 ACTION=''을 가지고 : 나는 미켈 대한


편집 :-) 쉘 매개 변수 확장 섹션에서 바로 물건을 함께 할 수 있는지 찾고 있어요 , 따라서 빈 줄/널 값을 리턴합니다.

+0

첫 번째 스크립트는 꽤 기본적인 두 줄짜리 스크립트로 작동합니다. 어쩌면 스크립트의'ACTION' 부분을 제공 할 수 있을까요? – eldarerathis

+0

@elderarthis : 업데이트되었습니다. –

+0

@Sdaz MacSkibbons : 아, 전화 끊기가 지금 어디 있는지 알 수 있습니다. 나는 이것을 처음 읽을 때 당신이하려고했던 것을 실제로 잘못 해석했습니다. – eldarerathis

답변

5

, 나는 내가 사용하는 거라고 생각 :

ACTION=${1:+' '} 
: ${ACTION:=echo} 

이 약간 요령 - 그것보다는 빈 조치를 생성 스크립트에 대한 인수가 있으면 빈 동작. 인수가 없으면 ACTION은 두 x 째 행 전에 비어 있습니다. 두 번째 줄에서 action이 비어 있다면 'echo'로 설정하십시오. 확장에서, (올바르게) $ ACTION을 인용하지 않으므로 공백에 인수가 전달되지 않습니다.

테스터 (xx.sh) :

ACTION=${1:+' '} 
: ${ACTION:=echo} 

echo $ACTION rm -f a b c 

테스트 : 마지막 줄이 잘못된 경우

$ sh xx.sh 1 
rm -f a b c 
$ sh xx.sh 
echo rm -f a b c 
$ sh xx.sh '' 
echo rm -f a b c 
$ 

후 플러스 전에서 결장을 제거합니다. 서브 셀이 허용한다면


, 이들 두 개의 단일 라인들 중 하나가 작동 :

ACTION=$([ -z "$1"  ] && echo echo) 
ACTION=$([ -z "${1+X}" ] && echo echo) 

위와 제 버전으로 제 대응한다 (빈 첫번째 인수 부재로 취급된다); 두 번째는 현재와 같이 빈 인수를 다룬다. 당신은 쓸 수 :

ACTION=$([ -z "${1:+X}" ] && echo echo) 

두 번째 명확와의 관계를 만들기 위해 - 당신은 하나 또는 다른, 둘을 사용하는거야 제외. 내 댓글에 가격 인하 표기법 (또는 내가 잘못을 가지고 있지만 충분히 빨리 그것을 수정하지 않았다) 시스템을 혼동하기 때문에


, 내 마지막 코멘트 (약간 수정) 읽어야

표기법 ${var:+' '}은 '$var이 설정되고 비어 있지 않은 경우, +'다음에 나오는 것을 사용합니다 (이 경우 하나의 공백 임). ${var+' '}이라는 표기는 '$var이 비어 있는지 여부에 관계없이'설정되면 '+'다음에 오는 것을 사용합니다.이 다른 확장은 유사하다 :

  • ${var:=X}는 - 이미 비어 있지 않은 값을 가지고 있지 않는 X$var을 설정합니다.
  • ${var:-X}는 -가 아닌 빈 값을 가지며, $var가 설정 경우 X으로 확장하거나 결장을 삭제하는 시험의 '비어있는'부분을 제거

비어 있으면 $var으로 확장된다.

+0

+1 니스. 더러운 방법으로. :-) – Mikel

+0

티켓입니다! 고맙습니다. 나는 그것이 가능해야한다는 것을 알았지 만, 개발자들이 전체 진리표를 설명하지 않았는지 궁금해지기 시작했습니다. {bash} 맨 페이지에서 찾을 수없는 호기심 때문에'$ {1 : + ''}와'$ {1+ ''}'(콜론 제거)의 차이점은 무엇입니까? –

+1

': +'는'$ 1'이 설정되지 않은 경우 RHS를 사용하고, '$ 1'이''''이면 RHS도 사용합니다. – Mikel

2
ACTION=${1:-echo} 

이 맞습니다.

$1 (예 : set 명령 이전)이 수정되기 전에 스크립트 상단 부근에 있는지 확인하십시오. 또한 $1이 함수의 첫 번째 매개 변수이기 때문에 함수 내부에서 작동하지 않습니다.

$1도 설정되어 있지만 null 인 경우 확인하십시오. 전화 번호는 ACTION=${1-echo}입니다 (:은 없습니다).


업데이트

아, 나는 정말 그렇지 않으면 이해가되지 않았기 때문에 당신이 반대를 의미해야합니다 가정합니다.

그것은 여전히 ​​이상한 것 같다,하지만 어쩌면 당신이 뭔가 싶어, 정신 운동 추측 :

#!/bin/bash 
shopt -s extglob 
ACTION=$1 
ACTION=${ACTION:-echo} 
ACTION=${ACTION/!(echo)/} # or maybe ACTION=${ACTION#!(echo)} 
echo ACTION=$ACTION 

그것은 매우 옳지 않아 : 그것은 ACTION=o을 제공합니다,하지만 내가 그 라인을 따라 뭔가 일을한다고 생각합니다.

echo$1으로 전달하면 에코로 유지되지만 그다지 좋지 않다고 생각합니다.

끔찍한 추악하지만 질문 할 때 그 사실을 알았습니다. :-) 나는 미만 4 선없이 서브 쉘에서 그 일을 주장하는 경우

+1

cmdline 매개 변수가 전달되면'ACTION'을 $ 1로 설정합니다. cmdline 매개 변수가 전달되면 무효화하거나 cmdline 매개 변수가 전달되지 않으면 'echo'로 설정합니다. (원래 질문의 if/else 문에있는 논리). 나는 결과물을 가지고 질문을 편집했다. –

+0

예. 이것은 주로 호기심의 운동이었습니다. 감사! –