Проблема с аргументом функции сценария bash [дубликат ate]

0
17.03.2016, 00:38
2 ответа

Если вы измените строку ARGS = "$ ARGS ' $ 1 '" до ARGS =" $ ARGS $ 1 " (удаление одинарных кавычек) должно работать.

0
28.01.2020, 04:51

(в Bash) Можно заменить на массив значений:

find2() {

    ARGS="/usr/bin/find"
    ARGS+=( "$@" )
    echo CALLING:  "${ARGS[@]}"
    "${ARGS[@]}"

}

find2 /tmp/test -name "hello.c"

Но это работает и гораздо проще:

find2() {
    ARGS=( "/usr/bin/find" "$@" )
    echo CALLING:  "${ARGS[@]}"
    "${ARGS[@]}"
}

find2 /tmp/test -name "hello.c"

Конечно, прямой способ тоже работает (в любой оболочке с функциями):

find2() {    /usr/bin/find "$@";   }

find2 /tmp/test -name "hello.c"

Почему оригинальный код не удался?

Чтобы "увидеть", что делает код, можно использовать set -x или, еще лучше, заменить echo на printf, вот так:

find2() {

    ARGS="/usr/bin/find"
    ARGS+=( "$@" )
    printf '<%s> ' CALLING:  "${ARGS[@]}"; echo
    "${ARGS[@]}"

}

find2 /tmp/test -name "hello.c"

Выполнив его, вы увидите:

$ ./script.sh
<CALLING:> </usr/bin/find> </tmp/test> <-name> <hello.c> 

Каждый аргумент - отдельный элемент (обратите внимание на положение <>).

Однако в исходном коде (добавив printf):

function find2 {

    ARGS="/usr/bin/find"
    while [[ $# -gt 0 ]]; do
        ARGS="$ARGS '$1'"
        shift
    done
    printf '<%s> ' CALLING:  "${ARGS[@]}"; echo
    $ARGS

}   

find2 /tmp/test -name "hello.c"

При выполнении вы получите:

$ ./script.sh
<CALLING:> </usr/bin/find '/tmp/test' '-name' 'hello.c'>

Все значения представляют собой длинную текстовую строку, а не отдельные аргументы (обратите внимание на позицию <>).

0
28.01.2020, 04:51

Теги

Похожие вопросы