127

我在 bash 脚本中尝试了以下各种形式:

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

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

我尝试了以下各种形式:

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"

建议?

4

5 回答 5

465

对于任何通过谷歌来到这里寻找标题中提出的一般问题的答案的人(就像我一样),只是一个简短的说明/摘要。以下任何一项都应该适用于访问引号内的 shell 变量:

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

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

将字符括在单引号 ( ') 中会保留引号内每个字符的文字值。单引号之间不能出现单引号,即使前面有反斜杠。[...] 将字符括在双引号 ( ") 中会保留引号内所有字符的文字值,但$, `, \, 和启用历史扩展时除外!。字符$和 ` 在双引号中保留其特殊含义(请参阅 Shell 扩展)。反斜杠仅在后跟以下字符之一时才保留其特殊含义:$, `, ",\,或换行符。在双引号内,删除后面跟有这些字符之一的反斜杠。没有特殊含义的字符前面的反斜杠保持不变。双引号可以用反斜杠在双引号中引用。如果启用,将执行历史扩展,除非!出现在双引号中的使用反斜杠进行转义。前面的反斜杠!不会被删除。特殊参数在双引号中*@具有特殊含义(请参阅 Shell 参数扩展)。

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

于 2012-02-23T20:36:32.623 回答
20

如果不确定,您可以在终端上使用 'cols' 请求,而忘记 COLUMNS:

COLS=$(tput cols)
于 2009-05-09T19:45:21.417 回答
15

请注意COLUMNS

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

第二点通常意味着您的COLUMNS变量只会在交互式shell 中设置,而不是在 bash 脚本中。

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

tput cols

并在您的 SVN 命令中使用它:

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

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

于 2009-05-11T07:30:50.073 回答
2

以下脚本适用于我的多个$COLUMNS. 我想知道你是不是COLUMNS在这个电话之前没有设置?

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

您可以$COLUMNS在脚本中回显以查看其设置是否正确吗?

于 2009-05-08T16:29:08.403 回答
0

你做得对,所以我猜还有其他问题(不是导出 COLUMNS ?)。

调试这些情况的一个技巧是制作一个专门的命令(编程语言人员的闭包)。创建一个名为 diff-columns 的 shell 脚本,执行以下操作:

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

并使用

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

这样,您的代码更易于阅读且更模块化(自上而下的方法),并且您可以单独彻底地测试 diff-columns 代码(自下而上的方法)。

于 2009-05-09T08:04:56.627 回答