這個命令列(`echo $1 | xargs -n 1 basename | cut -d '.' -f1`)有什麼作用?

這個命令列(`echo $1 | xargs -n 1 basename | cut -d '.' -f1`)有什麼作用?

我需要理解這個命令列:

file=`echo $1 | xargs -n 1 basename | cut -d '.' -f1`

答案1

它將檔案名稱的一部分(可能帶有路徑)分配給變數file。具體來說,是.檔案本身的檔案名稱中第一個字元之前的位元。換句話說,它需要類似的東西/some/path/hello.world並解析出該hello位。

一個技巧是在命令列上運行管道的每個部分:

$ thing="/some/path/hello.world"

$ echo "$thing"
/some/path/hello.world

$ echo "$thing" | xargs -n 1 basename
hello.world

$ echo "$thing" | xargs -n 1 basename | cut -d '.' -f 1
hello

反引號用於返回管道的輸出並將其分配給file。這$1是命令列上的第一個參數(對於它所屬的任何腳本或 shell 函數)。

xargs -n 1 basename使用而不是 plain 的唯一原因可能basenamebasename實用程式不從標準輸入讀取,而是從標準輸入讀取xargs

bash或中同一事物的更短(且更快)的版本ksh93

file=${1##*/}
file=${file%%.*}

答案2

$1該行從透過(該行出現的腳本的第一個參數)提供的路徑中提取不含副檔名的檔案名稱。結果保存在變數中file

演示:

$ echo /etc/dhcpcd.conf ../foo/bar/filename.tar.gz | xargs -n 1 basename | cut -d '.' -f1
dhcpcd
filename

答案3

echo和的組合xargs在這裡相當奇怪。

basename在命令列上取得路徑名,並輸出它的最終組成部分(即通常在最後一個斜線之後的部分)。xargs只需將從其輸入(管道)讀取的單字放置到basename此處的命令行即可。那為什麼不直接使用呢basename $1

然而,還是有差別的。

如果echo $1 | xargs -n 1 basename參數$1包含空格,xargs則將其拆分為空格,並basename分別呼叫每個單字。最終結果將是檔案名稱的一部分將被選擇全部這些詞,如阿民念表明

另一個選項,basename $1,只會調用basename一次(並且由於分詞而以一些好的方式失敗。)

如果該指令只處理一個檔名,則最好寫為:

file=$(basename "$1" | cut -d '.' -f 1)

附引號。 (或使用後綴剝離 shell 擴展${file%%.*}而不是cutas善陀羅示.)

另一方面,如果它應該處理多個檔案名,那麼使用陣列或位置參數(所有參數,而不僅僅是$1)傳遞它們可能會更乾淨。

答案4

該行將檔案名稱(不含副檔名和路徑)儲存在變數 中$file

詳細地:

echo $1列印傳遞給腳本的第一個命令列參數,xargs -n 1 basename將回顯的字串作為參數傳遞給 command basename,這會從檔案名稱中刪除路徑。 cut -d '.' -f1刪除擴展名。

因此,例如如果您執行

echo directory/test.sh | xargs -n 1 basename | cut -d '.' -f1

結果(保存到$file)將為test

相關內容