it-gundan.com

셸 스크립트에 명령 줄 인수를 어떻게 전달할 수 있습니까?

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

295
Paul

셸 명령 및 해당 명령에 대한 인수는 numbered 셸 변수로 나타납니다. $0에는 명령 자체의 문자열 값이 있습니다 (예 : script, ./script, /home/user/bin/script 또는 무엇이든. 모든 인수는 "$1", "$2", "$3" 등으로 나타납니다. 인수 개수는 Shell 변수 "$#"에 있습니다.

이를 처리하는 일반적인 방법은 쉘 명령 getoptsshift과 관련이 있습니다. getopts는 C getopt() 라이브러리 함수와 매우 비슷합니다. shift$2의 값을 $1로, $3$2로 이동합니다. $#가 감소합니다. 코드는 "$1"의 값을보고 caseesac를 사용하여 작업을 결정한 다음 shift를 수행하여 작업을 수행합니다. 다음 인수에 $1. $1$# 만 검사하면됩니다.

228
Bruce Ediger

$n를 사용하여 전달 된 인수에 액세스 할 수 있습니다. 여기서 n은 인수 번호-1, 2, 3, ...입니다. 다른 명령과 마찬가지로 인수를 전달합니다.

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

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"

이 구조를 사용하면 각 문자에 키 문자를 정의하므로 매개 변수의 순서에 의존하지 않습니다. 또한 매개 변수가 잘못 정의 된 경우 항상 도움말 기능이 인쇄됩니다. 처리 할 매개 변수가 다른 스크립트가 많을 때 매우 유용합니다. 다음과 같이 작동합니다.

$ bash myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C

$ bash myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C

$ bash 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

$ bash 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
34
Rafael Muynarsk
$/shellscriptname.sh argument1 argument2 argument3 

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

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

셸 스크립트 내에서 첫 번째 인수의 경우 $1 및 두 번째 인수의 경우 $2와 같은 숫자로 인수에 액세스 할 수 있습니다.

쉘 인수에 대한 추가 정보

32
Balaswamy vaddeman

형태

$ ./script.sh "[email protected]" 

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

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

흐름을 제어합니다. 나는 일반적으로 case ... esac면 충분합니다.

21
user400344
./myscript myargument

myargumentmyscript 내부에서 $1가됩니다.

14
vimdude

쉘 스크립트에서; 변수 이름 $ 1이됩니다. 두 번째 Word는 변수 이름 $ 2 등이됩니다.

cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: [email protected]"
EOF
sh test hello world

쉘 (sh) 매뉴얼 http://heirloom.sourceforge.net/sh/sh.1.html

8
FireInTheSky

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

1
Linh
#!/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
0
Yogesh

다음은 내 것입니다 :

#!/bin/bash 
echo 'First arg:' $1 
echo 'Second arg:' $2 

쉘 이름은 para_script.sh입니다.

그런 다음 실행하십시오. ./para_script.sh hello world

0
Newt