如何在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
是:
- 不是一个环境variables。 这是一个普通的bash参数,由bash自己设置。
- 收到
SIGWINCH
信号后自动设置。
第二点通常意味着您的COLUMNS
variables只能在交互式 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差异代码(自下而上的方法)。