Главное: имена переменных не раскрываются в одинарных кавычках. Это "лучшая" (то есть чуть менее неправильная) строка:
ls -al | awk '$6 == "'"$month"'" {print}'
# this is in single quotes ^^^^^^^ ^^^^^^^^^
Но:
- Тем не менее, это может не получиться в некоторых регионах. Установите
LC_ALL=C
заранее или, может быть, так.
- С
$month
вы можете ввести (почти?) что-нибудь в awk
. Есть лучшие способы использовать переменные в awk
; Опция -v
должна быть намного безопаснее (спасибо user000001 за указание на это).
- Вы не должны анализировать вывод
ls
в первую очередь.
Правильное решение может использовать find
и stat
. Следующий код может быть не самым быстрым решением, но он более надежен из-за:
- отбрасывая значения
$month
которые не соответствуют предопределенным,
- используя
find
вместо парсинга ls
.
Код:
#!/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
Я проверил это на Debian; это не может быть супер-портативный. Это показывает общий подход, хотя.
Последняя строка вызывает отдельную оболочку для каждого объекта в текущем каталоге (включая ./
себя). Эта оболочка использует stat
для получения информации mtime, а затем cut
из нее двухзначный номер месяца. [ ... ]
сравнивает результат с выбранным номером месяца. Если этот тест пройден успешно, find
выполняет собственный ls
для объекта (вместо этого вы можете использовать -print
или -print0
).
Обратите внимание, что это никогда не возвращается ../
. С другой стороны, find
позволяет использовать дополнительные тесты (например, -type f
), поэтому этот подход очень гибок.