我需要理解這個命令列:
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 的唯一原因可能basename
是basename
實用程式不從標準輸入讀取,而是從標準輸入讀取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%%.*}
而不是cut
as善陀羅示.)
另一方面,如果它應該處理多個檔案名,那麼使用陣列或位置參數(所有參數,而不僅僅是$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
。