Не удается очистить массив bash (bash — версия 3.2.25)

#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 помощью команды; Я обновлю вопрос, чтобы продемонстрировать это.