在命令参数中使用参数

在命令参数中使用参数

我运行find命令来搜索名称包含以下内容的文件perl

find /tmp -name '*perl*'
/tmp/perl.pl
/tmp/run-perl-stage.pl

但是当我在变量中设置 perl 名称PARAMETERfind再次运行命令时,我没有得到任何结果!如何使用 运行 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

相关内容