Übergeben von Argumenten an ein Kommando in der Bash-Skript mit Leerzeichen
Ich versuche zu pass 2 Argumente einer Befehls-und jedes argument, die Leerzeichen enthalten, habe ich versucht, die Flucht der Räume, in args, ich habe versucht Verpackung in einfache Anführungszeichen gesetzt, ich habe versucht die Flucht \", aber nichts funktioniert.
Hier ist ein einfaches Beispiel.
#!/bin/bash -xv
ARG="/tmp/a b/1.txt"
ARG2="/tmp/a b/2.txt"
ARG_BOTH="\"$ARG\" \"$ARG2\""
cat $ARG_BOTH
Bin ich immer Folgendes, wenn es läuft:
ARG_BOTH="$ARG $ARG2"
+ ARG_BOTH='/tmp/a\ b/1.txt /tmp/a\ b/2.txt'
cat $ARG_BOTH
+ cat '/tmp/a\' b/1.txt '/tmp/a\' b/2.txt
cat: /tmp/a\: No such file or directory
cat: b/1.txt: No such file or directory
cat: /tmp/a\: No such file or directory
cat: b/2.txt: No such file or directory
InformationsquelleAutor Dougnukem | 2011-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen http://mywiki.wooledge.org/BashFAQ/050
TLDR
Stellen Sie Ihre Argumente in einem array und rufen Sie Ihr Programm
myutil "${arr[@]}"
- Ausgang
InformationsquelleAutor SiegeX
Könnte dies ein guter use-case für generic "set" Befehl stellt die top-level-shell-Parameter, um ein word-Liste. Das heißt, $1, $2, ... und so auch $* und $@ wieder.
Dies gibt Ihnen einige der Vorteile von arrays, während auch bleiben alle-Posix-shell-kompatibel.
Also:
InformationsquelleAutor DigitalRoss
Die einfachste überarbeitung Ihrer Beispiel-shell-script, dass die Arbeit richtig ist:
Allerdings, wenn Sie brauchen, um wrap up ein ganzes Bündel von Argumenten in einer shell-Variablen, Sie sind ein großes Problem; es ist nicht tragbar, zuverlässig Weg, es zu tun. (Arrays sind Bash-spezifisch, das einzige tragbare Optionen sind
set
undeval
, die sind beide Fragen für die Trauer.) Ich würde überlegen, eine Notwendigkeit für diese als Indiz dafür, dass es Zeit war, zu umschreiben, in eine leistungsstärkere Skriptsprache, z.B. Perl oder Python.set
könnte eine Quelle der Trauer?Es gibt nur eine
"$@"
, so kann es nicht verwendet werden für mehr als eine Sache zu einer Zeit. Undset -- $VARIABLE; cmd "$@"
macht word splitting genau der gleichen Weisecmd $VARIABLE
hat, so ist das nicht gut. Und Sie haben, um sicherzustellen, dass Sie nicht immer eines der vielen andere Dingeset
hat durch einen Unfall.InformationsquelleAutor zwol