Ihre Shell interpretiert die Anführungszeichen, sowohl '
als auch "
, bevor sie überhaupt ankommen echo
. Im Allgemeinen setze ich meine Argumente in doppelte Anführungszeichen, um sie wiederzugeben, auch wenn sie nicht erforderlich sind. beispielsweise:
$ echo "Hello world"
Hello world
Wenn Sie also in Ihrem ersten Beispiel wörtliche Anführungszeichen in Ihre Ausgabe aufnehmen möchten, müssen diese entweder maskiert werden:
$ echo \'Hello world\'
'Hello world'
Oder sie müssen bereits in einem in Anführungszeichen gesetzten Argument verwendet werden (aber es kann nicht dieselbe Art von Anführungszeichen sein, oder Sie müssen es trotzdem umgehen):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
In Ihrem zweiten Beispiel führen Sie eine Befehlsersetzung in der Mitte der Zeichenfolge aus:
grep $ARG /var/tmp/setfile | awk {print $2}
Dinge, die mit anfangen, $
werden auch speziell von der Shell behandelt - sie werden als Variablen behandelt und durch ihre Werte ersetzt. Da höchstwahrscheinlich keine dieser Variablen in Ihrer Shell festgelegt ist, wird sie tatsächlich nur ausgeführt
grep /var/tmp/setfile | awk {print}
Da grep
nur ein Argument angezeigt wird, wird davon ausgegangen, dass es sich bei dem Argument um das Muster handelt, nach dem Sie suchen, und dass die Position, von der die Daten gelesen werden sollen, stdin ist, sodass das Warten auf Eingaben blockiert wird. Deshalb scheint Ihr zweiter Befehl einfach zu hängen.
Dies passiert nicht, wenn Sie das Argument in Anführungszeichen setzen (weshalb Ihr erstes Beispiel fast funktioniert hat). Dies ist also eine Möglichkeit, die gewünschte Ausgabe zu erhalten:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
Sie können es auch in doppelte Anführungszeichen setzen, aber dann müssen Sie das $
s schließen, damit die Shell sie nicht als Variablen auflöst, und die Backticks, damit die Shell die Befehlssubstitution nicht sofort ausführt:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"