我运行find
命令来搜索名称包含以下内容的文件perl
:
find /tmp -name '*perl*'
/tmp/perl.pl
/tmp/run-perl-stage.pl
但是当我在变量中设置 perl 名称PARAMETER
并find
再次运行命令时,我没有得到任何结果!如何使用 运行 find 命令$PARAMETER
?
PARAMETER=perl
find /tmp -name '*$PARAMETER*'
没有得到任何结果。
find /tmp -name '*\$PARAMETER*'
没有得到任何结果。
答案1
您需要使用双引号,而不是单引号。
在单引号内'…'
,每个字符都按字面解释。唯一被特殊处理的字符是单引号字符,它结束文字字符串。
在双引号内"…"
,以下字符会被特殊处理:
"
(双引号)结束带引号的字符串。$
(美元)扩大。它可以启动变量替换或命令替换或算术表达式:"$PARAMETER"
、"${PARAMETER}"
、"${PARAMETER%/*}"
、"$(somecommand)"
、$((x+2))
等。`
(反引号)被扩展。这是命令替换的另一种形式,当嵌套命令中有特殊字符时很难使用:`foo`
类似于$(foo)
但在复杂情况下更难以正确使用。- 在交互式 shell 中,
!
可能会触发历史记录扩展。 \
(反斜杠) 引用下一个字符,但前提是它是此列表中的字符之一:对于其他字符,反斜杠保留。例如,"foo\$\bar"
相当于'foo$\bar'
.作为例外,反斜杠换行序列会被忽略:反斜杠会占用后面的换行符。
这样做的结果是单引号字符串中不能有单引号。要解决这个问题,您可以将各个部分串在一起:echo 'Here'\''s a string with a single quote'
传递一个参数,echo
该参数由三个部分表示,两个单引号字符串\'
之间有(扩展为单个单引号)。
由于您希望进行变量替换,因此请使用双引号:
find /tmp -name "*$PARAMETER*"
顺便说一句,"$PARAMETER"
和之间是有区别的$PARAMETER
。使用双引号,shell 会查找 的值PARAMETER
并将该字符串扩展到命令行上。如果不带引号, 的值PARAMETER
将被解释为以空格分隔的通配符模式列表。这几乎是不可取的,所以总是在变量和命令替换周围加上双引号。
答案2
首先,不要在bash中使用大写变量,它可能与现有的系统变量冲突。
其次,对于你的问题,你可以这样做(如果你仍然想要单引号,而不是双引号),
param='*perl*'
find /tmp/ -name $param