为什么这种花括号和双引号的组合在 bash 中不起作用?
Why does this combination of curly braces and double quotes not work in bash?
我正在尝试了解如何在 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_prefix
是fp
并且目录有文件fp1
fp2
fp3
):
ls fp1 fp2 fp3
但是对于第三个示例,命令解释器认为引用的参数可以使用并且不应用*
插值。
所以它是这样执行的:
ls "fp*"
并且因为目录中没有名称为 fp*
的文件(名称中带有星号),而只有文件 fp1
fp2
fp3
(正如我们假设的那样) , 因此它显示 空列表 或说 没有这样的文件或目录
我正在尝试了解如何在 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_prefix
是fp
并且目录有文件fp1
fp2
fp3
):
ls fp1 fp2 fp3
但是对于第三个示例,命令解释器认为引用的参数可以使用并且不应用*
插值。
所以它是这样执行的:
ls "fp*"
并且因为目录中没有名称为 fp*
的文件(名称中带有星号),而只有文件 fp1
fp2
fp3
(正如我们假设的那样) , 因此它显示 空列表 或说 没有这样的文件或目录