Einfache Anführungszeichen und Variablen innerhalb einer Bourne-Shell

Einfache Anführungszeichen und Variablen innerhalb einer Bourne-Shell

Ich habe diesen Befehl, den ich in der Bourne-Shell für Solaris 9 ausführen möchte.

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

Mein Problem besteht darin, dass die Variable ${PARSEDATA}nicht richtig funktioniert. Ich habe versucht, sie in Anführungszeichen zu setzen. Das Problem besteht jedoch darin, dass es sich $0um den Namen des Skripts handelt, das diesen Code ausführt, und nicht um die Datei, die mit dem Befehl gefunden wurde find.

Alle Vorschläge zur Lösung dieses wahrscheinlich einfachen Problems sind äußerst hilfreich.

Dank im Voraus.

Aktualisieren: $0ist der Name des mit dem findBefehl gefundenen Skripts, die Variable für ${PARSEDATA}ist ein Filter, der sich irgendwo im System befindet und die Ausgabe jedes gefundenen Skripts ändert. Das Problem ist jedoch, dass ich anscheinend nicht beides hinbekomme $0und ${PARSEDATA}es nicht richtig erweitern kann. Entweder $0funktioniert die Erweiterung mit einfachen Anführungszeichen einwandfrei, oder ${PARSEDATA}die Erweiterung mit doppelten Anführungszeichen funktioniert, wird dann aber $0zum Namen des Originalskripts, das diesen findBefehl ausführt.

Antwort1

Ich bin mir nicht sicher, was Sie versuchen. Aber wenn Sie nach Skripten mit dem Namen check_* suchen und diese dann ausführen und durch ein Programm ${PARSE_DATA} leiten möchten, dann ist die von find gefundene Datei vermutlich nicht vorhanden, $0aber{}

Beispiel

find /var/ftp/mp3 -name "*.mp3" -type f -exec chmod 644 {} \; (Wikipedia)

Ich denke also, dass Sie Ihre Anführungszeichen verwenden können:

find ${DATADIR} -name "check_*" -type f -exec sh -c '{} | ${PARSEDATA}' \; >> ${TMP_1}

Ich habe erfolgreich versucht:

PG='sed s/Blah/Bleh/'
find . -name "check_*" -type f -exec sh -c "{} | $PG" \;

> Bleh Blah

Antwort2

Behalten Sie die einfachen Anführungszeichen. Das Problem liegt höchstwahrscheinlich darin, dass Sie die Variable PARSEDATA nicht exportiert haben.

export PARSEDATA
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

Antwort3

Wenn Sie nicht möchten, dass $0 von der Shell erweitert wird (mit einfachen Anführungszeichen), aber ${PARSEDATA} erweitert wird, warum verwenden Sie dann nicht einfach für beides unterschiedliche Anführungszeichen:

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | '"${PARSEDATA}" {} \; >> ${TMP_1}

Solange Sie die Anführungszeichen verbunden lassen, erweitert die Shell einfach ${PARSEDATA} und übergibt den gesamten Befehl als einzelnes zu suchendes Token.

verwandte Informationen