从bash中的filepath获取basename

时间:2015-10-25 23:40:59

标签: bash terminal

我正在尝试使用$ 1变量运行bash命令,该变量包含文件名及其路径。

我想只将文件名记录到output.txt文件中,但是我很难从变量中删除路径。

我尝试了以下内容:

file=$(basename $1)
echo ${file} >> output.txt

file=$(basename $1)
echo file >> output.txt

echo "basename $1" >> output.txt

它们都不起作用,无论是返回'数据'还是'文件'

3 个答案:

答案 0 :(得分:3)

因此,请参阅@mklement0's answer

bash(或任何其他POSIX shell)中的文件路径获取basename的最佳方法应该是:

printf '%s\n' "${filepath##*/}"

全部,没有外部命令,不需要进程分支,只需Parameter Expansion

另一个注意事项是printf instead of echo的使用,它为您提供更高的可靠性和便携性。

答案 1 :(得分:0)

假设您的变量$ 1包含绝对文件路径,例如<。p>

/home/user/dir/file1.txt

你有各种方法将文件名附加到文件中:

1. echo $(basename "$1") >> output.txt

2. file=$(basename "$1") && echo "$file" >> output.txt

还有很多其他可能的解决方案,甚至你的第一个解决方案也适合我。

答案 2 :(得分:0)

一般来说,这里有 2个陷阱

  • 忽略双引号参数和变量引用 - $var$(...) - 并命令替换 - - - 使它们受到单词限制分裂和通配,可以打破整体命令,或者更糟糕的是,introduce security vulnerabilities

  • 不那么重要,确保命令操作数不会被误认为是选项 ,如果它发生的话以--字符开头,使用# 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无效,因为为了引用变量$,您必须$file - 为它添加前缀(即"$file",并且上述原因,实际上始终为echo "basename $1" >> output.txt)。

  • $1无法正常工作,因为参数 $(basename "$1") 在双引号字符串中展开时,需要命令替换 - 这里,file=$(basename $1) - 在双引号字符串中嵌入命令

  • $1,由于缺少$1的双引号,使用不包含shell元字符的-值(包括空格),以及不以echo ${file} >> output.txt开头的价值观; $file - 再次由于缺少双引号 - 可能会无意中再次改变Loan: no | type ------------ L1 | house L2 | student L3 | car Borrower ('num' is foreign key to 'no'): name | num ---------- A | L1 A | L1 A | L2 A | L3 SELECT loan.type FROM loan, borrower WHERE loan.no = b.num AND loan.type = (SELECT MIN(type) from loan) GROUP BY loan.type 的值。