如何在BASH脚本的引用string中使用环境variables

我已经在bash脚本中尝试了以下各种forms:

#!/bin/bash svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

但是我无法获得正确扩展COLUMNS环境variables的语法。

我已经尝试了以下各种forms:

 svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS' 

 svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}' 

 eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

build议?

如果不确定,可以在terminal上使用“cols”请求,忘记COLUMNS:

 COLS=$(tput cols) 

只要简单的注释/摘要,通过谷歌来到这里,寻找标题中提出的一般问题的答案(就像我一样)。 以下任何一项都可以用来访问引号内的shellvariables:

 echo "$VARIABLE" echo "${VARIABLE}" 

使用单引号是主要问题。 根据Bash参考手册 :

用单引号括起来的字符( ' )保留引号内每个字符的字面值。 单引号之间可能不会出现单引号,即使前面带有反斜杠。 用双引号( " )括起来的字符保留了引号中所有字符的字面值,除了$`\ ,并且当启用历史扩展时, ! 。它们在双引号中的特殊含义(参见Shell Expansions)。只有当后面跟有以下字符之一时,反斜线才会保留其特殊含义: $`"\或newline。 在双引号内,删除后面跟着其中一个字符的反斜杠。 没有特殊含义的字符之前的反斜杠保持不变。 双引号可以用双引号引起来,前面加一个反斜杠。 如果启用,历史扩展将被执行,除非! 出现在双引号中使用反斜线进行转义。 !前面的反斜杠! 不会被删除。 使用双引号时,特殊参数*@具有特殊含义(请参见壳参数扩展)。

在问题中提到的特定情况下,$ COLUMNS是一个特殊的variables,它具有非标准属性(参见上面的lhunath的回答)。

请注意, COLUMNS是:

  1. 不是一个环境variables。 这是一个普通的bash参数,由bash自己设置。
  2. 收到SIGWINCH信号后自动设置。

第二点通常意味着您的COLUMNSvariables只能在交互式 shell中设置, 而不能在bash脚本中设置。

如果您的脚本的stdin连接到您的terminal,您可以通过询问您的terminal手动查找terminal的宽度:

 tput cols 

要在你的SVN命令中使用这个:

 svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)" 

(注意:你应该引用 "$@" ,远离eval ;-))

以下脚本适用于$COLUMNS多个值。 我想知道你是不是在这个电话之前设置COLUMNS

 #!/bin/bash COLUMNS=30 svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

你可以在脚本中回显$COLUMNS来查看它是否正确设置?

你是对的,所以我猜别的东西是错的(不是导出COLUMNS?)。

debugging这些情况的一个窍门是做一个专门的命令(编程语言家伙的closures)。 创build一个名为diff-columns的shell脚本:

 exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@" 

只是用

 svn diff "$@" --diff-cmd diff-columns 

这样你的代码就可以更清晰地阅读和更模块化(自上而下的方法),并且你可以单独地testing差异代码(自下而上的方法)。