我想用其他东西替换linux命令中的空格。 例如:
echo "test" ---> echo\040"test"
我知道\ 040无效,但我正在寻找合适的替代品。
答案 0 :(得分:1)
一般情况下,你不能这样做。 shell解析器大致如下:
您的问题是您想要更改步骤1中识别字词的方式;你不能这样做。
在某些上下文中,您可以使用eval
执行预解析的命令。例如:
cmd="echo,foo"
IFS=,
eval $cmd
这会输出foo
,因为在展开不引用的$cmd
时,它会在分词后echo
和foo
生成两个以空格分隔的单词。然后由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"