使用命令后,我正在嘗試運行 for 回圈
script
將命令終端副本輸出到 txt 檔案(以供進一步檢查)。這一切都是通過 solar-putty 上的 SSH 連接完成的。
這是我的代碼:
filename=$(ls /home/*.txt | xargs -n1 -I{} basename "{}" | head -3)
echo "$filename"
script /home/test.txt
for f in $filename; do
echo $f; done
exit
這不會啟動 for 回圈。它只是登錄上面的命令,我無法執行它。
當我運行時:
for f in $filename; do
echo $f; done
一切正常...
我在 TMUX 終端中使用所有這些作為 sudo su(因為我害怕通過 SSH 丟失我的終端,我需要 sudo su)
uj5u.com熱心網友回復:
如果我了解您在做什么,那么問題是script正在啟動一個新的 shell(作為子行程),并且它沒有舊的(父行程)shell 的變數。你可以在starting之后script定義變數,所以它是在正確的shell中定義的嗎?
另一種可能的解決方案是export變數,它將它從 shell 變數轉換為環境變數,子行程將繼承它的副本。請注意,根據您使用的 shell,您可能需要雙引號分配的值以避免分詞問題:
export filename="$(ls /home/*.txt | xargs -n1 -I{} basename "{}" | head -3)"
順便說一句,這種處理檔案名串列的方式會遇到帶有空格或其他一些 shell 元字符的名稱的問題。處理檔案名串列的正確方法是將它們存盤為陣列,但不幸的是無法匯出陣列。
[編輯:] 帶有空格和/或其他奇怪字符的檔案名的問題在于 1)ls輸出檔案名的方式不明確且不一致,以及 2) 未參考變數上的 shell“分詞”可以決議檔案名串列......不幸的是... 方法。舉個極端的例子,假設你有一個檔案名為/home/this * that.txt-- 如果它在一個變數中,并且你使用的變數沒有雙引號,它將把/home/this和that.txt視為完全獨立的東西,它還將擴展*為當前目錄中的檔案名串列。請參閱昨天的這個問題,這只是此類事情真實發生的眾多示例之一。
為了安全地處理帶有奇怪字符的檔案名,基本規則是要使用原始 shell 通配符(不是ls!)或find使用-execor獲取檔案-print0串列,始終將檔案名串列存盤在陣列中(不是普通變數),并雙引號所有變數(/array) 參考。請參閱BashFAQ #20:“如何找到并安全地處理包含換行符、空格或兩者的檔案名?”
在這種情況下,您只需要使用通配符運算式來制作路徑陣列,然后使用 shell 的內置字串操作來洗掉路徑前綴:
filepaths=( /home/*.txt ) # Create array of matching files
filenames=( "${filepaths[@]##*/}" ) # Remove path prefixes
然后,您可以使用"${filenames[@]:0:3}"從陣列中獲取前三個名稱。您可以僅使用前三個檔案創建一個新陣列,也可以直接在回圈中使用它:
first3files=( "${filenames[@]:0:3}" ) # ...or...
for f in "${filenames[@]:0:3}"; do
echo "$f" # Always double-quote variable references!
done
請注意,bash 不允許堆疊大多數陣列/變數修飾符,因此獲取路徑陣列、去除前綴并僅選擇前幾個,必須分三個單獨的步驟完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/412224.html
標籤:
上一篇:比較unix中變數的問題
