Bash
執行使用 shell 變數的“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]
顯然是一個有效的目錄
您遇到的主要問題是您將命令替換中的所有內容都放在雙引號中:
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
. ;)