私は現在シェルスクリプトを改善するためにいくつかの練習をしています。スクリプトの要件は次のとおりです。
whoami
ユーザー名を取得して名前付き変数に保存するには、コマンドを使用する必要がありますusername
。- 検索するファイル名の1つの引数を取る必要があります。
grep
指定したファイルにユーザー名が表示されているかどうかを検索して印刷する必要があります。
この部分は比較的簡単で、以下を使用して操作しました。
username=$(whoami)
echo 'Enter the name of the file you would like to search: '
read fileName
cat "fileName" | grep "$username"
しかし、問題がありますが、練習では次のように指摘しています。
メモ:このタスクでは、エラーチェックパラメータの欠落を心配する必要はありません。スクリプトは、shebangと追加することを選択したコメントに加えて、2行で構成する必要があります。
どうすればこの行を2行に減らすことができますか?
ベストアンサー1
ファイルのパス名を指定しますパラメータとして。これはスクリプトのコマンドラインに提供されることを意味します。つまり、ユーザーに対話的に質問しないでください。
#!/bin/sh
grep -wF -e "$LOGNAME" "$1"
または本当に使用したい場合whoami
:
#!/bin/sh
grep -wF -e "$(whoami)" "$1"
または「2行」要件の場合:
#!/bin/sh
name=$(whoami) # or: name=$LOGNAME
grep -wF -e "$name" "$1"
それとも何かしたいことがあれば効果がある最初の行から:
#!/bin/sh
[ ! -f "$1" ] && { printf 'No such file: %s\n' "$1" >&2; exit 1; }
grep -wF -e "$(whoami)" "$1"
-w
grep
完全な単語だけを一致させるオプションです。grep -w 'AA'
一致AA
が一致しませんAAA
。
-F
grep
ユーティリティに与えられた式を固定文字列として処理させるオプションいいえ正規表現で。
この-e
オプションは、コマンドラインの次の文字列がパターンであることを示します。ダッシュがないと、ダッシュで始まるパターンがコマンドラインオプションセットとして誤って解釈される可能性があります。
この変数は、現在のユーザーのユーザー名を保持します$LOGNAME
(または多くのシステムで)。$USER
値は、$1
コマンドラインでスクリプトに指定された最初のコマンドライン引数です。
また、このスクリプトは特別なシェル固有の拡張機能を使用しないため、/bin/sh
withの代わりにwithを使用してこのコマンドを実行できます。下ではきっとよく帰りますが…bash
bash
bash
上記は該当しません。ファイル検索特定のユーザーに言及しますが(質問のタイトルなど)、検索は可能です。ファイルの行このユーザーが言及されました。
現在ユーザーが言及されているファイルを検索します。目次コマンドラインから提供:
#!/bin/sh
find "$1" -type f -exec grep -q -wF -e "$LOGNAME" {} ';' -print
最後の部分について:
- 「find」の-execオプションについて
man grep
あなたのシステムから。