【发布时间】:2012-09-06 22:54:37
【问题描述】:
我正在开发一个 bash 脚本,该脚本将使用通配符路径搜索特定文件,一旦找到该文件名,它就会在文件中搜索特定术语,然后替换它。
这是我已经整理好的内容:
#!/bin/sh
PATH=${1}
FILENAME="$2"
SEARCHFOR="$3"
/usr/bin/clear
echo "Searching $PATH"
echo "For the file $FILENAME"
echo "With the string $SEARCHFOR"
echo "=========================="
echo " RESULTS "
echo "=========================="
/usr/bin/find $PATH -type f -name "$FILENAME" | /usr/bin/xargs /bin/grep -l "$SEARCHFOR"
我还没有添加替代品,但我想我会使用 SED 而不是 grep 来做到这一点,只是使用 grep 进行测试。
使用上面的代码,我必须为任何类型的通配符路径使用引号。有没有办法解决这个问题?
./script '/home/*/public_html' php.ini module.so
我在想也许可以使用参数,但必须有另一种方法。
我的最终目标是拥有一个 bash 脚本,我可以将通配符路径或文件名传递给它,它会搜索该文件,一旦找到它搜索特定术语的文件并在找到时替换它。
听起来很简单,应该是这样,但我把头撞在桌子上,因为我已经很久没有搞砸 bash...aaggghh 帮助!
【问题讨论】:
-
顺便说一句,定义
$PATH会覆盖由shell 定义的PATH变量,该变量告诉它在运行命令时要查看哪些文件夹。例如,当您键入python myscript.py时,shell 会在$PATH中以分号分隔的目录搜索名为python的可执行文件并使用它——它消除了键入/usr/bin/python myscript.py的需要。通过覆盖它,您可能会破坏脚本中遵循您的定义的部分。 TLDR:您真的应该考虑为变量使用不同的名称。 -
作为后续,这就是为什么您必须写
/usr/bin/clear而不仅仅是clear以及 William Pursell 答案背后的原因。