我正在尝试使用$ 1变量运行bash命令,该变量包含文件名及其路径。
我想只将文件名记录到output.txt文件中,但是我很难从变量中删除路径。
我尝试了以下内容:
file=$(basename $1)
echo ${file} >> output.txt
file=$(basename $1)
echo file >> output.txt
echo "basename $1" >> output.txt
它们都不起作用,无论是返回'数据'还是'文件'
答案 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
的值。