Это не похоже на хорошее решение, но оно работает:
if [ "$(echo $(lsb_release -i))" = "Distributor ID: RedHatEnterpriseClient" ]; then echo yes; else echo no; fi
Suponiendo un shell POSIX, desea un bucle for
aquí, recorriendo "$@"
que contiene los argumentos de la línea de comando:
for filename in "$@"; do
lines=$(wc -l < "$filename")
printf '%u lines in %s\n' "$lines" "$filename"
done
Usar todas las comillas es muy importante. Le permite pasar nombres de archivo que contienen espacios y otros caracteres.
./my_script.sh /var/log/syslog "$HOME/My Dir with Spaces/a file with spaces.txt"
#!/bin/bash
for file in "${@}"; do
wc -l -- "${file}"
done
#!/bin/bash
Programa que ejecutará este script.
${@}
Argumentos posicionales. Argumentos que le das al script a través de la línea de comando.
file
Variable que iterará sobre los argumentos dados en ${@}
.
wc -l -- "${file}"
Comando externo que imprimirá el número de líneas en${file}
(excepto cuando ${file}
es -
en cuyo caso imprimirá el número de líneas en su entrada estándar ).
En general, para recorrer el argumento de la línea de comando en un script o función de shell, puede hacer
for thing do
commands using "$thing"
done
o
for thing in "$@"; do
commands using "$thing"
done
En este caso, suponiendo que los nombres de archivo proporcionados en la línea de comando no contengan saltos de línea literales, no hay necesidad de hacer un bucle de shell explícito para esto:
wc -l -- "$@" | sed -E '$d;s/^[[:blank:]]*([[:digit:]]*)[[:blank:]]*(.*)/\1 lines in \2/'
Esto tomaría todos los argumentos de la línea de comando y ejecutaría wc -l
en todos ellos.
La salida es analizada por sed
que descarta la última línea que contiene el número total de líneas en los archivos dados (usando$d
). El resto de la salida de wc -l
se transforma en la salida que desea capturando el número de líneas y el nombre del archivo y luego insertando la cadena lines in
en -en el medio.
Ejecutar el script con mis propios archivos .vimrc
, .profile
y .mailrc
devolverá
8 lines in.vimrc
8 lines in.profile
4 lines in.mailrc
Tenga en cuenta que wc -l -- "$@"
creará una salida como
8.vimrc
8.profile
4.mailrc
20 total
que en realidad puede ser suficiente para lo que desea, sin la necesidad de sed
.
Альтернативный вариант с использованием while
иshift
while [ $# -gt 0 ] ; do
printf '%u lines in %s\n' $(wc -l < "$1") "$1"
shift
done