Lendo a entrada do usuário no Linux

2

Eu escrevi um script para listar arquivos com base no mês que é lido pelo usuário conforme abaixo: -

echo "Enter Month"
read month
ls -al | awk '$6 == "$month" {print}'

E eu estou dando a entrada do usuário como agosto, eu não estou recebendo nenhum resultado. Mas quando estou escrevendo

ls -al | awk '$6 == "Aug" {print}'

Estou obtendo o resultado exato. Estou fazendo algo errado? Por favor ajude

    
por Prashast 16.10.2017 / 04:26

1 resposta

8

O principal é: os nomes das variáveis não são expandidos entre aspas simples. Esta é uma linha "melhor" (isto é, um pouco menos errada):

ls -al              | awk '$6 == "'"$month"'" {print}'
# this is in single quotes ^^^^^^^          ^^^^^^^^^

Mas:

  1. Ainda assim, isso pode falhar em algumas localidades. Defina LC_ALL=C ou talvez por isso.
  2. Com $month você pode injetar (quase?) qualquer coisa em awk . Existem maneiras melhores de usar variáveis em awk ; -v option deve ser muito mais seguro (obrigado user000001 por apontar isto).
  3. Você não deve analisar a saída de ls em primeiro lugar.

A solução certa pode usar find e stat . O código a seguir pode não ser a solução mais rápida, mas é mais robusto devido a:

  • descartando valores de $month que não correspondem aos valores predefinidos,
  • usando find em vez de analisar ls .

O código:

#!/bin/sh
echo "Enter Month"
read month
case "$month" in
  1|01|Jan|jan|January|january)   monthN=01;;
  2|02|Feb|feb|February|february) monthN=02;;
# ...
  10|Oct|oct|October|october)     monthN=10;;
# ...
  *) echo Error! >&2; exit 1;;
esac
find ./ -maxdepth 1 -exec sh -c '[ 'stat -c %y "$1" | cut -c 6-7' = "$2" ]' sh {} "$monthN" \; -ls

Eu testei isso no Debian; pode não ser super-portátil. Ele mostra a abordagem geral embora.

A última linha invoca um shell separado para cada objeto no diretório atual (incluindo ./ em si). Este shell usa stat para obter informações mtime e, em seguida, cut extrai o número de dois dígitos do mês a partir dele. [ ... ] compara o resultado com o número do mês escolhido. Se esse teste for bem-sucedido, find executará seu próprio ls no objeto (você poderá usar -print ou -print0 ).

Observe que isso nunca retorna ../ . Por outro lado, find permite que você use testes adicionais (como -type f ), portanto, essa abordagem é muito flexível.

    
por 16.10.2017 / 05:40

Tags