在Linux命令中转义空间

时间:2015-11-05 13:19:25

标签: linux bash

我想用其他东西替换linux命令中的空格。 例如:

echo "test"     --->      echo\040"test"

我知道\ 040无效,但我正在寻找合适的替代品。

4 个答案:

答案 0 :(得分:1)

一般情况下,你不能这样做。 shell解析器大致如下:

  1. 根据空白(空格和制表符)将行拆分为单词。
  2. 将扩展应用于每个初始单词集。
  3. 确定运行和执行它的命令。
  4. 您的问题是您想要更改步骤1中识别字词的方式;你不能这样做。

    在某些上下文中,您可以使用eval执行预解析的命令。例如:

    cmd="echo,foo"
    IFS=,
    eval $cmd
    

    这会输出foo,因为在展开不引用的$cmd时,它会在分词后echofoo生成两个以空格分隔的单词。然后由eval执行,产生所需的结果。但是,强烈建议你不要在实践中编写这样的代码,因为很容易执行你不想用eval编写的代码。

    对于您给出的示例(用户输入ping x.x.x.x),您应该执行类似的操作。您可以将其视为执行脚本提供的代码的请求,而不是将输入作为代码执行。

    read cmd argument
    case $cmd in
        ping) ping "$argument" ;;
        *) printf 'Unrecognized command "%s"\n' "$cmd" >&2 ;;
    esac
    

    现在,没有任意执行。无论用户输入什么内容,您的脚本都会使用单个参数执行ping,或者您的脚本会输出错误消息。

答案 1 :(得分:1)

你可以尝试其他空格而不是空格。 Tab,CR,LF,......

如果它直接在bash中运行,则可以使用已定义的shell变量:

echo$IFS"test"

或者使用类似c的字符串转义命令并运行该命令:

$(cat<<<$'echo\x20test')

答案 2 :(得分:0)

感谢chepner的洞察力,我现在确定它是不可能的,只要你需要传递参数(因为你必须通过空格将命令与参数分开)。但是,如果你没有(即如果参数总是相同的话),你可以创建一个脚本或一个函数来执行包含空格的代码,这可以在不使用空格的情况下调用。

答案 3 :(得分:0)

我不知道这是否符合您的预期

$cat j
echo "test"

用换行符替换空格

$ cat j|sed -e 's/\s/\xC/'g
echo
    "test"