在您的printf
命令之前,您要检查名称是否超过 14 个字符,如果是,则截断它并将最后三个字符替换为点。此命令执行此操作:
(( ${#name} > 14 )) && name="${name:0:11}..."
它用name
前十一个字符替换并附加...
。
您还必须修复printf
格式字符串:而不是
'%-14s -%3s -%3s\n'
它一定要是
'%-14s %-3s -%-3s\n'
或者你会得到诸如
Avril Stewart - 99 - 54
不过,也许这只是一个错字,因为您的示例输出没有连字符。
总而言之:
$ name='Avril Stewart'; weight=99; height=54
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Avril Stewart 99 54
$ name='Sally Kinghorn'; weight=170; height=60
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Sally Kinghorn 170 60
$ name='Yutte Schimmelpeninck'; weight=250; height=40
$ (( ${#name} > 14 )) && name="${name:0:11}..."
$ printf '%-14s %-3s %-3s\n' "$name" $weight $height
Yutte Schim... 250 40
所以如果你从一个文件中读取这个,例如逗号分隔,你最终会得到一个这样的循环:
while IFS=, read -r name weight height; do
(( ${#name} > 14 )) && name="${name:0:11}..."
printf '%-14s %-3s %-3s\n' "$name" $weight $height
done < inputFile
导致
Avril Stewart 99 54
Sally Kinghorn 170 60
John Young 195 120
Yutte Schim... 250 40
我认为单行是不可能的。我尝试了三元运算符并尝试了类似的东西
printf '%s\n' $(( ${#name} > 14 ? "${name:0:11}..." : "$name" ))
但这里的问题是它只适用于整数,而字符串在算术上下文中扩展为零。