it-swarm.com.de

Bash-Skript zum Empfangen und Umleiten von Parametern in Anführungszeichen

Ich versuche, Parameter eines Bash-Skripts in Anführungszeichen zu setzen, damit sie sicher von einem verschachtelten Skript empfangen werden können. Irgendwelche Ideen?

test.sh

#!/bin/bash
echo $*
bash myecho.sh $*

myecho.sh

#!/bin/bash
 echo $1
 echo $2
 echo $3
 echo $4

Stichprobe:

bash test.sh aaa bbb '"ccc ddd"'

Ergebnis:

aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"

Gesuchtes Ergebnis

aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
94
chilltemp
#!/bin/bash
echo $*
bash myecho.sh "[email protected]"

Beachten Sie, dass das Konstrukt "$ @" nicht bash-spezifisch ist und mit jeder POSIX-Shell funktionieren sollte (zumindest mit Bindestrich). Beachten Sie auch, dass Sie angesichts der gewünschten Ausgabe überhaupt keine zusätzliche Quote benötigen. I.E. Rufen Sie einfach das obige Skript wie folgt auf:

./test.sh 1 2 "3 4"
67
pixelbeat

Sie möchten "$ @" (quoted dollar at) verwenden, um Parameter an einen Index zu übergeben. Wie so ....

ls-color.sh:

#!/bin/bash
/bin/ls --color=auto "[email protected]"    # passes though all CLI-args to 'ls'


Warum?.

Aus der Bash-Manpage :

$* - Erweitert die Positionsparameter, beginnend mit eins. Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird sie zu einem einzelnen Wort erweitert, wobei der Wert jedes Parameters durch das erste Zeichen der IFS-Sondervariablen getrennt wird. Das ist, "$*" ist äquivalent zu "$1c$2c...", wobei c das erste Zeichen des Werts der IFS-Variablen ist. Wenn IFS nicht gesetzt ist, werden die Parameter durch Leerzeichen getrennt. Wenn IFS null ist, werden die Parameter ohne Trennzeichen verknüpft.

[email protected] - Erweitert die Positionsparameter, beginnend mit eins. Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird jeder Parameter zu einem separaten Wort erweitert. Das ist, "[email protected]" ist äquivalent zu "$1" "$2" ... Wenn die doppelte Erweiterung in Anführungszeichen innerhalb eines Wortes auftritt, wird die Erweiterung des ersten Parameters mit dem Anfangsteil des ursprünglichen Wortes verbunden, und die Erweiterung des letzten Parameters wird mit dem letzten Teil des ursprünglichen Wortes verbunden. Wenn keine Positionsparameter vorhanden sind, wird "[email protected]" und [email protected] zu nichts erweitern (d. h. sie werden entfernt).


Einrichten einiger Demo-Skripte ...

echo 'echo -e "\$1=$1\n\$2=$2\n\$3=$3\n\$4=$4"' > echo-params.sh
echo './echo-params.sh $*' > dollar-star.sh
echo './echo-params.sh [email protected]' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "[email protected]"' > quoted-dollar-at.sh
chmod +x *.sh

"[email protected]" - quoted-dollar-at ist eine Identitätstransformation für die Weitergabe von Argumenten an eine Subshell (~ 99 % der Zeit, das wollten Sie machen):

./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2=            
  # $3= 'cc cc'
  # $4= "ddd ddd"

"$*" - quoted-dollar-star Zerschmettert die Argumente in eine einzelne Zeichenfolge (~ 1% der Zeit, die Sie möchte eigentlich dieses Verhalten, zB in einer Bedingung: if [[ -z "$*" ]]; then ...):

./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa  'cc cc' "ddd ddd"   
  # $2=                     
  # $3=             
  # $4=

$*/[email protected] - Ohne Anführungszeichen entfernen beide Formulare eine Anführungszeichenebene und interpretieren Leerzeichen aus den zugrunde liegenden Zeichenfolgen, ignorieren jedoch Anführungszeichen (dies ist fast immer ein Fehler):

./dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc                  
  # $3= cc'
  # $4= "ddd

./dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc
  # $3= cc'
  # $4= "ddd

Wenn Sie Spaß haben möchten, können Sie mit "$ @" die Elemente so tief verschachteln, wie Sie möchten.

function identity() {
  "[email protected]"
}
set -x
identity identity identity identity identity echo Hello \"World\"
# + identity identity identity identity identity echo Hello '"World"'
# + identity identity identity identity echo Hello '"World"'
# + identity identity identity echo Hello '"World"'
# + identity identity echo Hello '"World"'
# + identity echo Hello '"World"'
# + echo Hello '"World"'
# Hello "World"
138
Dave Dopson