为什么花括号和双引号的这种组合在bash中不起作用?

问题描述 投票:1回答:1

我试图了解如何在bash中正确使用花括号和引号。我想知道为什么ls命令的第三个示例不起作用。

#!/bin/bash -vx

# File name prefix.
File_name_prefix='this_is_a_file_name_prefix'

# Let's do this in the /tmp directory.
cd /tmp

# Let's make three empty files.
touch ${File_name_prefix}_1.txt
touch ${File_name_prefix}_2.txt
touch ${File_name_prefix}_3.txt

# Let's list the three files.

# This works.
ls "$File_name_prefix"*
# This works.
ls ${File_name_prefix}*
# This does not work.
ls "${File_name_prefix}*"

# This fails.
find ./ -type f -name '${File_name_prefix}*'
# This fails spectacularly.
find ./ -type f -name ${File_name_prefix}*
# But this works.
find ./ -type f -name "${File_name_prefix}*"

echo "Why?"

# Clean up.
rm ${File_name_prefix}*

exit
bash variables double-quotes expansion pathname
1个回答
0
投票

[当执行第一个和第二个示例之类的命令时:

ls "$File_name_prefix"*
ls ${File_name_prefix}*

命令解释器实际上使用插值执行命令根据目录内容。从命令行本身使用目录,或者使用当前目录(如果命令行具有相对路径),

因此它执行如下(假设$File_name_prefixfp,并且目录中包含文件fp1fp2fp3):

ls fp1 fp2 fp3

但是对于第三个示例,命令解释器认为带引号的参数可随时使用,并且不应用*插值

所以它像这样执行:

ls "fp*"

并且由于目录中没有名称为fp*的文件(名称中带有星号),而仅包含文件fp1fp2fp3(假定),因此它显示空列表或说没有这样的文件或目录

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