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
사용 하지 마십시오 . 이 값은 가 추가된 두 번째 인수 (현재 셸에서) $
로 셸에서 구문 분석됩니다 .$2
0
그러나 이렇게 하면 실행 중인 셸이 스크립트 내부 내용으로 변경됩니다. 이것은 일반적으로 원하는 것이 아닙니다.
또한 가져오기 스크립트는 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}))