2016-07-01 4 views
2

Я хочу построить строку, содержащую цитируемые группы слов. Эти группы должны перейти к одному аргументу функции. Я пытался играть с массивами. Буквально сконструированные массивы работают, но я все же надеюсь найти волшебный синтаксис для пустой строки.Как сохранить разделенные пробелы группы в bash

# literal array 
LA=(a "b c") 

function printArgs() { # function should print 2 lines 
    while [ $# -ne 0 ] ; do print $1 ; shift; done 
} 

printArgs "${LA[@]}" # works fine 
# but how to use string to split only unquoted spaces? 

LA="a \"b c\"" 
printArgs "${LA[@]}" # doesn't work :(
LA=($LA) 
printArgs "${LA[@]}" # also doesn't work :(

Баш массивы имеют проблемы, они не могут быть переданы транспортером - (эхо/$()).

+0

Конечно нет. Если бы это было возможно *, для массивов не было бы необходимости. – chepner

ответ

0

грязный подход был бы:

#!/bin/bash 
LA=(a "b c") 

function printArgs() 
{ # function should print 2 lines 
    while [ $# -ne 0 ] 
    do 
    echo "${1//_/ }" #Use parameter expansion to globally replace '_' with space 
    #Do double quote as we don't want to have word splitting 
    shift 
    done 
} 

printArgs "${LA[@]}" # works fine 

LA="a b__c" # Use a place holder '_' for space, note the two '_' for two spaces 
printArgs $LA #Don't double quote '$LA' here. We wish word splitting to happen. And works fine :-) 

Пример вывода

a 
b c 
a 
b c 

Обратите внимание, что количество мест внутри сгруппированных образований сохраняются


Sidenote

Выбор места для хранения здесь имеет решающее значение. Надеюсь, вы можете найти тот, который не будет отображаться в строке.

Смежные вопросы