O código é:
#!/bin/bash
ips[0]='192.168.0.1'
ips[1]='192.168.0'
ips[2]='255.255.255.256'
ips[3]='123.123.123.123.123'
ips[4]='a.b.c.d'
ips[5]='255.255.255.255'
ips[6]='0.0.0.0'
ips[7]='192.168.1.1'
ips[8]='4.2.2.2'
regex="^((25[0-5]|2[0-4][0-9]|[01][0-9][0-9]|[0-9]{1,2})[.]){3}(25[0-5]|2[0-4][0-9]|[01][0-9][0-9]|[0-9]{1,2})$"
regexVar=$(printf "\033[33mSaved in a VARIABLE\033[0m")
regexStr=$(printf "\033[34mIs a STRING\033[0m")
validOut=$(printf "\033[32mValid\033[0m")
invalidOut=$(printf "\033[31mInvalid\033[0m")
noQuotes="NO quotes"
singleQuotes="Single quotes"
doubleQuotes="Double quotes"
printStyle="%-25s %-10s %-20s %-10s\n"
printTitle=$(printf "${printStyle}" "IP Address" "Validity" "Regex" "Quote Type")
print2ndLine=$(printf "${printStyle}" "====================" "==========" "====================" "==========")
function validIP1a() {
echo "${printTitle}"
echo "${print2ndLine}"
for (( i=0; i<${#ips[@]}; i++ )); do
if [[ "${ips[i]}" =~ $regex ]]; then
printf "${printStyle}" "${ips[i]}" "${validOut}" "${regexVar}" "${noQuotes}"
else
printf "${printStyle}" "${ips[i]}" "${invalidOut}" "${regexVar}" "${noQuotes}"
fi
done
}
validIP1a
A saída é:
A saída esperada é:
Por que não consigo obter o resultado esperado? Como resolver isso?
Porque
printf
conta os caracteres no código de escape que define a cor; ele não sabe que eles realmente não imprimem. Você precisaria colocá-los fora das%-20s
strings formatadas de comprimento fixo ( ). Compare os doisprintf
aqui:A saída deve ficar assim:
Claro, se a cor pode mudar, podemos colocá-la em outra variável:
Você pode querer contar os caracteres em
validOut
einvalidOut
; Conto mais de 10 em cada um deles:Lembre-se de que os pobres
printf
não podem saber que alguns desses caracteres são invisíveis e mudam de cor... Você solicitou um campo alinhado à esquerda de pelo menos 10 caracteres e depois o preencheu com strings com mais de 10 caracteres; não admira que o resultado não esteja alinhado verticalmente.