2013-10-15 9 views
13

私の問題:パス空の変数

#!/bin/bash 

function testFunc(){ 
    echo "param #1 is :" $1 
    echo "param #2 is :" $2 
} 

param1="param1" 
param2="param2" 

testFunc $param1 $param2 

この方法で出力は次のとおりです。次に、出力を

param1="" 

param #1 is : param1 
param #2 is : param2 

しかし、私は空の文字列へのparam1を設定するとき休暇:

param #1 is : param2 
param #2 is : 

私は、最初のパラメータが空で、そのパラメータが宣言されていないので、実際には関数パラメータとして渡されないという問題があると思います。

これが問題であれば、bashで変数 "空文字列"を宣言する方法がありますか、または予想される動作を得るための回避策がありますか?

注:

testFunct "" $param2 

しかし、私はクリーンなコードを維持したい:私はこのような関数を呼び出す場合に予想されるとして、それは動作します。

UPDATE:

私は最近、結合していない変数の場合にエラーが発生します-uフラグが使用されようとしているを発見。

$ bash -u test.sh 
param #1 is : param1 
test.sh: line 5: $2: unbound variable 
+1

クリーンアップが正しく行われるべきではありません。 – chepner

+1

クリーンで正しいソリューションを検索するのではなく、正しく混乱させる方がいいですか? – kupsef

+1

コードが間違っている場合、クリーンであれば誰が気にしますか?パラメータの拡張子を引用符で囲まないことは、よりきれいに見えるので間違っています。 – chepner

答えて

25

最初に、testFunct param2でスクリプトを呼び出します。したがって、最初のパラメータとしてparam2を理解しています。

これを避けるために、パラメータを引用符で渡すことを常にお勧めします(正直言って、私にとってはこのようにきれいです)。

testFunct "" "$param2" 

は、例を参照してください:この機能を考えると

function testFunc(){ 
    echo "param #1 is -> $1" 
    echo "param #2 is -> $2" 
} 

だからあなたはあなたが言う空の変数を渡すために

testFunct "$param1" "$param2" 

それを呼び出すことができますさまざまな方法でそれを呼びましょう:

$ testFunc "" "hello" # first parameter is empty 
param #1 is -> 
param #2 is -> hello 

$ testFunc "hey" "hello" 
param #1 is -> hey 
param #2 is -> hello 
+1

'echo'コマンドの' $ 1'と '$ 2'でも引用符を付けるのが理想的だと主張する人もいます。 – user000001

+1

そして彼らは正しいでしょう。ありがとう@ user000001! – fedorqui

1

もう1つのベストプラクティスは、$#を使用して渡されたパラメータの数を確認することです。

しかし、これは1つの空のパラメータの問題を解決しません。param1が空であるかparam2が空であるかをどのように知るでしょうか。したがって、両方のチェックは良いparcticesです。

+0

私の質問の更新セクションを読んで、より堅牢な方法でこれらのバグをキャッチします。 – kupsef