2013-04-24 3 views
0

zsh에서 매개 변수 확장 중에 문제가 있습니다. 변수를 따옴표로 묶습니다.zsh : 매개 변수 확장 따옴표 삽입

내 스크립트는 다음과 같습니다. (사과는 소음, 유일한 진짜 중요한 라인은 find 호출로 마지막이지만, 나는 확실히 내 코드의 자세한 내용은 숨어 있지 않다 만들고 싶어)을에, 그냥 명확하게하기 위해

#broken_links [-r|--recursive] [<path>] 
    # find links whose targets don't exist and print them. If <path> is given, look 
    # at that path for the links. Otherwise, the current directory is used is used. 
    # If --recursive is specified, look recursively through path. 
    broken_links() { 
     recurse= 
     search_path=$(pwd) 

     while test $# != 0 
     do 
       case "$1" in 
         -r|--recursive) 
           recurse=t 
           ;; 
         *) 
           if test -d "$1" 
           then 
             search_path="$1" 
           else 
             echo "$1 not a valid path or option" 
             return 1 
           fi 
           ;; 
       esac 
       shift 
     done 

     find $search_path ${recurse:--maxdepth 1} -type l ! -exec test -e {} \; -print 
    } 

find 라인을 사용하고 싶습니다. recurse이 null 인 경우 -maxdepth 1을 대입하면됩니다. recurset으로 설정된 경우 아무 것도 대체하지 않습니다 (즉, 일반적인 재귀 동작을 찾으십시오).

실제로는 ${name:-word} 양식이지만 word은 실제로 하이픈으로 시작하기 때문에보기에는 별 의미가 없습니다. (주변 시세를 참고) recurse가 null의 경우, 그것은 "-maxdepth 1" 대체,

대신, 어떤 일어나는 것은 (여기 http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion이에 대한 자세한 내용을 참조하십시오) 및 recurse가 설정되어있는 경우, 그것은 ""를 대체합니다.

재귀가 발생하지 않을 때의 정확한 오류는 find: unknown predicate `-maxdepth 1'입니다. 예를 들어 find "-maxdepth 1"이라고 말하면됩니다. 우리가 재귀를 원할 때, 나는 이상하게도 설명 할 수 없지만 오류는 find `t': No such file or directory입니다.

누구든지이 매개 변수 확장에 따옴표를 넣지 않는 방법을 알고 있습니까? 나는 그것이 내 문제라고 여기에서 믿는다.

감사합니다.

답변

2

실제로 zsh는 따옴표를 추가하지 않고 단지 매개 변수 확장 결과로 이라는 단어를 사용하지 않습니다. 이것은 이 기본적으로 동작하는 것을 문서화 한 것입니다. 매개 변수 확장 섹션의 시작 근처 zshexpn 사람이 페이지에서 : 분할을 야기

Note in particular the fact that words of unquoted parameters are not 
automatically split on whitespace unless the option SH_WORD_SPLIT is set 

그래서, 당신은 setopt sh_word_split을 수행하여이 옵션을 설정할 수 있습니다, 모든 매개 변수 확장을 위해 수행 또는 명시 적으로 할 수있다 사용하여 단지 확장을위한 을 요청 :

${=recurse:--maxdepth 1} 

참고 괄호 안에있는 첫 번째 문자로 = 로그인합니다. zshexpn 매뉴얼 페이지에 라고 기록되어 있으며 ${=spec}을 검색하십시오.

+0

그랬습니다! 감사! –