Bash: 이상한 구문 분석 출력이요? [복사]

Bash: 이상한 구문 분석 출력이요? [복사]

여러 명령줄 인수를 순서대로 받아들이는 간단한 스크립트를 작성하고 있습니다.

#!/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

관련 정보