これに気が狂いそうになりました...
ディレクトリ内のファイルを一覧表示し、最新のファイルを除くすべてのファイルの番号に基づいて、次のコードスニペットを作成します。
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
。 ;)