bash:将模式存储在变量中,而不计算模式

bash: Storing a pattern in a variable without the pattern being evaluated

提问人:Jonathan Chiou 提问时间:3/2/2014 最后编辑:CœurJonathan Chiou 更新时间:4/22/2018 访问量:344

问:

我正在从命令行读取一个字符串,并将其存储到一个变量中。我遇到的问题是,当我尝试存储模式(例如 *.cpp)时,如果我当前目录中有匹配项,则变量最终将保留该模式的第一个匹配项,如果没有匹配项,则该模式。为了将模式存储到字符串中,我需要做什么?

问题代码:

pattern=$1
#say $1 is *.cpp
#what do I need to do to $1 for pattern to hold *.cpp rather than the 1st match to *.cpp

编辑:我确实用引号括了 1 美元,但我的结果与根本不使用引号相同。

作为可复制案例的问题:

#$1 is *.cpp
#!/bin/bash
pattern = "$1"
echo $pattern

模式不回显 *.cpp,但找到与该模式匹配的第一个文件。

Bash UNIX

评论

0赞 Jonathan Chiou 3/2/2014
我忘了提到我确实使用了引号,它与根本不使用引号具有完全相同的效果(两者都返回第一个匹配项)。
0赞 isedev 3/2/2014
那你是怎么用的...?您没有提供足够的信息来正确评估问题。尝试提供可复制的案例。pattern
0赞 Jonathan Chiou 3/2/2014
帖子已被编辑。
0赞 isedev 3/2/2014
问题是在运行脚本之前,shell 正在对其进行评估,因此已经展开。运行脚本时需要引用:以避免 shell 执行任何扩展。*.cpp$1script '*.cpp'

答:

0赞 tonjo 3/2/2014 #1

传递参数时可以使用单引号,以便保留确切的字符串。

myscript.sh:

#!/bin/bash

echo $1

从 cmdline 调用:

# ./myscript.sh '*.cpp'
*cpp

反斜杠转义的结果也相同:

# ./myscript.sh \*.cpp
*cpp
2赞 Erik Vesteraas 3/2/2014 #2

做了一些测试。似乎您需要在调用脚本中的使用中引用。即在脚本中:

pattern=$1
echo "$pattern"

然后在调用脚本时:

./test.sh "*.cpp"

结果:

*.cpp

评论

1赞 Karoly Horvath 3/2/2014
这就是 shell 的工作方式。如果执行 ,则 的第一个参数不会是 。它被扩展到潜在的许多参数。ls *.cppls*.cpp