#arrays #bash #shell
#массивы #баш #оболочка
Вопрос:
Мой массив bash никогда не опустошается.
Я использую bash 3.2.25. Я попробовал использовать следующие методы:
declare -a array
# fill array...
# 1
array=()
# 2
empty_array=()
array=( "${empty_array[@]}" )
# 3
unset array
Мой массив никогда не опустошается, я делаю что-то не так?
Полный код по запросу :
declare -a array
function get_array() {
#active_tills=()
#unset active_tills
#active_tills=( "${active_tills[@]}" )
# fill array
while read -r line || [[ -n "$line" ]]; do
line=$(echo "$line" | cut -d' ' -f1)
if [ -n "$line" ] ; then
to_add ="$line "
fi
done < "$request_tmp"
array=($(echo $to_add))
return 0
}
Затем
get_array
for host in "${array[@]}"; do
echo "=> $host"
done
# 1
# 2
# 3
get_array
for host in "${array[@]}"; do
echo "=> $host"
done
# 1
# 2
# 3
# 1
# 2
# 3
Комментарии:
1. Вы действительно печатали
array=(( "${empty_array[@]}" )
на машинке ? Это должно выдать ошибку.2. Использование
array=()
работает для меня; я не могу воспроизвести вашу проблему.3. Я предполагаю, что это те три метода, которые вы пытались использовать для очистки своего массива, а отсутствующая фигурная скобка была ошибкой вставки.
unset array
должно сработать, можем ли мы увидеть более полный пример?4. Ну, мой код так прост:/ Я не понимаю, почему мой массив просто не опустошается. Также да (была опечатка
5. Кроме того, есть ли причина, по которой вы используете 9-летнюю версию
bash
?
Ответ №1:
to_add
это также глобальная переменная, и вы не сбрасываете ее значение перед добавлением к ней. Однако вам это не нужно: вы можете добавлять непосредственно к массиву.
declare -a array
function get_array() {
local line rest
array=()
while read -r line rest || [[ -n "$line" ]]; do
if [ -n "$line" ] ; then
array =("$line")
fi
done < "$request_tmp"
return 0
}
Кроме того, если вы можете гарантировать, что входной файл заканчивается новой строкой (как требуется для правильного текстового файла в POSIX), вам не нужен || [[ -n $line ]]
взлом в вашем while
цикле.
Комментарии:
1. to_add нигде не определен, я имею в виду, что он используется непосредственно здесь. Делает ли это его глобальным? это все объяснило бы. Также сначала я был готов использовать array =(«$line»), но я использовал array =»$line»… Спасибо
2. Любая переменная, установленная в функции, по умолчанию является глобальной. Вам не нужно определять переменные как таковые; они появляются в тот момент, когда вы присваиваете значение имени. Вы можете сделать переменную локальной с
local
помощью команды; Я обновлю вопрос, чтобы продемонстрировать это.