簡體   English   中英

從bash中的文件路徑獲取基本名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM