2014-10-10 1 views
2

Как распечатать массив в BASH с разделителем полей между каждым значением и новой строкой в ​​конце.BASH printf array с разделителем полей и новой строкой при последней записи

Ближайший я могу получить с одним printf printf '%s|' "${arr1[@]}" где | является разделителем полей. Проблема в том, что в конце нет разрыва строки. Любая комбинация \ n, которую я пытаюсь включить, либо помещает прерывание строки на каждую запись, либо вообще ничего!

Есть ли способ сделать это в одной строке или мне нужно использовать printf '%s|' "${arr1[@]}";printf "\n"

Спасибо,

Geraint

+0

Или 'Printf '% s |' "$ {arr1 [@]}"; echo' – anubhava

ответ

6

Да, вам нужны две команды для этого. printf '%s|' "${array[@]}"; echo является совершенно обычным.

С другой стороны, если вы не хотите, концевая |, вы можете временно изменить IFS использовать выбранный разделитель в качестве первого символа, а также использовать "${array[*]}":

IFS="|$IFS"; printf '%s\n' "${array[*]}"; IFS="${IFS:1}" 
+2

Или просто '(IFS =" | $ IFS "; printf '% s \ n'" $ {array [*]} ")', используя подоболочку, чтобы локализовать изменение на 'IFS'. – chepner

1

Если вы не хотите иметь | печати, вы также можете удалить его и просто положить в пространстве или что-то Seperator вы хотите использовать (например, или -):

printf '%s ' "${arr1[@]}" ; printf '\n'

Если вам это нужно чаще вы должны использовать функцию, из-за написания и тот же код снова и снова не лучшим образом:

print_array() 
{ 
    # run through array and print each entry: 
    local array 
    array=("[email protected]") 
    for i in "${array[@]}" ; do 
     printf '%s ' "$i" 
    done 
    # print a new line 
    printf '\n' 
} 

использование:

print_array "${array_name[@]}" 

пример:

array01=(one two three) 
print_array "${array01[@]}" 
echo "this should be a new line" 

выход:

one two three 
this should be a new line