Ayuda con script loop / counter

1

Estoy intentando crear una secuencia de comandos de bucle / contador simple para mostrar información sobre las impresoras instaladas. Principal el nombre, PPD, versión de PPD y URI. Tengo dos problemas ... 1 - el nombre no aparece; 2 - la segunda impresora PPD es incorrecta.

Aquí lo que tengo:

#!/bin/bash
name=($(/usr/sbin/system_profiler SPPrintersDataType | /usr/bin/awk -F ":" '/Name/{$1="";print $0}' | /usr/bin/sed 's/\ /-,--/g'))
ppd=($(/usr/sbin/system_profiler SPPrintersDataType | /usr/bin/awk -F ":" '/PPD/{$1="";print $0}' | /usr/bin/sed 's/\ /-,--/g'))
ppdversion=($(/usr/sbin/system_profiler SPPrintersDataType | /usr/bin/awk -F ":" '/PPD File Version/{$1="";print $0}' | /usr/bin/sed 's/\ /-,--/g'))
uri=($(/usr/sbin/system_profiler SPPrintersDataType | /usr/bin/awk '/URI/{print $NF}'))
total="${#ppdversion[@]}"
/bin/echo -n "<result>"
for ((counter=0; counter < "$total"; counter++))
{
    echo "name: ${name[$counter]}" | /usr/bin/sed 's/-,--/\ /g;s/\ \ //g'
    echo "PPD: ${ppd[$counter]}" | /usr/bin/sed 's/-,--/\ /g;s/\ \ //g'
    echo "PPD Version: ${ppdversion[$counter]}" | /usr/bin/sed 's/-,--/\ /g;s/\ \ //g'
    echo "URI: ${uri[$counter]}"
    echo
}
echo "</result>"

La salida:

<result>
name: 
PPD: Canon MX410 series
PPD Version: 16.10.0.0
URI: lpd://printer.local


name: 
PPD: 16.10.0.0
PPD Version: 16.10.0.0
URI: dnssd://Canon%20MX410%20series%20_1B181C000000._printer._tcp.local./auto

</result>

Gracias.

    
pregunta Webster Master 04.05.2018 - 05:33

1 respuesta

1
  1. El script está buscando "Nombre", pero no existe ningún campo titulado "Nombre", por lo que no se encuentra nada. Hay un comando alternativo lpstat que puede ser más fácil analizar el nombre y devuelve el mismo ordenamiento:

    /usr/bin/lpstat -p | awk '{print $2}'
    
  2. Dado que PPD también está en PPD Version , esto causa un conflicto. En su lugar, busque PPD: , como lo siguiente:

    ppd=($(/usr/sbin/system_profiler SPPrintersDataType \
               | /usr/bin/awk -F ":" '/PPD:/{$1="";print $0}' \
               | /usr/bin/sed 's/\ /-,--/g'))
    

Aquí hay un script completo: parece hacer lo que quieres:

 #!/bin/bash
 name=($(/usr/bin/lpstat -p | awk '{print $2}' | /usr/bin/sed 's/\ /-,--/g'))
 ppd=($(/usr/sbin/system_profiler SPPrintersDataType | /usr/bin/awk -F ":" '/PPD:/{$1="";print $0}' | /usr/bin/sed 's/\ /-,--/g'))
 ppdversion=($(/usr/sbin/system_profiler SPPrintersDataType | /usr/bin/awk -F ":" '/PPD File Version/{$1="";print $0}' | /usr/bin/sed 's/\ /-,--/g'))
 uri=($(/usr/sbin/system_profiler SPPrintersDataType | /usr/bin/awk '/URI/{print $NF}'))
 total="${#ppdversion[@]}"
 /bin/echo "<result>"
 for ((counter=0; counter < "$total"; counter++))
 {
     echo "name: ${name[$counter]}" | /usr/bin/sed 's/-,--/\ /g;s/\ \ //g'
     echo "PPD: ${ppd[$counter]}" | /usr/bin/sed 's/-,--/\ /g;s/\ \ //g'
     echo "PPD Version: ${ppdversion[$counter]}" | /usr/bin/sed 's/-,--/\ /g;s/\ \ //g'
     echo "URI: ${uri[$counter]}"
     echo
 }
 echo "</result>"

La salida (para mis impresoras instaladas):

<result>
name: Brother_MFC_9325CW
PPD: Brother MFC-9325CW CUPS
PPD Version: 4.5.2
URI: usb://Brother/MFC-9325CW?serial=000L2J998184

name: Canon_MX410
PPD: Canon MX410 series
PPD Version: 16.10.0.0
URI: dnssd://Canon%20MX410._printer._tcp.local./auto

</result>
    
respondido por el Scot 04.05.2018 - 05:52

Lea otras preguntas en las etiquetas