나는 bash 스크립트의 매개변수를 구문 분석하기 위해 getopts를 사용합니다.
while getopts ":hd:" opt; do
case $opt in
d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
exeparams="$*"
exeparams
해결되지 않은 옵션/인수는 모두 저장됩니다. exeparams를 사용하여 스크립트 내에서 실행될 명령에 대한 옵션(스크립트 자체 옵션과 겹칠 수 있음)을 저장하고 싶기 때문에 --를 사용하여 스크립트에 전달된 옵션을 끝내고 싶습니다. 예를 들어 통과하면
myscript -d myscriptparam -- -d internalparam
exeparams
개최됩니다
-- -d internalparam
--
이제 이러한 매개변수를 내부 명령에 전달하기 위해 선행 부분을 제거하고 싶습니다 . 이를 수행하는 우아한 방법이 있습니까? 아니면 --
getopts에서 가져오지 않고 나머지만 포함하는 문자열을 얻을 수 있습니까?
답변1
내장 된 shift
. getopts
루프가 완료되면,
shift "$((OPTIND - 1))"
처리된 모든 옵션이 제거됩니다.
여기에서 --
스크립트 첫 번째 부분(이전)의 비옵션 인수(있는 경우) 처리를 완료해야 합니다. 일단 마주치면 --
뒷부분( -d internalparam
뒷부분 --
)만 남을 때까지 밖으로 빼냅니다. 단방향( bash
구문 사용):
while [[ $# -gt 0 ]]; do
# process next argument
case $1 in
foo) # process foo
;;
--) shift; break;; # found '--', discard it and exit loop
*) # handle unrecognized argument
;;
esac
# not '--', so discard the argument and continue
shift
done
마지막으로, 전달할 수 있는 두 번째 옵션/매개변수 세트만 남습니다. 하다아니요$*
나머지 매개변수를 다른 명령에 전달하는 데 사용됩니다 . 대체를 사용하면 "$@"
원래 단어 분할이 유지됩니다.
external_command "$@"
답변2
어때요?
# ... getopts processing ...
[[ $1 = "--" ]] && shift
exeparams=("$@")
매개변수를 저장하려면 배열을 사용해야 합니다. 그러면 공백이 포함된 모든 매개변수가 올바르게 처리됩니다. 배열 역참조"${exeparams[@]}"