Wie mache ich das?
$ for l in "aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"; do echo $l; done aString that may haveSpaces IN IT bar foo bamboo bam boo
Was mache ich, wenn sich meine Zeichenfolge in einer bash
Variablen befindet?
Der einfache Ansatz der Verwendung des bash
Zeichenfolgen-Tokens funktioniert nicht, da er sich in jeden Bereich aufteilt, nicht nur in die außerhalb von Anführungszeichen stehenden:
DavidPostill@Hal /f/test $ cat ./test.sh #! /bin/bash string='"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"' for word in $string; do echo "$word"; done DavidPostill@Hal /f/test $ ./test.sh "aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"
Um dies zu umgehen, zeigt das folgende Shell-Skript (splitstring.sh) einen Ansatz:
#! /bin/bash string=$(cat <<'EOF' "aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo" EOF ) echo Source String: "$string" results=() result='' inside='' for (( i=0 ; i<${#string} ; i++ )) ; do char=$ if [[ $inside ]] ; then if [[ $char == \\ ]] ; then if [[ $inside=='"' && $ == '"' ]] ; then let i++ char=$inside fi elif [[ $char == $inside ]] ; then inside='' fi else if [[ $char == ["'"'"'] ]] ; then inside=$char elif [[ $char == ' ' ]] ; then char='' results+=("$result") result='' fi fi result+=$char done if [[ $inside ]] ; then echo Error parsing "$result" exit 1 fi echo "Output strings:" for r in "$" ; do echo "$r" | sed "s/\"//g" done
Ausgabe:
$ ./splitstring.sh Source String: "aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo" Output strings: aString that may haveSpaces IN IT bar foo bamboo bam boo
Quelle: StackOverflow Antwort Trennen Sie einen String nur durch Leerzeichen, die außerhalb von Anführungszeichen von Choroba stehen . Das Skript wurde an die Anforderungen der Frage angepasst.