Напечатайте несколько массивов разных размеров в разных столбцах, используя скрипт bash - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь создать отчет о состоянии linux box с краткой информацией. Я использую jps для заполнения нескольких массивов именами экземпляров нашего приложения, которое работает. Затем я хочу напечатать эти отсортированные массивы в 4 столбцах, чтобы мы могли видеть, что работает легко.

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

Ниже приведен код, который у меня есть, но он выдает ошибки «Команда не найдена», когда пытается выполнить команду внутри цикла. Идея состоит в том, чтобы попытаться использовать условную логику, чтобы определить, находится ли текущий массив вне границ, и если это так, просто выведите «».

Я пытался с ``, чтобы он выглядел как код. Я пробовал и без них. Я пробовал без "" и с ними. Я пытался с $ {} вокруг переменных и без. Я также пробовал использовать () для значений и без.

Я не совсем понимаю, что происходит за кулисами этого кода и сценариев на машинном коде Windows, предназначенном для командной строки Linux. коробка не легко отлаживать. Есть предложения?

printf "| %-40s | %-40s | %-40s | %-40s |\n" "Array 1:" "Array 2:" "Array 3:" "Array 4:" >> ${OUTPUT}
for i in $(seq ${maxRows}); do
    (The command below is all on one line but to make it more readable here I entered on multiple.)
    printf "| %-40s | %-40s | %-40s | %-40s |\n" "`[[ ${i} > ${#Array1[@]} ]] && ("") ||
    ("${Array1[$i]}")`" "`[[ $i > ${#Array2[@]} ]] && "" || ${Array2[$i]}`" "`[[ $i > ${#Array3[@]} ]] 
    && "" || ${Array3[$i]}`" "`[[ $i > ${#Array4[@]} ]] && "" || ${Array4[$i]}`" >> ${OUTPUT}
done

1 Ответ

0 голосов
/ 07 октября 2019

в bash, элементы массива без значения могут быть доступны и будут возвращать неопределенные значения, которые будут отображаться в виде пустой строки. Нет необходимости проверять ограничение отдельных индексов массива.

Технически, существует много проблем с цитированием printf в цикле. Альтернатива:

for i in $(seq ${maxRows}); do
    printf "| %-40s | %-40s | %-40s | %-40s |\n" "${Array1[$i]}" "${Array2[$i]", "${Array4[$i]}" "${Array3[$i]}" >> $OUTPUT
done

Примечания: при таком подходе будет установлен предел maxRows, так как для этого потребуется список 1 2 3 ... maxRows, чтобы поместиться в одну строку. Для более высокого лимита

for ((i=1; i<=maxRows; i++)); do
    printf "| %-40s | %-40s | %-40s | %-40s |\n" "${Array1[$i]}" "${Array2[$i]", "${Array4[$i]}" "${Array3[$i]}" >> $OUTPUT
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...