2016-05-24 8 views
2

からのコマンド内の$ 1:bashの機能

は、私は引数で関数を呼び出す:

funct $size 

は、その後、私は関数内でbashコマンドを実行する必要が

function funct { 
    arg=$1 
    files=(`find /var/ -mindepth 3 -maxdepth 3 -type d -exec du -bs {} \; | awk '$1>$arg'`) 
} 

問題は、私はいつもからawk '$size>$size'、ない$1を得るawk '$1>$arg' であります結果。

誰かが助けてもらえますか? ありがとうございます。

+0

壊れにくい(つまり、スペースやグロブなどのディレクトリ名で正しく機能する)回答に興味がありますか? –

+0

... 'array =($(...))'やそれほど現代的ではない '' 'array =(' ... ')' ''はほとんど常にバグがあります:引用符で囲まれていない展開(個別の要素に分割する方法)は、IFSの文字列分割とglob展開の両方を行います。つまり、出力に空白で囲まれた '*'がある場合は、現在のディレクトリ)。配列を生成する正しい方法は、 'read -a'、' mapfile'、 'readarray'、または' while read'ループです。 –

+0

...もう一つの脇に、 'function'キーワードを避けることを検討してください。これは、ベースラインのPOSIXシェルとは互換性がありません(関数を宣言するための適切な構文は 'funct(){' - 'function'キーワードの前につけられ、'() 'が必須です) bashisms - 互換性のある/標準化された構文よりも利点がありません。 –

答えて

2

シェルは、一重引用符で囲まれているため、$argを展開しません。検索-awkのパイプラインについては、試してみてください。

ここ
find /var/ -mindepth 3 -maxdepth 3 -type d -exec du -bs {} \; | awk -v arg="$arg" '$1>arg' 

を、-v arg="$arg"argと呼ばれるawkの変数を作成し、シェル変数argの値を割り当てます。

ディレクトリ名のいずれかに空白が含まれていると、配列filesはおそらく期待通りにはなりません。

0

func get $ size as $ 1 ... $ 1を使用したい場合(funcの外にあるように)、追加の引数としてfuncに渡すだけです。

次に、$ arg2> $ sizeを比較します。

これは問題を解決します:) * $ 1は各コンテキストのローカル変数です。 funcとfuncが呼び出される場所は異なるコンテキストなので、$ 1の意味は異なります。

関連する問題