쉘 검사 사용

쉘 검사 사용

bash 스크립팅을 배우기 시작/배우려고 하는데 터미널에서 함수에 인수를 전달하는 방법(아래 참조)에 어떤 문제가 있는지 궁금합니다. 내 방법이 인터넷 튜토리얼의 많은 방법과 비슷한 것 같기 때문입니다.

#!/bin/bash

function addition_example(){
    result = $(($1+$2))
    echo Addition of the supplied arguments = $result
}

다음과 같이 스크립트를 호출합니다.

source script_name.sh "20" "20"; addition_example 

그러면 다음이 반환됩니다.

bash: +: syntax error: operand expected (error token is "+")

나는 또한 다음을 시도했습니다.

addition_example "$20" "$20"

그러면 다음이 반환됩니다.

bash: result: command not found
Addition of the supplied arguments =

답변1

addition_example매개변수 없이 함수를 실행하고 있습니다 . 따라서 $1$2변수는 비어 있으며 실제로 수행하는 작업 result = $((+))은 바로 귀하가 언급한 오류입니다.

$ result = $((+))
bash: +: syntax error: operand expected (error token is "+")

를 실행하면 source script_name.sh 20 20셸이 script_name.sh이를 소스로 지정하고 인수 20로 전달합니다. 20그러나 script_name.sh실제로는 어떤 명령도 포함되어 있지 않으며 단지 함수 선언만 있습니다. 따라서 이러한 인수는 무시됩니다. 그런 다음 후속 명령에서 인수 없이 실행하므로 addition_example위의 오류가 발생합니다.

또한 구문 오류가 있습니다. =쉘 스크립트에서는 대입 연산자( ) 주위에 공백이 있을 수 없습니다. 스크립트를 다음과 같이 변경해야 합니다.

function addition_example(){
    result=$(($1+$2))
    echo "Addition of the supplied arguments = $result"
}

그런 다음 필수 매개변수를 사용하여 함수를 실행합니다.

$ source script_name.sh; addition_example 20 20
Addition of the supplied arguments = 40

답변2

코드에 몇 가지 작은 문제가 있습니다.

이 시도:

#!/bin/bash

function addition_example(){
    local num1=$1
    local num2=$2
    local result=$((num1+num2))
    echo "Addition of the supplied arguments = $result"
}
addition_example "$1" "$2"
  • 함수는 스크립트에 선언되어 있지만 스크립트를 실행하면 함수가 실행되지 않습니다.
  • 위치 인수로 스크립트에 전달된 인수는 지정하지 않는 한 함수에 전달되지 않습니다.
  • =Bash에서는 변수 할당 주위에 공백이 있을 수 없습니다.
  • 귀하의 echo진술은 인용되어야 하며 모든 변수는 인용되어야 합니다.

답변3

이 스크립트에는 몇 가지 문제가 있습니다.

쉘 검사 사용

일부는 다음을 사용하여 감지할 수 있습니다.shellcheck.net. 그것이 보여주는 첫 번째 질문은 다음과 같습니다.

In dd line 4:
result = $(($1+$2))
       ^-- SC1068: Don't put spaces around the = in assignments.

참조 변수

따옴표가 없는 변수 확장이 있습니다. 실제로 glob 및 분할 작업을 요구하지 않는 한 모든 변수 확장을 인용해야 합니다. 에코 라인을 다음으로 변경합니다.

echo "Addition of the supplied arguments = $result"

함수와 ()를 동시에 사용하지 마세요

함수 정의는 다음 줄 중 하나일 수 있습니다.

function add { 
add () {

두 번째 방법은 이식성이 더 높습니다(더 많은 쉘에서 실행 가능).

매개변수를 사용하여 함수 호출

함수에 매개변수를 제공하는 방법에는 두 가지가 있습니다.

소스(권장하지 않음)

현재 대화형 셸에서 스크립트를 가져올 수 있습니다.

$ source ./script_name.sh
$ addition_example 20 20
Addition of the supplied arguments = 40

쉘의 예약 문자이므로 $20사용 하지 마십시오 . 이 값은 가 추가된 두 번째 인수 (현재 셸에서) $로 셸에서 구문 분석됩니다 .$20

그러나 이렇게 하면 실행 중인 셸이 스크립트 내부 내용으로 변경됩니다. 이것은 일반적으로 원하는 것이 아닙니다.

또한 가져오기 스크립트는 shebang 줄(스크립트의 첫 번째 줄)을 사용하지 않습니다. 이렇게 하면 대화형 셸(sh, ksh, bash, zsh) 내에서 실행 중인 모든 셸이 실제로 코드를 실행할 수 있습니다. 해석 및 실행을 위해 특정 쉘을 사용하도록 코드가 작성된 경우.

그것을 실행

실제로 스크립트를 실행하는 데 필요한 것은 다음과 같습니다.

  • 스크립트를 실행 가능하게 만들기chmod u+x script_name.sh
  • shebang 줄을 포함하세요(이미 가지고 있습니다)
  • 이 함수를 호출해 주세요.

스크립트 편집

#!/bin/bash

addition_example(){
    result=$(($1+$2))
    echo "Addition of the supplied arguments = $result"
}

addition_example "$@"

다음과 같이 실행합니다.

$ ./script_name.sh 20 20
Addition of the supplied arguments = 40

get "$@"은 스크립트에 제공된 인수 목록으로 확장됩니다.

견고성 향상

스크립트를 더욱 강력하게 만들려면 함수의 인수가 비어 있는지 테스트하세요(이렇게 하면 오류 메시지가 인쇄됩니다).

result=$((${1:-0}+${2:-0}))

관련 정보