生活随笔
收集整理的這篇文章主要介紹了
关于$'\r': command not found错误的一点体会
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天運(yùn)行一個(gè)其他組開發(fā)的jar包,這個(gè)jar包由于運(yùn)行參數(shù)是通過命令行的方式輸入的,所以需要運(yùn)行一個(gè)shell腳本來啟動(dòng)。 啟動(dòng)腳本類似這樣:
#!/bin/bash
jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://XX/XX?characterEncoding=UTF-
8
jdbc_username=XX
jdbc_password=XX
java -jar xx.jar
${jdbc_driverClassName} ${jdbc_url} ${jdbc_username} ${jdbc_password} &
但是啟動(dòng)的時(shí)候一直報(bào)java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,錯(cuò)誤在Class.forName(jdbcDriver)這行。
最開始懷疑是MySQL驅(qū)動(dòng)的問題,首先確認(rèn)了classpath肯定正確,包括嘗試把mysql-connector-java-5.0.2.jar復(fù)制到j(luò)dk的lib/ext/下,還是不行。 嘗試移除Class.forName這行代碼,因?yàn)閖dbc4(JDK1.6)之后的版本是可以不寫Class.forName的。結(jié)果開始報(bào)下一行的數(shù)據(jù)庫(kù)連接用戶名密碼錯(cuò)誤,但是這個(gè)用戶名密碼是沒問題的,使用客戶端可以正常連上。 懷疑是啟動(dòng)腳本的問題,嘗試寫死配置參數(shù)(不通過命令行指定),結(jié)果。。居然可以了。。由此推斷是shell腳本什么地方寫錯(cuò)了。 反復(fù)檢查shell腳本,沒看出什么問題,這才留意到程序啟動(dòng)的時(shí)候有報(bào)一個(gè)./start.sh: line 15: $'\r': command not found,由于后面的錯(cuò)誤太多了,被刷屏了所以之前沒有注意到。大概猜到是換行符的問題,不過因?yàn)檫@個(gè)可以導(dǎo)致數(shù)據(jù)庫(kù)連接出錯(cuò)嗎?在第一步的時(shí)候,我已經(jīng)有打印輸入的參數(shù)了。 打開vi使用set ff=unix解決這個(gè)換行符的問題后,重新啟動(dòng),已經(jīng)可以跑起來了。但是還是蠻疑惑的,一個(gè)換行符有這么大作用嗎? 使用getBytes()方法打印入?yún)⒌腷yte數(shù)組,結(jié)果發(fā)現(xiàn)每個(gè)參數(shù)的后面都跟上了一個(gè)ASCII碼為13的這個(gè)字符,也就是\r回車符。我們知道win下的換行是回車符+換行符,也就是\r\n,而unix下是換行符\n。linux下不識(shí)別\r為回車符,所以導(dǎo)致每行的配置都多了個(gè)\r。并且因?yàn)檫@個(gè)是控制字符,所以在輸出參數(shù)的時(shí)候不會(huì)打印出來,只有使用getBytes()才能看到。
至此,問題已經(jīng)明朗。我覺得一個(gè)教訓(xùn)就是,出現(xiàn)錯(cuò)誤的時(shí)候,一定要先去檢查第一行的錯(cuò)誤,任何比較微小的問題(比如這種回車符),都可能引起大的問題,而且通過后面的錯(cuò)誤信息還不好定位。另外一個(gè)就是在win下修改shell腳本的時(shí)候,要特別警惕,注意文件的格式。
總結(jié)
以上是生活随笔 為你收集整理的关于$'\r': command not found错误的一点体会 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。