2016-11-27 5 views
1

私は複数の引数を受け入れる関数を持っています。私は正規表現で文字列を渡しています。しかし、それがevalとなったら、他のパラメータがうんざりしています。正規表現を関数に渡す方法

コードは以下のようなものです -

function foo() { 
    eval DIR_NAME='$'$1 
    MAX_DEPTH=$2 
    eval FILE_PATTERN=$3 
    RETENTION_PERIOD=$4 
    eval MOVE_PATH='$'$5 
    find . -maxdepth "$MAX_DEPTH" -type f -name "$FILE_PATTERN" -mtime +"$RETENTION_PERIOD" -print | ... 
} 

DIR_NAME="/my/path" 
MAX_DEPTH=2 
FILE_PATTERN="*.txt" 
RETENTION_PERIOD=30 
TARGET_DIRECTORY="/move/to/path" 

foo DIR_NAME $MAX_DEPTH $FILE_PATTERN $RETENTION_PERIOD TARGET_DIRECTORY 

は今、問題が拡大しつつあるfindコマンド$FILE_PATTERNであり、すべての.txtパス内のファイルとRETENTION_PERIODで自身を置き換えて、MOVE_PATHの変数は、他の.txtによって置換得ていますファイル。

これにはどのような解決策がありますか?

答えて

4
  1. ここでevalを使用する必要はありません。間接参照変数BASHを使用してください。
  2. *.txt
  3. はグロブパターン正規表現ではなく、あなたはそれが引用されたパスとの条内部環境変数との衝突を避けるために、すべて大文字の変数名を使用しないでくださいシェル拡張
  4. を防ぐために割り当てに内部引用符を使用する必要があります。
  5. 関数内にlocalを使用して、グローバル変数を上書きしないようにローカル変数を定義します。
  6. あなたが使用することができます

foo() { 
    local dir_name="${!1}" 
    local max_depth="$2" 
    local file_pattern="$3" 
    local retention_period="$4" 
    local move_path="${!5}" 

    find . -maxdepth "$max_depth" -type f -name "$file_pattern" -mtime +"$retention_period" -print | ... 
} 

次にとしてそれを呼び出す:

dir_name="/my/path" 
max_depth=2 
file_pattern='*.txt' 
retention_period=30 
target_directory="/move/to/path" 

foo dir_name "$max_depth" "$file_pattern" "$retention_period" target_directory 
関連する問題