ファイル名を引数(現在のディレクトリに存在する必要がある)として取り、デフォルトのディレクトリツリーでリンクされているすべてのパス名を見つけるスクリプトを設計します。このリストはあなたに郵送する必要があります。私はこれを試しましたが、スクリプトが正確に何をしたいのかわかりません。
#!/bin/bash
echo. "enter file name"
read name
if [ $name == "a1.txt" ]; then
source a1.txt
fi
/* a1.txt file contents tree -l */
ベストアンサー1
いいですね。各部に分けてみましょう。
- ファイル名をパラメータとして渡す
- ファイルが存在するか(そして通常のファイルか)を確認してください。
- 以下のファイルへのすべての(記号)リンクを見つけます。
$HOME
- このファイルのリストを次にメールで送信してください。
$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
出力が欲しいから診断情報(この場合はエラーメッセージ)標準エラーストリームecho
withの出力をリダイレクトします>&2
。また、問題が発生したことを示すために、ゼロ以外の終了状態でスクリプトを終了します。
ファイルが存在するだけでなく一般ファイルつまり、ディレクトリやデバイスノードなどでないものに変更してください-e
(-f
マニュアルを読むtest
)。
ホームディレクトリ内のすべてのシンボリックリンクを見つけるには、次のものを使用できます。
find "$HOME" -type l
または、いずれかを使用してこれらのファイルを表示し、ユーザーが使用して提供したファイルと比較することもできますbash
。ksh93
if [[ "$name" -ef "$link" ]]; then ... fi
ここ$name
で、およびはから返されるシンボリックリンクの名前$1
です。この演算子は、両方のオペランドが同じファイルを参照している場合(すべてのシンボリックリンクが解決された後)、trueを返します。$link
find
-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
文字列全体を使用したいメールアドレスに置き換えてください。