シェル変数を使用する「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]*.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。 ;)

関連情報