использовать printf для форматирования вывода массива

Вы можете сделайте то, о чем вы просите, вот так:

#!/bin/bash
mkdir -p temp
cd temp

cat <<\_script_lines_ > max.sh
#!/bin/bash
if [ "$1" -gt "$2" ] ;
then
    printf '%s\n' "$1"
else
    printf '%s\n' "$2"
fi
_script_lines_

chmod u+x max.sh             ### make the script excutable.

# Use the script:
./max.sh 4 6
./max.sh -2 -5
./max.sh 7 -3

Но функция, уже рекомендованная Wildcard, кажется более разумной для использования.

4
18.04.2016, 11:54
2 ответа

Вот небольшая модификация того, что вы уже делали:

set -f # to prevent filename expansion
for i in ${!NIC_index[@]}
do
  printf "%-20s" ${NIC_details[i]}
  printf "\n"
done

Я добавил цикл for , чтобы просмотреть все индексы массива - это $ {! NIC ... синтаксис. Поскольку это числовой массив, в качестве альтернативы вы можете перебирать индексы в цикле.

Обратите внимание, что я намеренно оставил $ {NIC_details [i]} без кавычек , чтобы оболочка разделяла значение на пробелы, которые вы использовали для разделения значений. Таким образом, printf видит 3 значения и повторяет форматирование% -20s для каждого из них. Затем я добавляю новую строку после каждой сетевой карты, чтобы получилась красивая таблица.

set -f вверху важен, если мы оставляем переменные без кавычек; в противном случае оболочка вмешается и попытается указать любые символы подстановки, которые она видит в переменных без кавычек.

Пример вывода:

wlp2s0              192.168.1.221       xx:xx:xx:xx:xx:xx
wwan0               none                xx:xx:xx:xx:xx:xx
virbr0              192.168.122.1       00:00:00:00:00:00
5
27.01.2020, 20:52

Да, есть способ, используйте awk .
Один пример:

echo ${NIC[0]} | awk '{ printf "%-10s %s\n", $1, $2 }'

Другой способ - получить значения в разных переменных, а затем выполнить printf из bash. Например:

var1=$(echo ${NIC[0]} | cut -d ' ' -f1)
var2=$(echo ${NIC[0]} | cut -d ' ' -f2)
var3=$(echo ${NIC[0]} | cut -d ' ' -f3)

И используйте printf с $ var1,2,3.

1
27.01.2020, 20:52

Теги

Похожие вопросы