シェルチェックの使用

シェルチェックの使用

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 () {

2番目の方法は移植性が高くなります(より多くのシェルで実行可能)。

パラメータを使用した関数呼び出し

関数にパラメータを提供する方法は2つあります。

ソース(推奨しない)

現在、対話型シェルからスクリプトをインポートできます。

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

シェルの予約文字なので$20使用しないでください。この値は、追加された2番目の引数(現在のシェルから)として$シェルから解析されます。$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}))

関連情報