bash: Verwendung eines in Anführungszeichen gesetzten Arguments in select


0

Aus einem Befehl erhalte ich einige Argumente, die ich dem Benutzer mit der select-Anweisung von bash in einem Shell-Skript anbieten möchte. Die vom Befehl angegebenen Argumente können Leerzeichen enthalten und sind daher durch Anführungszeichen geschützt. Hier ist ein vereinfachtes Beispiel.

Das funktioniert wie erwartet:

select opt in a b "c d"
do
  echo $opt
  break
done

Die Ausgabe ist wie erwartet:

1) a
2) b
3) c d
#? 

Aber mit der Ausgabe des Befehls in einer Variablen funktioniert es nicht wie erwartet:

opts="a b \"c d\""
select opt in $opts
do
  echo $opt
  break
done

Obwohl $ opts dasselbe enthält wie die hartcodierte Eingabe im ersten Auswahlbeispiel, ist die Ausgabe anders:

1) a
2) b
3) "c
4) d"
#?

Es ist also nicht so, dass Bash die Zitate aufgebraucht hat. Sie werden beibehalten, aber die Anführungszeichen enthalten keine Argumente wie bei der harten Kodierung. Wie ich bereits geschrieben habe, erhalte ich die Argumente als Ausgabe eines Befehls. Sie können Leerzeichen enthalten und sind daher bereits durch Anführungszeichen geschützt. Wie bringe ich sie in einem Stück zur 'select'-Anweisung? Es geht nicht um einfache und doppelte Anführungszeichen. Mit einfachen Anführungszeichen passiert dasselbe:

1) a
2) b
3) 'c
4) d'
#?

Antworten:


0

Diese Lösung soll Ihnen helfen:

#!/bin/bash

opts=(a b "c d");

select opt in "${opts[@]}"
   do echo $opt; 
   break; 
done

Ja das funktioniert Vielen Dank. Ich arbeite jetzt daran, die Ausgabe des Befehls in einem Stück in $ opts zu bringen. Auch dort wird es in Array-Elemente an den Zwischenräumen zwischen Anführungszeichen aufgeteilt.
Markus

0

Verwenden Sie ein Array:

opts=("a" "b" "c d");select opt in "${opts[@]}"; do echo $opt; break; done

Ja das funktioniert Vielen Dank. Es ist die gleiche Lösung wie die von @podwysoc
Markus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.