일부 매개변수와 일부 옵션을 허용하고 해당 매개변수를 인쇄하는 쉘 스크립트를 작성하고 싶습니다. 스크립트의 이름은 다음과 같습니다 abc.ksh
. 스크립트 사용법은 다음과 같습니다.
./abc.ksh -[a <arg>|b <arg>|c|d] <some_string>
이제 옵션과 인수를 사용하는 쉘 스크립트를 작성합니다.
#!/bin/ksh
# Default Values
vara=","
varb=false
varbname=""
varc=false
# Scanning inputs
while getopts :a:b:cd option
do
case $option in
a) vara=$OPTARG;;
#shift $((OPTIND-1));;
b) varb=true
varbname=$OPTARG;;
#shift $((OPTIND-1));;
c) varc=true;;
#shift $((OPTIND-1));;
d) echo "Usage $0 \-[a|b|c|d] <filename>"
exit 0;;
\?) echo "Invalid option -$OPTARG. Please run '$0 -h' for help"
exit 1;;
:) echo "Option -$OPTARG requires an argument. Please run '$0 -d' for help"
exit 1;;
esac
done
print "Args: $* \nvara: $vara \noptfile: $varb \nvarbname: $varbname \nvarc: $varc"
올바른 입력의 예:
./abc.ksh -a "sample text" "some_string"
./abc.ksh "some_string" -a "sample text"
./abc.ksh -asample\ text some_string
- 등...
some_string
내 스크립트에 캡처된 입력이 없습니다. 어떻게 잡을 수 있나요?
답변1
프로그램은 일반적으로 "some_string" 부분을 마지막 인수로 강제하므로 이는 .abc.ksh "some_string" -a "sample text"
버그입니다. 이렇게 하면 옵션을 구문 분석한 후에도 마지막 인수(부분)의 인덱스가 유지됩니다 $OPTIND
."some_string"
이것이 허용되지 않는 경우 시작 부분에서 while
접두사가 아닌 인수를 확인할 수 있습니다( 를 입력하기 전에. 이렇게 하면 "some_string"
시작과 끝에서 모두 제공됩니다. 중간에 필요한 경우 를 사용하지 않거나 을 getopts
사용하여 수행할 수 있습니다. 두 그룹 모두 getopts
첫 번째 오류가 발생하면 접두사가 없는 매개변수 때문일 수 있습니다. 이를 가져오고 새 매개변수를 getopts
가져와서 자체 솔루션을 출시하세요.
답변2
선택 항목을 캡처한 후
shift $OPTIND
if [ $# -eq 1 ]; then
some_str="$1"
else
echo "Error: missing argument" >&2
fi