여러 명령줄 인수를 순서대로 받아들이는 간단한 스크립트를 작성하고 있습니다.
#!/bin/bash
function arg_parser () {
while [[ $# != 0 ]] ; do
case "$1" in
--one)
varone="$2"
;;
--two)
vartwo="$2"
;;
--three)
varthree="$2"
;;
--four)
varfour="$2"
;;
--five)
varfive="$2"
;;
esac
shift
done
}
arg_parser "$@"
echo $varone
echo $vartwo
echo $varthree
echo $varfour
echo $varfive
그런 다음 실행하십시오.
./test.sh --one testone --three testthree --two testtwo --five "test five" --four "$$$$"
testone
testtwo
testthree
793793
test five
--four
"$$$$" 대신 "793793"이 어떻게 반환되는지 확인하세요 . 왜 이런 일이 발생하는지 및/또는 이를 방지하기 위해 스크립트를 개선하는 방법을 아는 사람이 있습니까?
답변1
$$
셸의 프로세스 ID(이 경우 스크립트가 시작되기 전 명령줄)로 확장되는 특수 변수입니다. 비슷한 것을 시도해 보세요 echo $$
. 백슬래시를 사용하여 달러 기호를 이스케이프 처리하거나 작은따옴표로 묶어 확장을 방지해야 합니다 echo '$$$$'
. 즉, .
$foo
큰따옴표는 도움이 되지 않으며 일반 변수( vs. ) 처럼 확장된 값의 단어 분할을 방지할 뿐입니다 "$foo"
.
또한 루프에서는 shift
두 번째 매개변수를 함께 사용하더라도 한 번만 사용할 수 있습니다. 이는 옵션의 인수도 옵션 자체로 처리된다는 의미입니다.
$ ./test.sh --one --two --three --four --five xyz
--two
--three
--four
--five
xyz
shift
이를 원하지 않는 경우 다음을 사용한 후 추가 시간이 필요합니다 $2
.
while [[ "$#" != 0 ]] ; do
case "$1" in
--one)
varone="$2"
shift
;;
--two)
vartwo="$2"
shift
;;
# ...
esac
shift
done