wie bringe ich meinen Code dazu, den Wert der Variable $HOME zu verwenden?

wie bringe ich meinen Code dazu, den Wert der Variable $HOME zu verwenden?

Ich versuche, ein allgemeines Skript zusammenzustellen, das die Existenz mehrerer Schlüsselverzeichnisse für verschiedene Benutzer auf unterschiedlichen Servern überprüft. Darüber hinaus möchte ich die $HOME-Variable jedes Benutzers nutzen.

Nehmen wir zum Beispiel an, Folgendes wäre wahr:

  • auf Server 1: jdoes Heimatadresse ist /home/jdoe
  • auf Server 2: jdoes Heimatverzeichnis ist /opt/jdoe2
  • Server 3 wurde noch nicht erstellt. Wir werden nicht wissen, wo sie sein $HOME erstellen, bis der Server erstellt ist.
  • auf Server 4: MySQLs Home ist /opt/home/mysql

Dies sind meine wichtigen Verzeichnisse (geordnet von der wichtigsten bis zur unwichtigsten):

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

… Ich möchte das wichtigste Verzeichnis finden, das diesem Benutzer gehört.

Folgendes versuche ich:

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

Der obige Code funktioniert für nichts in meiner Liste, da er buchstäblich nach Verzeichnissen sucht, die mit beginnen $HOME. Wie bringe ich meinen Code dazu, den Wert der Benutzervariable zu verwenden $HOME?

Antwort1

Mit envsubst- Ersetzen Sie Ihre for/catSchleife durch eine while/readSchleife aus den hier diskutierten Gründen:

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

Siehe auch

Antwort2

Behalten Sie es $HOMEaus Ihrer Datei heraus und verwenden Sie es in Ihrem Skript. Zum Beispiel

$ cat mylist.txt
most_impt_dir1
most_impt_dir2
most_impt_dir3
misc
junk

Dann:

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

Eine weitere Möglichkeit, sofern Sie Bash verwenden, besteht darin, die Liste als Bash-Array beizubehalten und die Datei als Quelle zu verwenden, um die Liste abzurufen:

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

Das Skript sieht dann etwa so aus:

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

verwandte Informationen