![如何让我的代码使用 $HOME 变量的值?](https://linux22.com/image/164620/%E5%A6%82%E4%BD%95%E8%AE%A9%E6%88%91%E7%9A%84%E4%BB%A3%E7%A0%81%E4%BD%BF%E7%94%A8%20%24HOME%20%E5%8F%98%E9%87%8F%E7%9A%84%E5%80%BC%EF%BC%9F.png)
我正在尝试编写一个通用脚本,该脚本将检查不同服务器上不同用户的多个关键目录是否存在。此外,我想利用每个用户的 $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