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

标签 bash variables double-quotes expansion pathname

我试图了解如何在 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

最佳答案

当您执行第一个和第二个示例的命令时:

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

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

所以它像这样执行(假设 $File_name_prefixfp 并且目录有文件 fp1 fp2 fp3):

ls fp1 fp2 fp3

但对于第三个示例,命令解释器将引用的参数视为可以使用并且不应用*插值

所以它是这样执行的:

ls "fp*"

并且因为没有名称为 fp* 的文件(名称中带有星号),只有文件 fp1 fp2 fp3(正如我们假设的那样)在目录中,因此它显示空列表或表示没有这样的文件或目录

关于bash - 为什么这种花括号和双引号的组合在 bash 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59249633/

相关文章:

bash - 如何使用 docker 容器运行 nginx?

python - 在 python 中,整个文件可以只是一个变量吗?

MySQL Load data infile -- 双引号中的双引号值如 "a "double"quoted value"

bash - 如何判断 "find"命令的输出是否为空?

linux - 在后台运行 iperf 并将输出重定向到文件

bash - 转换行结尾

javascript - 购物车 : Cookies only holding 2 - 5 items

java - 如何使用 Java 反射来调用引用变量上的方法?

javascript - 标题 =""中的 qtip 和 html 数据导致冲突

C++ CSV 行,双引号内有逗号和字符串