【问题标题】:Bash: how to pass arguments with special characters like \tBash:如何使用特殊字符(如 \t)传递参数
【发布时间】:2014-09-21 13:39:34
【问题描述】:

我有一个问题,关于如何在 Bash 中使用 \t 等特殊字符传递参数。

为了保留引号,我知道以下几点:

function my_grep {
    cmd="grep '$@'"
    eval $cmd;
}

这样我就可以my_grep "hello world"

但我似乎无法以这种方式保留 \t,例如

my_grep "hello\tworld"

关于如何进行这项工作的任何想法?

【问题讨论】:

  • 这个函数可以用在你的.bashrc吗?另外,您打算如何指定要搜索的文件或文件模式?
  • 如果要保留引号,则需要对引号进行转义。您只是替换引号并将eval 与用户输入一起使用,即big security issue
  • @DavidC.Rankin:正确,类似于那个文件。搜索模式可能看起来像“hello\tworld”,\t 将在终端中通过 ctrl+v TAB 键入。

标签: bash shell arguments


【解决方案1】:

解决方案很简单:不要将命令存储在变量中!见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!。另外,不要使用eval;它会导致各种奇怪的问题。如果您跳过这些(并正确使用"$@"),问题就会消失:

my_grep() {
    grep "$@"
}

请注意,如果您使用my_grep "hello\tworld" 调用它,它实际上不会传入制表符,它会传递一个反斜杠,后跟字母“t”——grep 的某些实现将其解释为匹配制表符.如果您的grep 版本没有这样做,您可以使用my_grep $'hello\tworld' 传递一个实际的选项卡。

【讨论】:

  • don't store your command in a variable! 并不总是正确的。但是 +1。
  • @konsolebox:“不要在没有充分理由的情况下将命令存储在变量中!”怎么样?在这种情况下,问题根本没有说明任何理由,所以我把资格关掉了......
  • @GordonDavisson 这当然是相当可观的。
【解决方案2】:

您可以在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

另外,我会将function 行更改为(就我个人而言,我宁愿避免使用eval):

 result=`grep -F "${@}" hello.txt`
 echo $result

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2014-07-15
    • 2020-04-05
    • 2017-02-18
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多