2014-11-24 47 views
1

如果我在shell脚本中设置了一个变量,然后尝试使用它来创建另一个变量,它似乎并没有被正确替换。例如:bash:变量未按预期展开

#!/bin/bash 
X=/software/xxx 
echo variable X = $X 
echo path using variable: $X/yyy 
echo path without variable: /software/xxx/yyy 

此输出:

variable X = /software/xxx 
/yyy using variable: /software/xxx 
path without variable: /software/xxx/yyy 

我曾预计第二输出线为:

path using variable: /software/xxx/yyy 

我试图引号的各种组合和使用$ {X},但都无济于事。

我是新来的shell脚本(来自Windows背景),所以我肯定有一些非常简单的东西,我在这里失踪。

如果有人想知道为什么我想这样做,背景是,我需要编写一个shell脚本,它需要一个相对路径名参数,确定其绝对路径名,然后设置CLASSPATH中的一些jar文件

#!/bin/bash 
DIR=`readlink -fn $1` 
export CLASSPATH=$DIR/x.jar:$DIR/y.jar 
java progname 
+2

报价通常在世界的问题的原因。 – fedorqui 2014-11-24 12:36:37

+0

我刚刚运行您的示例,并获得了预期输出。尝试使用bash -x运行并查看$ X的设置。我怀疑X不是你想象的那样。 – Bitdiot 2014-11-24 12:52:21

回答

0

您有回车(CR)在您的X=变量声明的结尾字符:调用Java程序之前,该目录

#!/bin/bash 

X=/software/xxx^M 
echo variable X = $X 
echo path using variable: $X/yyy 

(其中^M代表一个SPE cial字符-CR)。我假设你的编辑没有显示它。尝试用vim打开脚本。 Windows和Linux以不同的方式标记换行符(check wiki)。我想你正在使用一些Windows编辑器。

请阅读Bash Pitfalls webpage。我相信你可以从那里学到很多东西。

btw。在vim进入^M一个办法:去插入模式i,比按:CTRL+kMENTER

+0

你也可以用'vim':':%s/^ M $ //'从文件中删除所有'^ M'字符。 Vim对初学者可能会很痛苦,但vimtutor会让你爱上它。 – pawel7318 2014-11-24 13:38:04

+0

非常感谢您的答案。文件中确实有额外的\ r字符。 (我使用emacs在Windows上准备了它 - 我不喜欢vi作为编辑器)。 bash -x揭示了这种情况。从头开始在Linux上重新创建文件,它工作得很好。 – cliveb 2014-11-24 13:59:01