【问题标题】:Spaces and curly braces for variables in bashbash 中变量的空格和大括号
【发布时间】:2015-01-18 09:04:46
【问题描述】:

有没有办法让${VAR} 像双引号一样展开?

这不是我想看到的:

% A="some spaces in there"
% touch ${A}
% ls -1
in
some
spaces
there

当然,我可以使用像 "$VAR" 这样的典型符号。但这在引用文本等中使用引号时很麻烦。我想知道是否有一种扩展 ${...} 表示法的方法可以将${...} 视为"${...}" 而本身不使用双引号?

【问题讨论】:

  • 为什么不想使用像"$A"这样的双引号?
  • 有一种表示法与"${...}" 完全一样,它是"${...}"。对同一事物使用两种符号是没有意义的。
  • 避免使用双引号不太可能是您要解决的任何问题的正确解决方案。

标签: linux bash syntax quoting


【解决方案1】:

不关注accepted best practice(并了解shell真正是如何工作的)很可能会咬你。反复。带有被僵尸病毒感染的毒牙。一些可以帮助的事情:

  • 您可以对单个参数的不同部分使用不同的引号,只要开始和结束引号彼此相邻:

    $ printf '%q\n' "foo 'bar' baz"'nuu "boo" zoo'
    foo\ \'bar\'\ baznuu\ \"boo\"\ zoo
    
  • 您可以在子shell 中设置IFS 以避免搞砸整个脚本:

    $ a="some spaces in there"
    $ (IFS= && touch ${a})
    $ ls -1
    some spaces in there
    

【讨论】:

    【解决方案2】:

    您可以设置IFS variable 在 shell 拆分变量时忽略空格。这在接受可能在循环中包含空格的输入时也很有用。

    $ cat /tmp/t.sh
    IFS="$(printf '\n\t')"
    A="some spaces in there"
    touch ${A}
    ls -l
    $ /tmp/t.sh
    some spaces in there
    

    (如果您的字符串中有 * 之类的字符,请尝试使用 set -f 来禁用通配(请参阅帮助集)感谢@glenn jackman。但实际上,在文件名中添加 * 是自找麻烦!)

    还有原文:

    $ cat /tmp/t.sh
    #!/bin/bash
    A="some spaces in there"
    touch ${A}
    ls -1
    $ /tmp/t.sh 
    in
    some
    spaces
    there
    $
    

    【讨论】:

    • 您还需要set -f 来关闭文件名生成:否则A="some * in there"; touch $A 将是一个问题
    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多