我正在嘗試編寫一個通用腳本,該腳本將檢查不同伺服器上不同使用者的多個關鍵目錄是否存在。此外,我想利用每個用戶的 $HOME 變數。
例如,假設這是真的:
- 在伺服器 1 上:jdoe 的主目錄是 /home/jdoe
- 在伺服器 2 上:jdoe 的主目錄是 /opt/jdoe2
- 伺服器3尚未搭建;在伺服器建成之前我們不會知道他們在哪裡建造他的$HOME。
- 在伺服器 4 上:mysql 的 home 是 /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
With 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