Echo命令为什么解释基本目录的变量?

问题描述 投票:0回答:2

我想在图片文件夹中找到某些文件类型,并且在/home/user/pictures文件夹中创建了以下bash脚本:

for i in *.pdf *.sh *.txt;
do
  echo 'all file types with extension' $i;
  find /home/user/pictures -type f -iname $i; 
done

但是当我执行bash脚本时,它对于<> /home/user/pictures上的文件无法正常工作。该命令不是回显“带有扩展名* .sh的所有文件类型”,而是解释基本目录的变量:all file types with extension file1.sh /home/user/pictures/file1.sh all file types with extension file2.sh /home/user/pictures/file2.sh all file types with extension file3.sh /home/user/pictures/file3.sh

我想知道为什么echo-命令不会打印“扩展名为* .sh的所有文件类型”。 

我想在Pictures文件夹中找到一些文件类型,并且我在/ home / user / pictures文件夹中创建了以下bash脚本:对于* .pdf * .sh * .txt中的i;用...

linux bash shell echo
2个回答
0
投票

0
投票
说明:

在bash中,包含*的字符串或扩展为这样的字符串的变量可以扩展为glob模式,除非通过将其放在引号内来保护该字符串不受glob扩展的影响(尽管如果glob模式没有匹配任何文件,则尝试扩展后将保留原始的glob模式)。

在这种情况下,不希望发生全局扩展-包含*的字符串需要作为文字传递给echofind命令中的每一个。因此,$i应该用双引号引起来-这些将允许从$i进行变量扩展,但随后的通配符扩展将不会发生。 (如果改为使用单引号,即'$i',则将文字$i传递给echofind,这也是不希望的。)

除此之外,如果在当前目录中存在任何与任何glob模式匹配的文件,则起始for行需要使用引号来防止通配符扩展。在这种情况下,使用单引号还是双引号都没关系。

另外,这里的修订代码也删除了一些不必要的分号。

© www.soinside.com 2019 - 2024. All rights reserved.