我的 bash 脚本如下所示:
#!/bin/bash
grep -r --color=always $@ . | nolong
文件保存在/usr/bin/findstr
当我运行这个时一切正常:
findstr hello
但是当我运行这个时:
findstr hello world
它仅搜索 hello。
问题:我怎样才能加$@
引号,以便它理解它是单个参数?
答案1
如果您想搜索正则表达式,即参数之间带有空格字符的串联,则为:
#! /bin/sh -
IFS=' ' # used for "$*"
grep -r --color=always -e "$*" . | nolong
"$*"
将位置参数与第一个字符连接起来(实际上字节除外yash
) 的$IFS
.
请注意(因为您似乎对空格的含义感到困惑),如果您运行:
myscript hello world
myscript hello world
myscript 'hello' "world"
空格(或引号)不会传递给myscript
,它们只是 shell 命令行语法的一部分。在这 3 个 shell 命令行中,myscript
接收相同的 3 个参数:“myscript”、“hello”和“world”。
如果您想搜索作为参数传递的任何正则表达式:
#! /bin/sh -
for i do
set -- "$@" -e "$i"
shift
done
[ "$#" -gt 0 ] && grep -r --color=always "$@" . | nolong
答案2
当调用脚本时,您需要引用该参数以表明它是一个参数而不是两个独立的参数。在你的脚本中你必须使用"$@"
.
grep -r --color=always "$@" . | nolong
呼叫是(例如)...
findstr "hello world"
(但请注意,grep 模式仅使用一个参数,因此"$1"
代替"$@"
就足够了。)