답변:
쉘 명령과 그 명령에 대한 인수는 표시 번호가 쉘 변수를 : $0
, 같은 명령 자체의 문자열 값이 script
, ./script
, /home/user/bin/script
또는 무엇이든을. 모든 인수는 "$1"
, "$2"
등으로 나타납니다 "$3"
. 인수의 개수는 쉘 변수에 "$#"
있습니다.
이 문제를 해결하는 일반적인 방법에는 쉘 명령 getopts
과 shift
. getopts
C getopt()
라이브러리 함수 와 매우 비슷합니다 . shift
값을 $2
to $1
, $3
to $2
등으로 이동합니다 . $#
감소합니다. 코드는의 가치를보고 … 를 "$1"
사용하여 행동을 결정한 후 다음 인수 로 넘어 가기 위해 일 을합니다. 검사 만하면 되고 어쩌면 검사 만하면 됩니다.case
esac
shift
$1
$1
$#
$/shellscriptname.sh argument1 argument2 argument3
한 쉘 스크립트의 출력을 다른 쉘 스크립트에 인수로 전달할 수도 있습니다.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
쉘 스크립트 내에서 $1
첫 번째 인수 및 $2
두 번째 인수 등과 같은 숫자로 인수에 액세스 할 수 있습니다 .
형태
$ ./script.sh "$@"
에 가장 편리합니다 argv
. 인수 구분 기호는 공백이지만 변경할 수 있습니다. 얼마나 미성숙한지 기억하지 마십시오. 그런 다음 사용
$1, $2, shift, if [ $# -ne 3 ]
흐름을 제어합니다. 나는 case ... esac
의지가 충분 하다면 보통 getopts를 받아들이지 않습니다 .
bash 스크립트에서 개인적으로 다음 스크립트를 사용하여 매개 변수를 설정하고 싶습니다.
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
이 구조를 사용하면 각 문자에 키 문자를 정의하므로 매개 변수의 순서에 의존하지 않습니다. 또한 매개 변수가 잘못 정의 된 경우 항상 도움말 기능이 인쇄됩니다. 처리 할 매개 변수가 다른 스크립트가 많을 때 매우 유용합니다. 다음과 같이 작동합니다.
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
쉘 스크립트에서; 변수 이름 $ 1이됩니다. 두 번째 단어는 변수 이름 $ 2 등이됩니다.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
쉘 (sh) 매뉴얼 http://heirloom.sourceforge.net/sh/sh.1.html 에서 더 찾을 수 있습니다 .
Python argparse에 익숙하고 bash 인수를 구문 분석하기 위해 python을 호출하는 것을 신경 쓰지 않으면 bash argparse ( https://github.com/mattbryson/bash-arg-parse )를 사용 하십시오 .
https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287 여기에서 동일한 답변을 참조하십시오.
getopt()
는 매우 확립 된 표준이지만getopt
실행 파일은 배포판 / 플랫폼에서 동일하지 않습니다.getopts
POSIX 표준이므로 완전히 변환 된 사용자입니다. 그것은 함께 좋은 작품을dash
내 선호하는 스크립트 쉘 인도