Bash
bash + 使用 printf 以特殊格式列印
我剛剛編寫了以下 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 $list
是zsh
語法。在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
.