Зациклить все аргументы в сценарии оболочки

Это не похоже на хорошее решение, но оно работает:

if [ "$(echo $(lsb_release -i))" = "Distributor ID: RedHatEnterpriseClient" ]; then echo yes; else echo no; fi
0
26.11.2018, 12:06
4 ответа

Suponiendo un shell POSIX, desea un bucle foraquí, 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"
2
28.01.2020, 02:18
#!/bin/bash

for file in "${@}"; do
    wc -l -- "${file}"
done

#!/bin/bashPrograma que ejecutará este script.

${@}Argumentos posicionales. Argumentos que le das al script a través de la línea de comando.

fileVariable 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 ).

0
28.01.2020, 02:18

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 -len todos ellos.

La salida es analizada por sedque 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 -lse transforma en la salida que desea capturando el número de líneas y el nombre del archivo y luego insertando la cadena lines inen -en el medio.

Ejecutar el script con mis propios archivos .vimrc, .profiley .mailrcdevolverá

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.

2
28.01.2020, 02:18

Альтернативный вариант с использованием whileиshift

while [ $# -gt 0 ] ; do
    printf '%u lines in %s\n' $(wc -l < "$1") "$1"
    shift
done
0
28.01.2020, 02:18

Теги

Похожие вопросы