como faço para que meu código use o valor da variável $HOME?

como faço para que meu código use o valor da variável $HOME?

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 $HOMEvariável do usuário?

Responder1

Com envsubst- substituindo seu for/catloop por um while/readloop 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 $HOMEfora 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

informação relacionada