¿Cómo consigo que mi código utilice el valor de la variable $HOME?

¿Cómo consigo que mi código utilice el valor de la variable $HOME?

Estoy intentando crear un script genérico que verifique la existencia de varios directorios clave para varios usuarios en diferentes servidores. Además, quiero aprovechar la variable $HOME de cada usuario.

Por ejemplo, digamos que esto fuera cierto:

  • en el servidor 1: la casa de jdoe es /home/jdoe
  • en el servidor 2: la casa de jdoe es /opt/jdoe2
  • el servidor 3 aún no se ha creado; No sabremos dónde construyeron su $HOME hasta que se construya el servidor.
  • en el servidor 4: la casa de mysql es /opt/home/mysql

Esto es lo que tengo para mis directorios importantes (ordenados de mayor a menor impt):

$ cat mylist.txt
$HOME/most_impt_dir1
$HOME/most_impt_dir2
$HOME/most_impt_dir3
$HOME/misc
$HOME/junk

...Quiero encontrar el directorio más importante propiedad de este usuario.

Esto es lo que estoy intentando:

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

El código anterior no funciona para nada en mi lista porque literalmente busca directorios que comiencen con $HOME. ¿Cómo consigo que mi código use el valor de la $HOMEvariable del usuario?

Respuesta1

Con envsubst- reemplazando su for/catbucle con un while/readbucle por los motivos que se analizan aquí:

#!/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)

Ver también

Respuesta2

Manténgase $HOMEalejado de su archivo y utilícelo en su script. Por ejemplo

$ cat mylist.txt
most_impt_dir1
most_impt_dir2
most_impt_dir3
misc
junk

Entonces:

while IFS= read -r i;
do
     dir=$HOME/$i
     if [[ -O $dir ]] ...
     ...
     fi
done < mylist.txt

Otra opción, dado que estás usando bash, es mantener la lista como una matriz bash y generar el archivo para obtener la lista:

$ cat mylist.txt
dirs=(
"$HOME/most_impt_dir1"
"$HOME/most_impt_dir2"
"$HOME/most_impt_dir3"
"$HOME/misc"
"$HOME/junk"
)

Entonces el guión será como:

source ./mylist.txt
for dir in "${dirs[@]}"
do
    if [[ -O $dir ...
    ...
    fi
done

información relacionada