シェルスクリプトに関する質問です。この質問を受け取ることはできません。

シェルスクリプトに関する質問です。この質問を受け取ることはできません。

ファイル名を引数(現在のディレクトリに存在する必要がある)として取り、デフォルトのディレクトリツリーでリンクされているすべてのパス名を見つけるスクリプトを設計します。このリストはあなたに郵送する必要があります。私はこれを試しましたが、スクリプトが正確に何をしたいのかわかりません。

#!/bin/bash
echo. "enter file name"
read name
if [ $name == "a1.txt" ]; then
source a1.txt
fi 
/* a1.txt file contents tree -l */

ベストアンサー1

いいですね。各部に分けてみましょう。

  1. ファイル名をパラメータとして渡す
  2. ファイルが存在するか(そして通常のファイルか)を確認してください。
  3. 以下のファイルへのすべての(記号)リンクを見つけます。$HOME
  4. このファイルのリストを次にメールで送信してください。$LOGUSER

スクリプトは1つ以上のパラメータを使用できます。コマンドラインパラメータは以下にあります。位置パラメータ $1待つ。 1つのパラメータしか得られないので、$2その内容にのみ興味があります$1

name="$1"

名前が存在するかどうかをテストするには、次のものを使用できます。

if [ -e "$name" ]; then ... fi

この場合、私たちは名前があるかどうかをテストすることに興味があります。いいえ存在する:

if [ ! -e "$name" ]; then
   echo 'Name does not exist in directory' >&2
   exit 1
fi

出力が欲しいから診断情報(この場合はエラーメッセージ)標準エラーストリームechowithの出力をリダイレクトします>&2。また、問題が発生したことを示すために、ゼロ以外の終了状態でスクリプトを終了します。

ファイルが存在するだけでなく一般ファイルつまり、ディレクトリやデバイスノードなどでないものに変更してください-e-fマニュアルを読むtest)。

ホームディレクトリ内のすべてのシンボリックリンクを見つけるには、次のものを使用できます。

find "$HOME" -type l

または、いずれかを使用してこれらのファイルを表示し、ユーザーが使用して提供したファイルと比較することもできますbashksh93

if [[ "$name" -ef "$link" ]]; then ... fi

ここ$nameで、およびはから返されるシンボリックリンクの名前$1です。この演算子は、両方のオペランドが同じファイルを参照している場合(すべてのシンボリックリンクが解決された後)、trueを返します。$linkfind-ef

これはfind上記のテストと次のように組み合わせることができます。

find "$HOME" -type l |
while read -r link; do
    if [[ "$name" -ef "$link" ]]; then
        printf '%s\n' "$link"
    fi
done

電子メールを送信するには、このmailコマンドを使用してください。これは前のパイプの最後に表示されることがあります。

find "$HOME" -type l |
while read -r link; do
    if [[ "$name" -ef "$link" ]]; then
        printf '%s\n' "$link"
    fi
done |
mail -s "These are the links" "$LOGUSER@localhost"

$LOGUSERあなたのユーザー名は維持されます。"$(id -un)"何らかの理由で正しく設定されていない場合は、使用するか、$LOGUSER文字列全体を使用したいメールアドレスに置き換えてください。

おすすめ記事