Объединение строки из массива

#arrays #bash

#массивы #bash

Вопрос:

У меня есть полные имена, которые были считаны в массивы. Я пытаюсь создать файл, используя только последнее имя; в последнем имени могут быть пробелы, которые следует заменить символами подчеркивания. Моя мысль состоит в том, чтобы создать строку с именем файла, а затем создать файл. Я уже позаботился о случаях только с одной фамилией. У меня возникли проблемы с фамилиями с пробелами. Это то, что у меня есть до сих пор:

 if [ "${#name_arr[@]}" -eq 2 ]; then
    for i in "${name_arr[@]:1}";do  # :1 because first element is their first name
        last_name=$i
    done
    echo $last_name
else
    for i in "${name_arr[@]:1}";do
        last_name=${last_name}_${i}
    done
    echo $last_name
fi
  

Вывод этого объединяет все имена с подчеркиванием. Поэтому вместо:

 Doe
Austen
Vaughn_Williams
Doe
  

Это эхо:

 Doe
Austen
Austen_Vaughn_Williams
Doe
  

Комментарии:

1. Вы имеете в виду if [ "${#name_arr[@]}" -eq 2 ] (обратите внимание на # )?

2. @tripleee да, извините, это была опечатка. Просто исправлено.

3. Фактический результат будет _Vaughn_Williams и нет Austen_Vaughn_Williams . Он будет начинаться с ‘_’ на основе вашего кода. Вы уверены, что отправляете правильный вывод?

4. Да, это то, что показывает мой вывод. Раньше подчеркивания не было. Редактировать: если я изменю переменную для last name на long_last_name , то она будет выводиться _Vaughn_Williams .

Ответ №1:

Вам не нужны циклы или вам не нужно проверять длину списка. Просто соедините все элементы, кроме первого, с пробелом, чтобы получить последнее имя.

 last_name=${name_arr[*]:1}  # Assuming the default value of IFS
last_name=${last_name// /_}
  

Ценой форка вы можете сделать это в одной строке.

 last_name=$(IFS='_'; echo "${name_arr[*]:1}")
  

Ответ №2:

Попробуйте этот подход

 if [ "${#name_arr[@]}" -eq 2 ]; then
    for i in "${name_arr[@]:1}";do  # :1 because first element is their first name
        last_name=$i
    done
    echo $last_name
else
    last_name=${name_arr[1]}
    for i in "${name_arr[@]:2}";do
        last_name=${last_name}_${i}
    done
    echo $last_name
fi
  

Сначала возьмите 2-й элемент name_arr в last_name и добавьте остальные элементы массива в переменную last_name с помощью цикла