Lee*_*eor 3 unix linux bash shell if-statement
我是 bash 新手,希望得到您的帮助;找不到这个案例的答案。我正在尝试检查一个目录中的文件是否存在于另一个目录中
假设我有路径 /home/public/folder/(这里我有几个文件),我想检查文件是否存在于 /home/private/folder2
我试过了
for file in $firstPath/*
do
if [ -f $file ]; then
(ask if to over write etc.. rest of the code)
Run Code Online (Sandbox Code Playgroud)
并且
for file in $firstPath/*
do
if [ -f $file/$secondPath ]; then
(ask if to over write etc.. rest of the code)
Run Code Online (Sandbox Code Playgroud)
两者都不起作用;似乎在第一种情况下,它比较第一个路径中的文件(因此它总是问我是否要覆盖,尽管它在第二个路径中不存在)而在第二种情况下,它不会进入if 语句。我怎么能解决这个问题?
当您有一个类似的构造时for file in $firstPath/*, 的值$file将包括 的值$firstPath,而 中不存在该值$secondPath。您需要去除路径才能获得裸文件名。
在传统的 POSIX shell 中,执行此操作的规范方法是使用名为basename. 但是,您可以使用Parameter Expansion实现通常被认为是等效的功能,因此:
for file in "$firstPath"/*; do
if [[ -f "$secondPath/${file##*/}" ]]; then
# file exists, do something
fi
done
Run Code Online (Sandbox Code Playgroud)
该${file##*/}位是这里的重要组成部分。根据上面链接的文档,这意味着“$file变量,直到最后一个都/被删除了”。结果应该与basename产生的相同。
作为一般规则,您应该在 bash 中引用您的变量。此外,除非您实际上正在编写需要可移植的 POSIX shell 脚本,否则请考虑使用[[代替[。您将拥有更广泛的测试集,以及更可预测的变量处理。还有其他不同之处。
| 归档时间: |
|
| 查看次数: |
3597 次 |
| 最近记录: |