#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 с помощью цикла