비슷한 POSIX 함수를 작성했지만 임의의 코드 실행 위험이 없습니다.
unexport()
while case ${1##[0-9]*} in ### rule out leading numerics
(*[!_[:alnum:]]*|"") ### filter out bad|empty names
set "" ${1+"bad name: '$1'"} ### prep bad name error
return ${2+${1:?"$2"}} ### fail w/ above err or return
esac
do eval set '"$'"{$1+$1}"'" "$'"$1"'" "$'@\" ### $1 = ( $1+ ? $1 : "" )
eval "${1:+unset $1;$1=\$2;} shift 3" ### $$1 = ( $1:+ ? $2 : -- )
done
또한 당신이 제공하고자하는만큼 많은 주장을 다룰 것입니다. 인수가 아직 설정되지 않은 유효한 이름이면 자동으로 무시됩니다. 인수가 잘못된 이름이면 stderr에 쓰고 적절하게 중지되지만 명령 행에서 유효하지 않은 선행 이름은 계속 처리됩니다.
다른 방법을 생각했습니다. 나는 그것을 더 좋아합니다.
unexport()
while unset OPTARG; OPTIND=1 ### always work w/ $1
case ${1##[0-9]*} in ### same old same old
(*[!_[:alnum:]]*|"") ### goodname && $# > 0 || break
${1+"getopts"} : "$1" ### $# ? getopts : ":"
return ### getopts errored or ":" didnt
esac
do eval getopts :s: '"$1" -"${'"$1+s}-\$$1\""
eval unset "$1; ${OPTARG+$1=\${OPTARG}#-}"
shift
done
둘 다 같은 기술을 많이 사용합니다. 기본적으로 쉘 var가 설정되어 있지 않으면 그것에 대한 참조는 +
매개 변수 확장으로 확장 되지 않습니다 . 그러나 값에 관계없이 설정 되면 변수의 값이 아닌 다음과 같이 매개 변수 ${parameter+word}
가 확장됩니다 word
. 따라서 쉘 변수는 성공시 자체 테스트 및 자체 대체 변수입니다.
또한 스스로 실패 할 수도 있습니다 . 나쁜 이름을 움직일 발견되면 정상 기능에 $1
로 $2
와 휴가 $1
내가 할 다음 일은 중 하나이기 때문에 널 return
인수가 무효 인 경우, 쉘 것, 모든 인수가 처리 된 경우 성공은 루프 끝에서, 또는 확장 $2
에 $1:?
이는 스크립트 쉘을 죽이고 쓰는 동안 대화 형 하나에 인터럽트를 반환합니다 word
stderr로.
두 번째 getopts
는 과제를 수행합니다. 그리고 나쁜 이름을 할당하지 않습니다-오히려 표준 오류 메시지를 stderr에 작성합니다. 또한 인수가 처음에 설정된 변수의 이름 인 $OPTARG
경우 arg의 값을 저장합니다 . 따라서 getopts
필요한 모든 작업을 수행 한 후 적절한 할당으로 eval
세트를 OPTARG
확장해야합니다.
mktemp
있다면 그 소스를 변수를 할당하는 임시 파일을 휴대용 정도이며, 값 설정을 해제합니다. 쉘 변수와 달리 임의의 이름으로 임시 파일을 만들 수 있습니다.