如何讓我的程式碼使用 $HOME 變數的值?

如何讓我的程式碼使用 $HOME 變數的值?

我正在嘗試編寫一個通用腳本,該腳本將檢查不同伺服器上不同使用者的多個關鍵目錄是否存在。此外,我想利用每個用戶的 $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

相關內容