Bash

執行使用 shell 變數的“sed”命令時出錯

  • June 2, 2021

這一直讓我發瘋…

我想列出目錄中的文件,並根據除最新文件之外的所有文件的編號進行互動,這是程式碼片段


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]顯然是一個有效的目錄

您遇到的主要問題是您將命令替換中的所有內容都放在雙引號中:

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

這將指示 shell 查找具有逐字名稱 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. ;)

引用自:https://unix.stackexchange.com/questions/652458