【问题标题】:Why does this combination of curly braces and double quotes not work in bash?为什么大括号和双引号的这种组合在 bash 中不起作用?
【发布时间】:2019-12-09 13:09:36
【问题描述】:

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

【问题讨论】:

  • 出于调试目的,请将#!/bin/bash -vx 放在脚本的第一行
  • Pathname expansion 不会发生在 double-quotes 中。就这么简单。请注意,它与大括号或ls 无关。
  • bash在那种情况下将双引号变成单引号?
  • @Llewen 不。Bash 从不将任何引号转换为其他引号。什么意思?
  • 当我使用 -vx 运行脚本时,它会显示带有单引号的命令,我猜这只是输出。

标签: bash variables double-quotes expansion pathname


【解决方案1】:

当你执行第一个和第二个例子的命令时:

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

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

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

ls fp1 fp2 fp3

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

所以它像这样执行:

ls "fp*"

并且由于目录中没有名称为fp*(名称中带有星号)的文件,但只有文件fp1fp2fp3(我们假设),因此它显示空列表 或者说没有这样的文件或目录

【讨论】:

  • 我认为双引号允许特殊字符。
猜你喜欢
  • 2016-08-21
  • 2010-10-29
  • 1970-01-01
  • 2014-02-10
  • 2021-06-06
  • 2012-02-07
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多