Bash

bash + 使用 printf 以特殊格式列印

  • February 3, 2020

我剛剛編寫了以下 bash 腳本來檢查 Linux 機器列表上的 ping 訪問:

for M in $list
do
  ping -q -c 1  "$M" >/dev/null 
         if [[ $? -eq 0 ]]
  then
   echo "($C) $MACHINE CONNECTION OK"
  else
   echo "($C) $MACHINE CONNECTION FAIL"
  fi

  let C=$C+1
done

這列印:

(1) linux643 CONNECTION OK
(2) linux72 CONNECTION OK
(3) linux862 CONNECTION OK
(4) linux12 CONNECTION OK
(5) linux88 CONNECTION OK
(6) Unix_machinetru64 CONNECTION OK

如何printf在我的 bash 腳本中使用(或任何其他命令)以列印以下格式?

(1) linux643 ............ CONNECTION OK
(2) linux72 ............. CONNECTION OK
(3) linux862 ............ CONNECTION OK
(4) linux12 ............. CONNECTION OK
(5) linux88 ............. CONNECTION FAIL
(6) Unix_machinetru64 ... CONNECTION OK

使用參數擴展替換%-s由點產生的空格:

#!/bin/bash
list=(localhost google.com nowhere)
C=1
for M in "${list[@]}"
do
   machine_indented=$(printf '%-20s' "$M")
   machine_indented=${machine_indented// /.}

   if ping -q -c 1  "$M" &>/dev/null ;  then
       printf "(%2d) %s CONNECTION OK\n" "$C" "$machine_indented"
   else
       printf "(%2d) %s CONNECTION FAIL\n" "$C" "$machine_indented"
   fi
   ((C=C+1))
done

for m in $listzsh語法。在bash它會for i in "${list[@]}"

bash沒有填充運算符。printf您可以使用但只能使用空格而不是任意字元進行填充。zsh有填充操作符。

#! /bin/zsh -
list=(
 linux643
 linux72
 linux862
 linux12
 linux88
 Unix_machinetru64
)
c=0
for machine in $list; do
 if ping -q -c 1 $machine >& /dev/null; then
   state=OK
 else
   state=FAIL
 fi
 printf '%4s %s\n' "($((++c)))" "${(r:25::.:):-$machine } CONNECTION $state"
done

填充運算符是使用空格填充長度為 25 的右填充或${(r:25:)parameter}使用任何字元串${(r:25::string:)parameter}而不是空格填充右填充。

我們還使用printf '%4s'填充空格(x)。我們可以${(l:4:):-"($((++c)))"}改用。但一個顯著的區別是,如果字元串長度超過 4 個字元,${(l)}則會截斷它,而它會溢出printf.

引用自:https://unix.stackexchange.com/questions/293107