さまざまなサーバー上のさまざまなユーザーのいくつかの重要なディレクトリの存在を確認する汎用スクリプトを作成しようとしています。さらに、各ユーザーの $HOME 変数を活用したいと考えています。
たとえば、これが真実だとしましょう:
- サーバー1: jdoeのホームは/home/jdoeです
- サーバー2: jdoeのホームは/opt/jdoe2です
- サーバー 3 はまだ構築されていません。サーバーが構築されるまで、$HOME がどこに構築されるかはわかりません。
- サーバー4: mysqlのホームは/opt/home/mysqlです
これは私が重要ディレクトリに持っているものです (重要度の高いものから低いものの順に並べています):
$ cat mylist.txt
$HOME/most_impt_dir1
$HOME/most_impt_dir2
$HOME/most_impt_dir3
$HOME/misc
$HOME/junk
...このユーザーが所有する最も重要なディレクトリを見つけたいです。
私が試しているのは次のことです:
for i in `cat mylist.txt`
do
if [[ -O $i ]] && [[ -d $i ]]; then
echo "found it: $i"
break
else
echo "$i is not it."
fi
done
上記のコードは、文字通り で始まるディレクトリをチェックしているため、リスト内のどの項目にも機能しません$HOME
。コードでユーザーの$HOME
変数の値を使用するにはどうすればよいでしょうか?
答え1
ループをループにenvsubst
置き換える理由は、次のとおりです。for/cat
while/read
#!/bin/bash
while IFS= read -r i
do
if [[ -O $i ]] && [[ -d $i ]]; then
echo "found it: $i"
break
else
echo "$i is not it."
fi
done < <(envsubst < mylist.txt)
参照
答え2
ファイルには入れず$HOME
、スクリプト内で使用してください。例えば
$ cat mylist.txt
most_impt_dir1
most_impt_dir2
most_impt_dir3
misc
junk
それから:
while IFS= read -r i;
do
dir=$HOME/$i
if [[ -O $dir ]] ...
...
fi
done < mylist.txt
bash を使用している場合、別のオプションとして、リストを bash 配列として保持し、ファイルをソースとして取得してリストを取得する方法があります。
$ cat mylist.txt
dirs=(
"$HOME/most_impt_dir1"
"$HOME/most_impt_dir2"
"$HOME/most_impt_dir3"
"$HOME/misc"
"$HOME/junk"
)
スクリプトは次のようになります。
source ./mylist.txt
for dir in "${dirs[@]}"
do
if [[ -O $dir ...
...
fi
done