如何让我的代码使用 $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

相关内容