2014-09-26 161 views
0

沒有發現我有以下腳本:

#!/bin/sh 

#parameters definition 
ROOT_PATH=/var/www/ 
msql_psw="cc" 
mysql_login="bb" 
mysql_db_name="aa" 

echo START MYSQL DUMP 

NOW=$(date +"%Y-%m-%d") 
SQLFILE="log-$NOW.sql" 
mysqldump --add-drop-table -u "$mysql_login" --password="$mysql_psw" "$mysql_db_name" > "$ROOT_PATH/$SQLFILE" 

當它與sh -x運行,它給出了空行的命令沒有發現錯誤,甚至非空行唐「T正常工作:

sh -x export_db.sh 
+ $'\r' 
: command not found2: 
+ ROOT_PATH=$'/var/www/\r' 
+ msql_psw=$'cc\r' 
+ mysql_login=$'bb\r' 
+ mysql_db_name=$'aa\r' 
+ $'\r' 
: command not found8: 
+ echo START MYSQL $'DUMP\r' 
START MYSQL DUMP 
+ $'\r' 
: command not found10: 
++ date +%Y-%m-%d 
+ NOW=$'2014-10-02\r' 
+ SQLFILE=$'log-2014-10-02\r.sql\r' 
+ mysqldump --add-drop-table -u $'bb\r' --password= $'aa\r' 
: No such file or directory/www/ 
+1

這裏唯一特別錯的是缺少引號 - 應該是'-u「$ mysql_login」--password =「$ mysql_psw」'等等,用'sh -x your.script'運行你的腳本看看它說的是實際運行 - 這會顯示它是否真的不會替換命令中的變量。 – 2014-09-26 21:55:34

+2

噢 - 實際上,'$ ROOT_PATH = foo'是非常錯誤的;需要'ROOT_PATH = foo',而不需要前導'$'。 – 2014-09-26 21:57:46

+0

$ root_path是一個錯字,我沒有在腳本中使用$。我會嘗試並讓你知道。謝謝 – LEM01 2014-09-27 21:49:05

回答

4

$'\r是寫CR字符的殼方式 - 回車。 DOS格式的文本文件以CRLF結尾 - 以shell命名,$'\r\n',而UNIX文本文件僅以$ \n結尾。因此,當UNIX讀取DOS格式的文本文件時,每行看起來最後都有一個額外的$ \r


除此之外,一些筆記(的地方,只有相關的問題的早期版本):

擴展運營商都沒有分配使用,所以

$ROOT_PATH=/var/www/ 

需求是

ROOT_PATH=/var/www 

除此之外 - 在所有擴展中使用引號。那就是:

mysqldump \ 
    --add-drop-table \ 
    -u "$mysql_login" \ 
    --password="$mysql_psw" \ 
    "$mysql_db_name" \ 
    >"$ROOT_PATH/$SQLFILE" 

否則,變量將通過IFS,水珠展開拆分等

最後 - 做這樣一個大膽的要求時,作爲變量沒有被取代,試圖證明它通過在腳本中使用set -x(或以#!/bin/sh -x開頭,或使用sh -x yourscript手動運行它)來記錄shell在擴展後實際調用時運行的命令。

+0

感謝您的回答,不幸的是我仍然無法得到它的工作。我用我得到的輸出編輯了我的帖子。 – LEM01 2014-10-02 19:03:18

+0

我會驗證這個答案,但我在初始文章中添加了一些評論。謝謝! – LEM01 2014-10-03 10:33:25

+0

添加自己的答案_作爲答案,而不是編輯問題。 – 2014-10-03 14:39:30