쉘 스크립트에 명령 행 인수를 전달하려면 어떻게해야합니까?


242

쉘 스크립트는 마치 명령 프롬프트에서 실행되는 것처럼 명령을 실행한다는 것을 알고 있습니다. 함수처럼 쉘 스크립트를 실행할 수 있기를 원합니다. 즉, 입력 값이나 문자열을 스크립트로 가져갑니다. 이 작업을 어떻게 수행합니까?

답변:


198

쉘 명령과 그 명령에 대한 인수는 표시 번호가 쉘 변수를 : $0, 같은 명령 자체의 문자열 값이 script, ./script, /home/user/bin/script또는 무엇이든을. 모든 인수는 "$1", "$2"등으로 나타납니다 "$3". 인수의 개수는 쉘 변수에 "$#"있습니다.

이 문제를 해결하는 일반적인 방법에는 쉘 명령 getoptsshift. getoptsC getopt()라이브러리 함수 와 매우 비슷합니다 . shift값을 $2to $1, $3to $2등으로 이동합니다 . $#감소합니다. 코드는의 가치를보고 … 를 "$1"사용하여 행동을 결정한 후 다음 인수 로 넘어 가기 위해 일 을합니다. 검사 만하면 되고 어쩌면 검사 만하면 됩니다.caseesacshift$1$1$#


6
C getopt()는 매우 확립 된 표준이지만 getopt실행 파일은 배포판 / 플랫폼에서 동일하지 않습니다. getoptsPOSIX 표준이므로 완전히 변환 된 사용자입니다. 그것은 함께 좋은 작품을 dash내 선호하는 스크립트 쉘 인도
JM 베커에게

165

당신과 함께 인수를 전달 액세스 할 수 있습니다 $nn인수 번호입니다 - 1, 2, 3, .... 다른 명령과 마찬가지로 인수를 전달합니다.

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world

27
$/shellscriptname.sh argument1 argument2 argument3 

한 쉘 스크립트의 출력을 다른 쉘 스크립트에 인수로 전달할 수도 있습니다.

$/shellscriptname.sh "$(secondshellscriptname.sh)"

쉘 스크립트 내에서 $1첫 번째 인수 및 $2두 번째 인수 등과 같은 숫자로 인수에 액세스 할 수 있습니다 .

쉘 인수에 대한 추가 정보


18

형태

$ ./script.sh "$@" 

에 가장 편리합니다 argv. 인수 구분 기호는 공백이지만 변경할 수 있습니다. 얼마나 미성숙한지 기억하지 마십시오. 그런 다음 사용

 $1, $2, shift, if [ $# -ne 3 ] 

흐름을 제어합니다. 나는 case ... esac의지가 충분 하다면 보통 getopts를 받아들이지 않습니다 .


14

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

13
./myscript myargument

myargument$1내부 가 됩니다 myscript.


5

쉘 스크립트에서; 변수 이름 $ 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 에서 더 찾을 수 있습니다 .


2
U & L에 오신 것을 환영합니다. 이것은 이미 주어진 답변에 아무것도 추가하지 않습니다.
Archemar


0
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null

------------------------------------------------------------------------

./scriptname.sh value1 value2

3
1) 불필요 2> /dev/null, 2) 기존 답변에 아무것도 추가하지 않습니다.
크세 노이드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.