Сохранение вывода цикла for в массиве в Bash - PullRequest
0 голосов
/ 04 июня 2018

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

У меня есть следующий фрагмент кода, который делает это:

readarray -t percentage_storage_limit <<< "$(for ((j=0; j < ${#storage_usage_array[@]}; j++));    
    do $(awk "BEGIN {   
            ac=100*${storage_usage_array[$j]}/${storage_limit_array[$j]};    
            i=int(ac);   
            print (ac-i<0.5)?i:i+1    
         }");    
  done)";

Длина и storage_usage_array, и storage_limit_array одинаковы.Индекс в storage_usage_array соответствует хранилищу, используемому на сервере, а индекс для storage_limit_array соответствует ограничению на том же сервере.

Хотя приведенный выше оператор выполняется должным образом, я вижу «ошибка команды не найдена», какследуйте, что приводит к тому, что эти выходные данные не будут сохранены в массиве "factor_storage_limit".

8: command not found
4: command not found

я что-то здесь упускаю?Любая помощь будет очень признательна.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Причина, по которой это не работает, заключается в том, что когда вы заключаете awk в $(...), вы указываете bash выполнить его вывод, таким образом, вы хотите выполнить 8 или 4 и сообщить вам ошибки bash, чтобы это не былоне могу найти такую ​​команду.Только не заключайте awk в $(...), вы хотите захватить его вывод, а не выполнить его вывод.И было бы лучше использовать < <(...), а затем <<<"$(...)":

readarray -t percentage_storage_limit < <(
    for ((j=0; j < ${#storage_usage_array[@]}; j++)); do
         awk "BEGIN {   
            ac=100*${storage_usage_array[$j]}/${storage_limit_array[$j]};    
            i=int(ac);   
            print (ac-i<0.5)?i:i+1    
         }";
    done
)

В любом случае, ответ Гленна показывает «хороший» способ сделать это без вызова readarray.

0 голосов
/ 04 июня 2018

Я думаю, вы получаете слишком сложный синтаксис.Я бы просто накапливал массив внутри цикла for

percentage_storage_limit=()
for ((j=0; j < ${#storage_usage_array[@]}; j++)); do 
    percentage_storage_limit+=( $(
        awk -v u="${storage_usage_array[$j]}" -v l="${storage_limit_array[$j]}" '
            BEGIN {   
                ac = 100 * u / l
                i = int(ac)   
                print (ac-i < 0.5) ? i : i+1    
            }
        '
    ) )
done
...