2012-02-19 2 views
3

나는 원하는 것을 얻기 위해 무수한 방법을 시도했지만 아무것도 작동하지 않는 것 같습니다. 나는 항상 2:not found과 같은 것으로 끝난다.ZSH에서 출력 명령 캡처 및 테스트

내가 지금처럼 명령의 출력을 캡처 한 다음이 동일한 경우 테스트 할

"!"

function test() { 
    local testv=$(command) 2>/dev/null 
    if [ $(#testv) == "!" ]; then 
    echo "Exclamation mark!" 
    else 
    echo "No exclamation mark." 
    fi 
} 

가 어떻게 오류 test:2: = not found을 방지하기 위해 위의 코드를 다시 작성해야합니까?

답변

2

이 작동합니다 :

if [ $testv = '!' ]; then 

몇 가지 문제가 여기에 있었다 :

  • $(...)는 명령 대체를 실행 출력; 변수 값을 대체하려고하므로 $var 또는 ${var}을 사용하십시오.
  • #님께 서 무슨 일을했는지는 전혀 알 수 없습니다. ${#var}은 $ var의 길이를 가져 오지만, 여기서 원하는 것은 아닙니다.
  • test 명령 ==을 이해하고, 그래서 =를 사용하지 않습니다 ([는 동의어입니다) (당신이 잘못을 살펴 보겠습니다 C 프로그래머라면,하지만이 쉘하지 C)입니다.
  • 이 문제는 스크립트에서 발생하지 않는다고 생각되지만 대화 형 입력 "!"은 예상 한대로 수행되지 않습니다. 느낌표를 기록 옵션으로 해석 할 수 없도록 '!'을 사용했습니다. 이 == 이해 (일반 다소 청소기 구문은) 이후

다른 방법으로, 당신은, [ ] 대신 [[ ]]을 사용할 수 BTW

if [[ $testv == '!' ]]; then 

을,이 스크립트는 태그로부터 신뢰 해요 zsh에서 실행; 그렇지 않다면 구문은 약간 달라질 것입니다 (기본 셸은 [[ ]]이 없으며 큰 따옴표로 묶이지 않으면 zsh가 $ testv의 값을 원하지 않는 구문 분석을합니다). 확실하지 않은 경우 (또는 이식하기를 원하는 경우) POSIX 호환 쉘에서 작동해야하는 버전은 다음과 같습니다.

if [ "$testv" = '!' ]; then 
2

이 함께 시도 :

local testv=$(command 2>/dev/null) 

당신이 리디렉션 할 명령의 출력이기 때문에.

(난 당신이 생각 $(#testv) 무슨 뜻인지 모르겠어요.)