如何使用环境变量内部引用的字符串中Bash
-
20-08-2019 - |
题
我已经尝试了各种形式的以下在庆典脚本:
#!/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"
建议?
解决方案
如果不确定,则可以使用该终端上的“COLS的要求,而忘记列:
COLS=$(tput cols)
其他提示
对于任谁来到这里,通过谷歌寻找答案的题目问的一般问题只是一个快速的笔记/摘要(如我)。以下任何方式应该得到引号内获得shell变量工作:
echo "$VARIABLE"
echo "${VARIABLE}"
单引号的使用是主要问题。根据击参考手册:
在单引号(
'
)围字符保留了引号内的每个字符的文本值。单引号之间可能不会出现单引号,即使前面有反斜杠。 [...] 在双引号("
)封闭字符保留了引号中的所有字符的字面意义,$
,`
,\
,并启用了历史扩展的时候,!
除外。字符$
和`在双引号中仍然具有特殊意义(参见shell扩展)。$
,`
,"
,\
,或换行:反斜杠后跟当由下列字符只保留它的特殊含义。在双引号中,后面是这些字符中的一个反斜杠被除去了。没有特殊含义的字符之前的反斜杠被保持不变。双引号可以包含双引号内的前面加一个反斜杠它被引用。如果启用,除非出现在双引号的!
使用反斜线将执行历史扩展。所述!
前述反斜杠不会被删除。 特殊参数*
和@
具有特殊的含义,当在双引号(参见壳牌参数扩展)。
在该特定情况下,在问题提出,$ COLUMNS是具有非标准属性(见上文lhunath的回答)。
的特殊变量注意, COLUMNS
为:
- 不 环境变量。这是一个普通的庆典的参数设置的庆典本身。
- 自动设定在收到
SIGWINCH
信号。
第二点通常意味着你 COLUMNS
变量只会是你的 互动 外壳, 不 在砸向脚本。
如果你的脚本 stdin
连接到你的终端,你可以手动查找你的终端问你的终端:
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
在你的剧本要看它是否设置是否正确?
您这样做是正确的,所以我想别的东西是错误的(不出口-ING列?)。
调试这些例技巧是使一个专用命令(用于编程语言人的闭合)。创建一个shell脚本命名差异柱这样做的:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
和只使用
svn diff "$@" --diff-cmd diff-columns
这样,你的代码是清洁的阅读和更加模块化(自上而下),并且可以操作装配分开(自下而上的方法)测试DIFF-列码。