Это сводит меня с ума...
Я хочу вывести список файлов в каталоге и, основываясь на числе взаимодействий со всеми файлами, кроме последнего, вот фрагмент кода
FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")
У меня возникли проблемы с $c
интерпретацией, формат выше работает, но команда sed не работает... хотя ввод последней строки журнала в cli работает как часы
FILECOUNT=24
(( c=2 ))
(( c<=24 ))
C is : 2
'ls -1t [dir]*.log | sed -n '\''2 p'\'''
line 41: ls -1t [dir]*.log | sed -n '2 p': No such file or directory
Любая помощь будет высоко оценена!
очевидно, что [dir]
это допустимый каталог
решение1
Основная проблема заключается в том, что вы заключаете все данные в подстановку команды в двойные кавычки:
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")
Это даст указание оболочке найти исполняемый файл сдословное название ls -1t [dir]*.log | sed -n '$c p'"
и без аргументов, в отличие от выполнения команды ls
с опциями -1t
и операндом [dir]*.log
, вывод которой должен быть передан исполняемому файлу sed
с опцией -n
и аргументом '$c p'
. Попробуйте удалить двойные кавычки, как в
FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')
Однакото вы столкнетесь с проблемой, что расширение переменной отключено в вашей sed
команде в одинарных кавычках. Одинрекомендуемый способзаключается в том, чтобы разорвать аргумент в одинарных кавычках и поместить переменную в междометие в двойных кавычках, как в
FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')
Также я должен вынести обязательное предупреждениене анализировать выводls
. ;)