web-dev-qa-db-ja.com

whoamiを使用して、ユーザーに関するファイルを検索する

現在、シェルスクリプトを改善するためにいくつかの演習を行っています。スクリプトの要件は次のとおりです。

  1. whoamiコマンドを使用してユーザーの名前を取得し、usernameという変数に保存する必要があります。
  2. 検索するファイルの名前である単一のパラメーターを取る必要があります。
  3. 指定されたファイルでユーザー名の出現を検索して出力するには、grepである必要があります。

この部分は比較的単純であり、私はそれを機能させるために以下を使用しました:

username=$(whoami)
echo 'Enter the name of the file you would like to search: '
read fileName
cat "fileName" | grep "$username"

ただし、落とし穴はありますが、演習では次のように述べています。

注:このタスクでは、エラーチェックのパラメーターが不足していることを心配する必要はありません。スクリプトは、シバンと追加するコメントを除いて、2行で構成する必要があります。

これを2行だけに減らすにはどうすればよいですか?

6
NigerianWizard

ファイルのパス名はパラメーターとして指定されます。つまり、スクリプトのコマンドラインで指定されます。これは、対話形式でユーザーに要求しないことを意味します。

#!/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"

grep-wオプションを使用すると、完全な単語のみに一致します。 grep -w 'AA'AAと一致しますが、AAAとは一致しません。

grep-Fオプションを使用すると、ユーティリティは指定された式を固定文字列として受け取り、notを正規表現として受け取ります。

-eオプションは、コマンドラインの次の文字列がパターンであることを示します。これがないと、ダッシュで始まるパターンがコマンドラインオプションのセットとして誤って解釈される可能性があります。

$LOGNAME(または多くのシステムでは$USER)変数は、現在のユーザーのユーザー名を保持します。

$1の値は、コマンドラインでスクリプトに与えられる最初のコマンドライン引数です。

また、このスクリプトは特別なbash固有のシェル拡張を使用しないため、bashではなく/bin/shを使用してこれを実行する場合があることに注意してください。 bash...の下でも同様に実行されます。


上記は、特定のユーザーについて言及しているファイルを(質問のタイトルのように)検索しないではなく、(==- -==)このユーザーについて言及しているファイル内の行.

コマンドラインで指定されたディレクトリで現在のユーザーに言及しているファイルを検索するには:

#!/bin/sh
find "$1" -type f -exec grep -q -wF -e "$LOGNAME" {} ';' -print

この最後の部分に関連する:

8
Kusalananda

最も簡単な解決策:

#!/bin/bash
username=$(whoami)
grep $username $1

オプションのパラメーターとしてファイル名をgrepに提供できます(man grep)。変数$1は、スクリプトの最初の定位置パラメーターを指します。

次のように呼び出します。

name-Finder.sh filename

あなたはそれをワンライナーにすることもできます:

username=$(whoami); grep $username $1

または

grep $(whoami) $1
1
Piotr Sawicki