首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Bash:"printf %q $str“在脚本中删除空格。(替代方案?)

Bash:"printf %q $str“在脚本中删除空格。(替代方案?)
EN

Stack Overflow用户
提问于 2012-01-28 11:45:58
回答 2查看 23.1K关注 0票数 18

printf %q应该引用一个字符串。但是,当执行到脚本中时,它会删除空格。

这个命令:

代码语言:javascript
代码运行次数:0
运行
复制
printf %q "hello world"

产出:

代码语言:javascript
代码运行次数:0
运行
复制
hello\ world

这是正确的。

这个脚本:

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash

str="hello world"
printf %q $str

产出:

代码语言:javascript
代码运行次数:0
运行
复制
helloworld

这是错误的。

如果这种行为确实是预期的,那么脚本中有什么替代方法来引用包含任何字符的字符串,以便被调用的程序将其转换回原始字符?

谢谢。

软件: GNU,版本4.1.5(1)-release (i 486-pc-linux-gnu)

编辑:解决了,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-28 11:49:39

你应该使用:

代码语言:javascript
代码运行次数:0
运行
复制
printf %q "$str"

示例:

代码语言:javascript
代码运行次数:0
运行
复制
susam@nifty:~$ cat a.sh
#!/bin/bash

str="hello world"
printf %q "$str"
susam@nifty:~$ ./a.sh 
hello\ world

运行printf %q $str时,shell将其展开为:

代码语言:javascript
代码运行次数:0
运行
复制
printf %q hello world

因此,字符串helloworld作为两个独立的参数提供给printf命令,并并排打印两个参数。

但是,当您运行printf %q "$str"时,shell将其扩展为:

代码语言:javascript
代码运行次数:0
运行
复制
printf %q "hello world"

在这种情况下,字符串hello world作为一个参数提供给printf命令。这就是你想要的。

下面是一些您可以尝试使用这些概念的东西:

代码语言:javascript
代码运行次数:0
运行
复制
susam@nifty:~$ showargs() { echo "COUNT: $#"; printf "ARG: %s\n" "$@"; }
susam@nifty:~$ showargs hello world
COUNT: 2
ARG: hello
ARG: world
susam@nifty:~$ showargs "hello world"
COUNT: 1
ARG: hello world
susam@nifty:~$ showargs "hello world" "bye world"
COUNT: 2
ARG: hello world
ARG: bye world
susam@nifty:~$ str="hello world"
susam@nifty:~$ showargs $str
COUNT: 2
ARG: hello
ARG: world
susam@nifty:~$ showargs "$str"
COUNT: 1
ARG: hello world
票数 45
EN

Stack Overflow用户

发布于 2012-01-28 11:50:57

试一试

代码语言:javascript
代码运行次数:0
运行
复制
printf %q "${str}"

在你的剧本里。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9045001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档