如何将$@放在引号中?

如何将$@放在引号中?

我的 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"代替"$@"就足够了。)

相关内容