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:
- Ainda assim, isso pode falhar em algumas localidades. Defina
LC_ALL=Cou talvez por isso. - Com
$monthvocê pode injetar (quase?) qualquer coisa emawk. Existem maneiras melhores de usar variáveis emawk;-voption deve ser muito mais seguro (obrigado user000001 por apontar isto). -
Você não deve analisar a saída de
lsem 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
$monthque não correspondem aos valores predefinidos, - usando
findem vez de analisarls.
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.