문제

Bash에서는 공백이 포함 된 인수를 피할 수 있습니다.

foo "a string"

이것은 또한 명령 또는 함수에 대한 인수에도 적용됩니다.

bar() {
    foo "$@"
}

bar "a string"

지금까지 너무 좋았지 만 전화하기 전에 논쟁을 조작하고 싶다면 어떨까요? foo?

이것은 작동하지 않습니다.

bar() {
    for arg in "$@"
    do
        args="$args \"prefix $arg\""
    done

    # Everything looks good ...
    echo $args

    # ... but it isn't.
    foo $args

    # foo "$args" would just be silly
}

bar a b c

그렇다면 인수에 공백이 포함되어있을 때 어떻게 인수 목록을 작성합니까?

도움이 되었습니까?

해결책

이를 수행하는 두 가지 방법이 있습니다.

  1. 배열을 사용하고 사용하여 확장하십시오 "${array[@]}":

    bar() {
        local i=0 args=()
        for arg in "$@"
        do
            args[$i]="prefix $arg"
            ((++i))
        done
    
        foo "${args[@]}"
    }
    

    그래서 우리는 무엇을 배웠습니까? "${array[@]}" 그렇습니다 ${array[*]} 무엇 "$@" 그렇습니다 $*.

  2. 또는 배열을 사용하지 않으려면 사용해야합니다. eval:

    bar() {
        local args=()
        for arg in "$@"
        do
            args="$args \"prefix $arg\""
        done
    
        eval foo $args
    }
    

다른 팁

다음은 숫자 색인을 사용할 필요가없는 짧은 버전입니다.

(예 : a find 명령)

dir=$1
shift
for f in "$@" ; do
    args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"

사용 배열 (중 하나 숨겨진 기능 bash에서).

작은 디테일이 변경된 상태에서 제안한대로 배열을 사용할 수 있습니다. Foo를 호출하는 줄은 읽어야합니다

 foo "${args[@]}"

나는 이것에도 문제가 있었다. Bash 스크립트를 작성하여 Windows 컴퓨터 (Cygwin)의 중요한 파일을 백업했습니다. 배열 접근 방식도 시도했지만 여전히 몇 가지 문제가있었습니다. 내가 어떻게 고정했는지 정확히 잘 모르겠지만, 여기에 도움이 될 경우 내 코드의 부분이 중요합니다.

WORK="d:\Work Documents\*"
#   prompt and 7zip each file
for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
do
    echo "Add $x to archive? (y/n)"
    read DO
    if [ "$DO" == "y" ]; then
        echo "compressing $x"
        7zip a $W_OUTPUT "$x"
    fi
    echo ""
done
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top