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/cat
Schleife durch eine while/read
Schleife 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 $HOME
aus 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