シェル変数を使用して 'sed'コマンドを実行中にエラーが発生しました。

シェル変数を使用して 'sed'コマンドを実行中にエラーが発生しました。

すでに私を狂わせています...

ディレクトリ内のファイルをリストし、最新のファイルを除くすべてのファイルの数に基づいて対話したいと思います。ここにコードスニペットがあります。


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]*.logoptionssedと引数を介して-n実行可能ファイルにパイプされます'$c p'。次の二重引用符を削除してみてください。

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

しかし、これにより、単一引用符コマンドで変数拡張を無効にする問題に直面しますsed。一つ推奨方法一重引用符で囲まれたパラメータを分離し、変数を二重引用符で囲まれた感嘆符に入れます。

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

そして義務的に警告をしなければなりません。出力を解析しません。ls。 ;)

おすすめ記事