コードで $HOME 変数の値を使用するにはどうすればよいでしょうか?

コードで $HOME 変数の値を使用するにはどうすればよいでしょうか?

さまざまなサーバー上のさまざまなユーザーのいくつかの重要なディレクトリの存在を確認する汎用スクリプトを作成しようとしています。さらに、各ユーザーの $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/catwhile/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

関連情報