[英]Get basename from filepath in bash
我正在嘗試使用包含文件名及其路徑的 $1 變量運行 bash 命令。
我只想將文件名記錄到 output.txt 文件中,但我很難從變量中剝離出路徑。
我嘗試了以下方法:
file=$(basename $1)
echo ${file} >> output.txt
file=$(basename $1)
echo file >> output.txt
echo "basename $1" >> output.txt
它們都不起作用,返回“數據”或“文件”
原因請參見@mklement0 的回答。
從bash
(或任何其他 POSIX shell)中的文件路徑獲取 basename 的最佳方法應該是:
printf '%s\n' "${filepath##*/}"
就是這樣,不需要外部命令,不需要進程分支,只需要Parameter Expansion 。
另請注意,使用printf 而不是 echo ,這為您提供了更高的可靠性和可移植性。
假設您的變量 $1 包含一個絕對文件路徑,例如
/home/user/dir/file1.txt
您有多種將文件名附加到文件的方法:
1. echo $(basename "$1") >> output.txt
2. file=$(basename "$1") && echo "$file" >> output.txt
還有很多其他可能的解決方案,甚至您的第一個解決方案也對我有用。
一般來說,這里有兩個陷阱:
忽略雙引號參數和變量引用 - $1
或$var
- 以及命令替換 - $(...)
-使它們受到分詞和通配符的影響,這可能會破壞整個命令,或者更糟糕的是,引入安全漏洞。
不太重要的是,確保命令操作數不會被誤認為是選項,如果它碰巧以-
字符開頭,通過使用--
來表示后面的所有內容都將被解釋為操作數。
分配給變量(雙引號可選,但推薦):
# OK - but note that the $1 inside the $(...) IS double-quoted,
# because command substitutions are "their own world".
file=$(basename -- "$1")
# Better, just to get into the habit of double-quoting:
file="$(basename -- "$1")"
使用變量 -總是雙引號(除非你明確想要分詞和通配):
echo "${file}" >> output.txt
至於為什么你的嘗試不起作用:
echo file >> output.txt
不起作用,因為為了引用變量file
您必須$
-prefix 它(即$file
並且由於上述原因,幾乎總是作為"$file"
)。
echo "basename $1" >> output.txt
沒有工作,因為在參數$1
是雙引號字符串中展開,您需要一個命令替換-在這里, $(basename "$1")
-嵌入命令在雙-引用的字符串。
file=$(basename $1)
由於缺少雙引號的$1
,只會與工作$1
不包含shell元字符(含空格)值,和值不啟動-
; echo ${file} >> output.txt
- 再次由於缺少雙引號 - 可能會無意中再次更改$file
的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.