Bash:“printf%q $ str”在脚本中删除空格。 (备择方案?)

时间:2012-01-28 11:45:58

标签: bash printf

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

此命令:

printf %q "hello world"

输出:

hello\ world

这是正确的。

这个脚本:

#!/bin/bash

str="hello world"
printf %q $str

输出:

helloworld

这是错误的。

如果确实需要这样的行为,脚本中有什么替代方法可以引用包含任何字符的字符串,以便可以通过被调用的程序将其转换回原始字符?

感谢。

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

编辑:解决了,谢谢。

3 个答案:

答案 0 :(得分:37)

您应该使用:

printf %q "$str"

示例:

susam@nifty:~$ cat a.sh
#!/bin/bash

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

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

printf %q hello world

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

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

printf %q "hello world"

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

以下是您可以尝试使用这些概念的内容:

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

答案 1 :(得分:1)

尝试

printf %q "${str}"

在你的剧本中。

答案 2 :(得分:0)

这对我有用。满足这些要求

  1. 接受可能包含shell特殊字符的任意输入
  2. 不输出转义字符,即“\”
  3. #! /bin/bash
    
    FOO='myTest3$;  t%^&;frog now! and *()"'
    
    FOO=`printf "%q" "$FOO"`                        # Has \ chars
    echo $FOO
    
    # Eat all the \ chars
    FOO=$(printf "%q" "$FOO" | sed "s/\\\\//g")     # Strip \ chars
    
    echo $FOO