Erro ao executar o comando "sed" que usa variáveis ​​​​shell

Erro ao executar o comando "sed" que usa variáveis ​​​​shell

Isso tem me deixado louco...

Quero listar os arquivos em um diretório e, com base no número de interação em todos os arquivos, exceto o mais recente, aqui está o trecho de código


FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

Tenho tido problemas de $cinterpretação, o formato acima funciona, mas o comando sed falha... embora inserir a última linha do log no cli funcione perfeitamente


 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

Qualquer ajuda seria muito apreciada!

o [dir]é obviamente um diretório válido

Responder1

O principal problema que você tem é colocar tudo na substituição do comando entre aspas duplas:

FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

Isso instruiria o shell a localizar um arquivo executável comnome literal ls -1t [dir]*.log | sed -n '$c p'"e sem argumentos, em vez de executar o comando lscom opções -1te operando [dir]*.logcuja saída deve ser canalizada para o executável sedcom opção -ne argumento '$c p'. Tente remover as aspas duplas, como em

FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')

No entantoentão você enfrentará o problema de que a expansão da variável está desabilitada em seu sedcomando entre aspas simples. Ummaneira recomendadaé quebrar o argumento entre aspas simples e colocar a variável entre aspas duplas, como em

FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')

Além disso, devo emitir o aviso obrigatórionão analisar a saída dels. ;)

informação relacionada