Я пытаюсь собрать общий скрипт, который будет проверять существование нескольких ключевых каталогов для разных пользователей на разных серверах. Кроме того, я хочу использовать переменную $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/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