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番目の引数(現在のシェルから)として$
シェルから解析されます。$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}))