Ersetzen Sie einfache Anführungszeichen für Zeichenfolgen, die durch Leerzeichen aus Variablen getrennt sind

Ersetzen Sie einfache Anführungszeichen für Zeichenfolgen, die durch Leerzeichen aus Variablen getrennt sind

Ich schreibe ein Bash-Skript, in dem ich eine Variable über readdiese 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 somecmddie Argumente foo barund 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.

readWenn Sie in Bash mehrere Werte möchten , können Sie verwenden read -a arrayund 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 GTARals Array aufgerufen wird, aber es ist keins, Sie haben gtarihm 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

verwandte Informationen