2014-11-24 59 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