作業コマンドをパラメータを取得するシェルスクリプトファイルに変換

作業コマンドをパラメータを取得するシェルスクリプトファイルに変換

こんにちは。私の作業コマンドは次のとおりです。

grep -l "my text" file*.ext|xargs ls -lart

このコマンドは私にとって非常に効果的です。次のように入力を減らしながら実行できるシェルファイルを作成したいと思います。

fn "my text" file*.ext

このシェルスクリプトファイルが見つかりました。

grep -l "$1" "$2"|xargs ls -lart

最初の部分でも動作しません。

grep -l "$1" "$2"

nullを返す

ベストアンサー1

スクリプトには3つ以上のパラメータが必要です。

シェルがgrepコマンドを実行する前に

grep -l "my text" file*.ext

ファイル名ワイルドカードパターンは、file*.ext一致するすべてのファイル名に拡張されます。したがって、最終的なコマンドラインの実行は次のようになります。

grep -l "my text" file1.ext file2.ext file3.ext

(パターンと一致するファイルの場合)

したがって、スクリプトは次のようになります。

#!/bin/sh

pattern=$1
shift

grep -l -e "$pattern" "$@" | xargs ls -lrt

ここで、パターンは変数に格納されている次のコマンドライン引数のリストから削除されます。残りの引数はファイル名のリストです(コマンドラインのファイル名ワイルドカードパターンが一致する場合)"$@"

二重引用符を使用してください$@。これにより$@、個別に引用されたコマンドライン引数のリストが展開されます。

リストに明示的なファイル名を指定する場合は不要なので、その-aオプションを削除しました。また、パターンを指定するためにwithをls使用します。最初の文字にダッシュ()があるパターンは混乱する可能性があるためです。grep-e-grep


findソートでない場合は、パイピングの代わりに以下を使用することをお勧めします(スペースと改行文字を含むファイル名を正しく処理します)。

find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls

$filepatternこれは、そのコンテンツと一致する名前と、そのコンテンツと一致するコンテンツを持つファイルを検索し、同様の出力を$pattern生成します。ls -l検索は現在のディレクトリで繰り返し実行されます。

スクリプトの一部として:

#!/bin/sh

pattern=$1
filepattern=$2

find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls

これスクリプトは、呼び出されたときにシェルがファイル名のグローブパターンを拡張しないように呼び出す必要があります。

$ ./script.sh 'my text' 'file*.ext'

おすすめ記事