Bash:如何传递带有特殊字符的参数,如\t

Bash:如何传递带有特殊字符的参数,如\t,bash,shell,arguments,Bash,Shell,Arguments,我有一个问题是如何在Bash中传递带有特殊字符\t的参数 我知道以下内容可以保留引用: function my_grep { cmd="grep '$@'" eval $cmd; } 这样我就可以向世界问好了 但似乎我不能用这种方式保存\t,例如 my_grep "hello\tworld" 关于如何实现这一点有什么想法吗?解决方案很简单:不要将命令存储在变量中!看见另外,不要使用eval;它会引起各种各样的奇怪问题。如果跳过这些选项并正确使用$@,问题将消失: my_gre

我有一个问题是如何在Bash中传递带有特殊字符\t的参数

我知道以下内容可以保留引用:

function my_grep {
    cmd="grep '$@'"
    eval $cmd;
}
这样我就可以向世界问好了

但似乎我不能用这种方式保存\t,例如

my_grep "hello\tworld"

关于如何实现这一点有什么想法吗?

解决方案很简单:不要将命令存储在变量中!看见另外,不要使用eval;它会引起各种各样的奇怪问题。如果跳过这些选项并正确使用$@,问题将消失:

my_grep() {
    grep "$@"
}
请注意,如果用my_grep hello\tworld调用此函数,它实际上不会传入制表符,而是传递一个反斜杠,后跟字母t,grep的一些实现将其解释为与制表符匹配。如果您的grep版本没有这样做,您可以使用my_grep$'hello\tworld'传递一个实际的选项卡。

您可以在grep中使用-F选项作为文本字符串。测试脚本:

 #!/bin/bash

 function my_grep {
    cmd="grep -F '$@' hello.txt"
    eval $cmd
 }

 my_grep "hello world\t"
对于输入文件:

 $ cat hello.txt 
 hello world\t
 hello world
输出为:

 $ sh grep_test.sh 
 hello world\t
此外,我个人会更改功能行,我宁愿避免评估:


希望这有帮助

此函数是否要在.bashrc中使用?另外,您打算如何指定要搜索的文件或文件模式?如果要保留引号,则需要转义引号。您只是用用户输入替换引号并使用eval,这是一个.@DavidC.Rankin:正确,类似于该文件。搜索模式可能看起来像hello\tworld,\t将由终端中的ctrl+v选项卡键入。不要将命令存储在变量中!这并不总是正确的。但是+1。@konsolebox:如果没有充分的理由,不要将命令存储在变量中,怎么样!?在这种情况下,这个问题根本没有说明任何原因,所以我放弃了资格…@GordonDavisson,这当然是相当可观的。
 result=`grep -F "${@}" hello.txt`
 echo $result