Estou tentando montar um script genérico que verifique a existência de vários diretórios principais para vários usuários em servidores diferentes. Além disso, quero aproveitar a variável $HOME de cada usuário.
Por exemplo, digamos que isso seja verdade:
- no servidor 1: a casa do jdoe é /home/jdoe
- no servidor 2: a casa do jdoe é /opt/jdoe2
- o servidor 3 ainda não foi construído; não saberemos onde eles construíram seu $HOME até que o servidor seja construído.
- no servidor 4: a home do mysql é /opt/home/mysql
Isto é o que tenho para meus diretórios importantes (ordenados do maior para o menor impacto):
$ cat mylist.txt
$HOME/most_impt_dir1
$HOME/most_impt_dir2
$HOME/most_impt_dir3
$HOME/misc
$HOME/junk
... Quero encontrar o diretório mais implícito de propriedade deste usuário.
Aqui está o que estou tentando:
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
O código acima não funciona para nada na minha lista porque está literalmente verificando diretórios que começam com $HOME
. Como faço para que meu código use o valor da $HOME
variável do usuário?
Responder1
Com envsubst
- substituindo seu for/cat
loop por um while/read
loop pelos motivos discutidos aqui:
#!/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)
Veja também
Responder2
Fique $HOME
fora do seu arquivo e use-o no seu script. Por exemplo
$ cat mylist.txt
most_impt_dir1
most_impt_dir2
most_impt_dir3
misc
junk
Então:
while IFS= read -r i;
do
dir=$HOME/$i
if [[ -O $dir ]] ...
...
fi
done < mylist.txt
Outra opção, desde que você esteja usando o bash, é manter a lista como um array bash e fornecer o arquivo para obter a lista:
$ cat mylist.txt
dirs=(
"$HOME/most_impt_dir1"
"$HOME/most_impt_dir2"
"$HOME/most_impt_dir3"
"$HOME/misc"
"$HOME/junk"
)
Então o script ficará assim:
source ./mylist.txt
for dir in "${dirs[@]}"
do
if [[ -O $dir ...
...
fi
done