Bash:如何传递带有特殊字符的参数,如\t
我有一个问题是如何在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
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