인수를 Bash 스크립트에 전달하는 방법

명령, 구문 및 예

명령 행에서 스크립트를 호출 할 때 지정된 인수를 수신하도록 bash 스크립트를 작성할 수 있습니다. 이 방법은 스크립트가 입력 매개 변수 (인수)의 값에 따라 약간 다른 기능을 수행해야 할 때 사용됩니다.

예를 들어 파일에 대해 단어 계산과 같은 특정 작업을 수행하는 "stats.sh"라는 스크립트가있을 수 있습니다. 이 스크립트를 많은 파일에서 사용할 수 있기를 원하면 파일 이름을 인수로 전달하는 것이 가장 좋습니다. 그러면 처리 할 모든 파일에 동일한 스크립트를 사용할 수 있습니다. 예를 들어 처리 할 파일 이름이 "songlist"인 경우 다음 명령 줄을 입력합니다.

sh stats.sh songlist

인수는 $ 1, $ 2, $ 3 등의 변수를 사용하여 스크립트 내에서 액세스됩니다. 여기서 $ 1은 첫 번째 인수를 나타내며 $ 2는 두 번째 인수를 나타내는 식입니다. 다음은이 예입니다.

FILE1 = $ 1 wc $ FILE1

가독성을 위해 첫 번째 인수 ($ 1)의 값에 설명이 포함 된 변수를 할당 한 다음이 변수 ($ FILE1)에서 단어 수 유틸리티 ( wc )를 호출하십시오.

가변 개수의 인수가있는 경우 모든 입력 매개 변수의 배열 인 "$ @"변수를 사용할 수 있습니다. 즉, 다음 예제와 같이 for 루프 를 사용하여 반복적으로 각 루프 를 처리 할 수 ​​있습니다.

"$ @"의 FILE1에 대해 wc $ FILE1 done 수행

다음은 명령 줄에서 인수를 사용하여이 스크립트를 호출하는 방법의 예입니다.

sh stats.sh songlist1 songlist2 songlist3

인수에 공백이 있으면 작은 따옴표로 묶어야합니다. 예 :

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'

사용자가 플래그를 사용하여 임의의 순서로 인수를 전달할 수 있도록 스크립트가 작성되는 경우가 많습니다. flags 메소드를 사용하면 일부 인수를 선택적으로 만들 수도 있습니다.

"username", "date"및 "product"와 같은 지정된 매개 변수를 기반으로 데이터베이스에서 정보를 검색하고 지정된 "형식"으로 보고서를 생성하는 스크립트가 있다고 가정 해 보겠습니다. 이제 스크립트가 작성 될 때이 매개 변수를 전달할 수 있도록 스크립트를 작성하려고합니다. 다음과 같이 보일 수 있습니다.

makereport -u jsmith -p 노트북 -d 10-20-2011 -f pdf

Bash는 "getopts"기능으로이 기능을 가능하게합니다. 위의 예제에서 다음과 같이 getopts를 사용할 수 있습니다.

이것은 "getopts"함수와 소위 "optstring"(이 경우 "u : d : p : f :")을 사용하여 인수를 반복하는 while 루프 입니다. while 루프는 인수를 전달하는 데 사용할 수있는 플래그가 들어있는 optstring을 따라 진행하고 해당 플래그에 제공된 인수 값을 "option"변수에 지정합니다. case 문은 변수 "option"의 값을 모든 인수를 읽은 후에 사용할 수있는 전역 변수에 할당합니다.

optstring의 콜론은 해당 플래그에 값이 필요하다는 것을 의미합니다. 위의 예제에서 모든 플래그 다음에 콜론 "u : d : p : f :"가옵니다. 즉, 모든 플래그에는 값이 필요합니다. 예를 들어 "d"및 "f"플래그가 값을 가질 것으로 예상되지 않으면 optstring은 "u : dp : f"가됩니다.

optstring의 시작 부분에 콜론 (예 : ": u : d : p : f :")은 완전히 다른 의미를 갖습니다. 그것은 당신이 optstring에 표시되지 않은 플래그를 처리 할 수 ​​있습니다. 이 경우 "option"변수의 값은 "?"로 설정됩니다. "OPTARG"의 값은 예기치 않은 플래그로 설정됩니다. 이 옵션을 사용하면 사용자에게 실수를 알리는 적절한 오류 메시지를 표시 할 수 있습니다.

플래그가없는 인수는 getopts에 의해 무시됩니다. 스크립트가 호출 될 때 optstring에 지정된 플래그가 제공되지 않으면 특별히 코드에서이 케이스를 처리하지 않으면 아무 일도 발생하지 않습니다. getops에 의해 처리되지 않은 인수는 일반 $ 1, $ 2 등의 변수로 여전히 캡처 할 수 있습니다.