공백으로 인해 경로가 손상되지 않고 스크립트에서 "$@" 또는 기본 매개변수 목록을 사용하도록 하려면 어떻게 해야 합니까?

공백으로 인해 경로가 손상되지 않고 스크립트에서 "$@" 또는 기본 매개변수 목록을 사용하도록 하려면 어떻게 해야 합니까?

인수가 전달되지 않은 경우 일부 기본 경로에서 다른 유틸리티를 실행하는 스크립트를 원합니다. 이상적으로는 공백이 포함된 경로에 대해 안전하기를 원합니다.

지금까지 나는 script.sh:

#!/bin/sh
base=$(dirname "$0")
exec touch "${@:-"$base/aaa" "$base/bbb"}"

"foo bar"라는 폴더에 넣고 실행하면:

foo\ bar/script.sh

나는 그것이 결국 그렇게 되기를 바랍니다:

touch foo\ bar/aaa foo\ bar/bbb

즉, 스크립트가 위치한 "foo bar" 디렉터리에 "aaa" 및 "bbb" 파일이 생성됩니다.

대신 오류가 발생했습니다.

touch: 'foo bar/aaa foo bar/bbb'를 터치할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

(스크립트에 인수를 전달하면 제대로 작동하는 것 같습니다. 아마도 마지막 명령에서 바깥쪽 따옴표를 제거하면 상황이 반전될 것입니다.)

답변1

의 확장에서는 기본 매개변수를 설정할 수 없는 것으로 보이며 ${@:-...}, "${@:-"$base/aaa" "$base/bbb"}"단일 문자열로 확장됩니다.

기본 매개변수를 설정하려면 다음을 수행할 수 있습니다.

base=$(dirname -- "$0")
# test explicitly for no parameters, and set them.
if [ "$#" -eq 0 ]; then
    set -- "$base/aaa" "$base/bbb"
fi

그런 다음 "$@"참조 매개변수 대체의 마법이 줄어들지 않고 발생합니다.

touch -- "$@"

답변2

기본 확장에서는 여러 매개변수를 사용할 수 있습니다 ${@-...}.

이와 같이:

#!/bin/bash
base=$(dirname "$0")
arr=("$base/aaa" "$base/bbb")

touch "${@:-"${arr[@]}"}"

그러나 배열(ksh, zsh, bash 등)이 있는 셸에만 해당됩니다.

관련 정보