Ich schreibe ein Bash-Skript, in dem ich eine Variable über read
diese beiden Zeichenfolgen einlese:
log.*.console.log log.*.log
Sie sind durch ein Leerzeichen getrennt.
Wie kann ich die Zeichenfolgen so umschreiben, dass die Ausgabe der Variablen für das nächste im Skript aufgerufene Programm diese Form hat?'log.*.console.log' 'log.*.log'
Ich habe sed und awk ausprobiert, aber irgendwie ohne Erfolg.
Das gesamte Skript:
#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1
else
echo "some text"
read varlogname
i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")
for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0
Antwort1
Ich glaube nicht, dass Sie die einfachen Anführungszeichen an übergeben möchten gtar
. In einem Befehl wie somecmd 'foo bar' 'files*.log'
übernimmt die Shell die Anführungszeichen, weist sie an, Sonderzeichen nicht speziell zu behandeln, und übergibt somecmd
die Argumente foo bar
und files*.log
. Unix-Programme erhalten die Befehlszeile nicht als eine Zeichenfolge, sondern als eine Reihe von Argumentzeichenfolgen. Die Aufteilung der Befehlszeile in Zeichenfolgen erfolgt durch die Shell.
read
Wenn Sie in Bash mehrere Werte möchten , können Sie verwenden read -a array
und das Array dann an den Befehl übergeben.
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
dh
read -a filenames
gtar "${filenames[@]}"
Durch die Indizierung des Arrays mit [@]
(in Anführungszeichen) werden die Array-Mitglieder als einzelne Wörter erweitert, was auch Ihr Wunsch ist.
Außerdem haben Sie for file in ${GTAR[*]}
. Das sieht aus, als ob es GTAR
als Array aufgerufen wird, aber es ist keins, Sie haben gtar
ihm lediglich die Ausgabe des Befehls als Zeichenfolge zugewiesen. In diesem Fall ${GTAR[*]}
ist dasselbe wie $GTAR
. Da die Erweiterung nicht in Anführungszeichen steht, wird die Zeichenfolge an dieser Stelle einer Worttrennung unterzogen, die standardmäßig bei Leerzeichen getrennt wird. Aber danach sind die WörterAuchals Dateinamen-Globs übernommen und zu passenden Dateinamen erweitert.
Solange Ihre Dateinamen keine Leerzeichen oder Glob-Zeichen ( enthalten *?[]
, ist das in Ordnung. Aber im Allgemeinen ist das nichts, was Sie tun möchten.
Für richtige Arrays möchten Sie wahrscheinlich immer "${array[@]}"
anstelle von verwenden [*]
.
Sehen:Worttrennung,Warum gerät mein Shell-Skript ins Stocken, wenn es sich um Leerzeichen oder andere Sonderzeichen handelt?UndArrays