Handling von Perl Kommandozeilen-Argumente mit Leerzeichen aus einem bash-Skript?
Diese wurde driving me nuts für Stunden jetzt.
Betrachten Sie die folgende test-Skript in perl:
(hello.pl)
#!/usr/bin/perl
print "----------------------------------\n";
$numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments:\n";
foreach $argnum (0 .. $#ARGV) {
print "$ARGV[$argnum]\n";
}
Ok, es ist einfach, druckt der Befehl Linie Argumente an das Skript.
Zum Beispiel:
$ ./hello.pl apple pie
----------------------------------
thanks, you gave me 2 command-line arguments:
apple
pie
Ich kann dir das Skript ein einziges argument mit einem Leerzeichen um die Wörter mit doppelten Anführungszeichen:
$ ./hello.pl "apple pie"
----------------------------------
thanks, you gave me 1 command-line arguments:
apple pie
Nun möchte ich dieses Skript in ein shell-Skript. Ich habe das shell-script wie dieses:
#!/bin/bash
PARAM="apple pie"
COMMAND="./hello.pl \"$PARAM\""
echo "(command is $COMMAND)"
$COMMAND
Ich rufe die hello.pl mit der gleichen params und escaped quotes.
Dieses Skript gibt:
$ ./test.sh
(command is ./hello.pl "apple pie")
----------------------------------
thanks, you gave me 2 command-line arguments:
"apple
pie"
Obwohl die $variable "BEFEHL", hallt der Befehl genau wie die Art, lief ich das perl-script von der Kommandozeile aus das zweite mal, dieses mal tut es nicht sehen wollen, die apple-pie als ein einziges argument.
Warum nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese sieht aus wie das beschriebene problem in der Bash-FAQ wie: Ich versuche einen Befehl in einer Variablen, aber die komplexen Fälle immer fehl!
Die Antwort auf diese FAQ schlägt eine Reihe von möglichen Lösungen - ich hoffe, das ist der Einsatz.
Das Problem der 2 Kommandozeilen-Argumente
ist durch shell-Erweiterung mit der IFS-shell-variable gesetzt wird, um ein Leerzeichen als Wert.
Benutzen, können Sie xargs & sh -c '...code... " zu imitieren /re-aktivieren der normalen parameter analysieren.
Andere option könnte sein, schreiben Sie ein paar Zeilen von C (wie in der shebang.c)!
http://www.semicomplete.com/blog/geekery/shebang-fix.html
Sollten Sie versuchen
eval $COMMAND
anstatt einfach$COMMAND
.