인수가 전달되지 않은 경우 일부 기본 경로에서 다른 유틸리티를 실행하는 스크립트를 원합니다. 이상적으로는 공백이 포함된 경로에 대해 안전하기를 원합니다.
지금까지 나는 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 등)이 있는 셸에만 해당됩니다.