실행하기 전에 쉘 스크립트가 명령줄 인수를 사용하는지 확인하십시오.

실행하기 전에 쉘 스크립트가 명령줄 인수를 사용하는지 확인하십시오.

다음 코드를 살펴보겠습니다.

#!/bin/bash
arg=$1
echo $arg

인수를 사용하여 실행하면 인수가 인쇄됩니다. 그렇지 않으면 아무 작업도 수행되지 않습니다. 내가 궁금한 것은 실행하기 전에 명령줄 인수가 필요한지 여부를 알아내는 것이 가능합니까?

답변1

sh- 명령줄에서 인수를 사용하는 호환 가능한 쉘 스크립트에는 일반적으로 $1$2또는 이들의 조합이 포함됩니다. 그러나 이것은 필요하지도 충분하지도 않습니다!$3$@$*

그러면 스크립트가 grep되고 다음 유형의 문자열이 포함된 모든 줄이 반환됩니다.

grep '\$[1-9@*]' script.sh

명령줄 인수를 사용하지 않지만 인수를 사용하는 함수를 포함하는 스크립트 또는 평가되지 않은 문자열에 이러한 문자만 포함하는 스크립트에서 거짓 긍정이 발생할 수 있습니다. 예를 들어 스크립트에 호출이 포함되어 있으면 스크립트 자체를 참조하지 않는 명령줄 인수 awk도 포함될 수 있습니다 .$1

getopt스크립트에서 이 문자열을 찾아 스크립트가 명령줄을 사용하는지 getopt또는 getopts명령줄을 올바르게 구문 분석하는지 확인할 수도 있습니다.

명령줄 인수가 사용될 수 있는 상황 캡처암묵적으로조금 어렵습니다. 예를 들어, 또는 를 사용할 때 for variablename; do ... done이런 일이 발생합니다 select variablename; do ... done. 그러나 위치 매개변수를 명시적으로 채우는 데 스크립트가 사용된 경우 set명령줄 매개변수는 영향을 받지 않습니다. 이 문제를 해결하려면 스크립트를 육안으로 검사해야 할 수도 있습니다.

"실생활"에서 사람들은 함께 제공되는 문서를 읽습니다. 이상한 이유로 작동하지 않으면 코드를 읽어보세요.

답변2

당신은 할 수 없습니다. 문제는 일반적으로 결정 불가능합니다. 어떤 알고리즘을 개발하더라도 실패할 예를 생각할 수 있습니다. 식욕을 자극하려면 다음 스크립트를 고려하십시오. Do They Argue?

# script 1
false && echo catch $1 if you can

# script 2
x='$'
y=1
eval echo $x$y

답변3

물어봐도 소용이 없습니다. 프로그램은 명령줄 인수 목록을 수신하고 이를 처리할 방법을 선택합니다. 쉘 스크립트나 다른 프로그램은 필요한 만큼 명령줄 인수를 허용할 수 있습니다.

"명령줄 인수 사용"을 정의하여 "0개의 인수로 호출할 때 아무 것도 유용하지 않음"을 의미할 수 있습니다. 하지만 "유용함"을 정의해야 합니다. 제공한 예제 스크립트는 인수 없이 호출될 때 작업을 수행합니다. 즉, 빈 줄을 인쇄합니다. 빈 줄 인쇄를 쓸모없다고 정의하는 이유는 무엇입니까?

또 다른 가능한 정의는 프로그램이 0을 전달했을 때와 하나 이상의 명령줄 인수를 전달했을 때 다르게 동작하는 경우 "명령줄 인수를 사용"하는 것입니다. 이것은 나에게 가장 자연스러운 정의이지만, 예제 스크립트는 첫 번째 인수를 사용하여 출력할 내용을 결정하기 때문에 사용 중인 정의가 아닌 것 같습니다.

문제를 다시 생각해 볼 필요가 있습니다. "명령줄 인수 허용"이란 무엇을 의미합니까? 문제를 정의하고 나면 해결책에 더 가까워질 것입니다.

관련 정보