九色91_成人精品一区二区三区中文字幕_国产精品久久久久一区二区三区_欧美精品久久_国产精品99久久久久久久vr_www.国产视频

Hello! 歡迎來到小浪云!


第四節(jié):Bash編程易犯的錯誤


avatar
小浪云 2024-12-16 189

第四節(jié):Bash編程易犯的錯誤

上一篇文章參見 第三節(jié):bash編程易犯的錯誤。這一篇翻譯得不是非常滿意,時間比較趕,請見諒,如果有問題可以在本文后方留言,大家一起深入探討。

36. [ -n $foo ] or [ -z $foo ]

這個例子中,$foo 沒有用引號引起來,當(dāng)$foo包含空格或者$foo為空時都會出問題:

 $ foo="some word" && [ -n $foo ] && echo yes -bash: [: some: binary operator expected  $ foo="" && [ -n $foo ] && echo yes yes  正確的寫法是:  [ -n "$foo" ] [ -z "$foo" ] [ -n "$(some command with a "$file" in it)" ]  [[ -n $foo ]] [[ -z $foo ]] 

37. [[ -e “$broken_symlink” ]] returns 1 even though $broken_symlink exists

這里-e 選項是看文件是否存在,當(dāng)緊跟的文件是一個軟鏈接時,它不看軟鏈接是否存在,而是看實際指向的文件是否存在。所以當(dāng)軟鏈接損壞時,即實際指向的文件被刪除后,-e 的結(jié)果返回1。

所以如果你確實要判斷后面的文件是否存在,正確的寫法是:

 [[ -e "$broken_symlink" || -L "$broken_symlink" ]] 

38. ed file ails ed 命令使用的正則語法,不支持0次出現(xiàn)次數(shù),下面的就可以正常工作:

 ed file < <<"g/d{1,3}/s//e/g" 

略過,現(xiàn)在很少會有人用 ed 命令吧。

39. expr sub-string fails for “match”

下面的例子多數(shù)情況下運(yùn)行不會有問題:

 word=abcde expr "$word" : ".(.*)" bcde 

但是當(dāng) $work 不巧剛好是 match 時,就有可能出錯了(MAC OSX 下的 expr 命令不支持 match,所以依然能正常工作):

 word=match expr "$word" : ".(.*)" 

原因是 match 是 expr 命令里面的一個特殊關(guān)鍵字,針對 GNU系統(tǒng),解決方法是在前面加一個’+’:

 word=match expr + "$word" : ".(.*)" atch 

‘+’號可以讓 expr 命令忽略后續(xù) token 的特殊含義。

另外一個建議是,不要再使用 expr 命令了,expr 能做的事情都可以用 Bash 原生支持的參數(shù)展開(Parameter Expansion)或者字符串展開(Substring Expansion)來完成。并且相同情況下,內(nèi)置的功能肯定比外部命令的效率要高。

上面的例子,目的是為了刪除單詞中的首字符,可以這樣做:

 $ word=match $ echo "${word#?}"    # PE atch $ echo "${word:1}"    # SE atch 

40. On UTF-8 and Byte-Order Marks (BOM)

多數(shù)情況下,UNIX 下 UTF-8 類型的文本不需要使用 BOM,文本的編碼是根據(jù)當(dāng)前語言環(huán)境,MIME類型或者其它文件元數(shù)據(jù)信息確定的。人為閱讀時,不會因為在文件開始處加 BOM 標(biāo)記而腚影響,但是當(dāng)文件要被腳本解釋執(zhí)行時,BOM 標(biāo)記會像 MS-DOS 下的換行符(^M)一樣奇怪。

41. content=$(&1 >>logfile

這是一個很常見的錯誤,顯然你本來是想將標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤輸出都重定向到文件logfile 中,但是你會驚訝地發(fā)現(xiàn),標(biāo)準(zhǔn)錯誤依然輸出到屏幕中。

這種行為的原因是,重定向在命令執(zhí)行之前解析,并且是從左往右解析。上面的命令可以翻譯成,將標(biāo)準(zhǔn)錯誤輸出重定向到標(biāo)準(zhǔn)輸出(此刻是終端),然后將標(biāo)準(zhǔn)輸出重定向到文件 logfile 中。所以,到最后,標(biāo)準(zhǔn)錯誤并沒有重定向到文件中,而是依然輸出到終端:

 somecmd >>logfile 2>&1 

更加詳細(xì)的說明見BashFAQ。

43. cmd; (( ! $? )) || die

只有需要捕獲上一個命令的執(zhí)行結(jié)果進(jìn),才需要記錄$?的值,否則如果你只需要檢查上一個命令是否執(zhí)行成功,直接檢測命令:

 if cmd; then     ... fi  或者使用 case 語句來檢測多個或能的返回碼:  cmd status=$? case $status in     0)         echo success >&2         ;;     1)         echo 'Must supply a parameter, exiting.' >&2         exit 1         ;;     *)         echo 'Unknown error, exiting.' >&2         exit $status esac 

相關(guān)閱讀

主站蜘蛛池模板: 日日操操 | 春色av| 欧美一区二区网站 | 国产欧美精品在线 | 国产一区2区 | 久久精品视频网站 | 久久久精品久久久 | 天天天操 | 国产粉嫩尤物极品99综合精品 | 99精品免费久久久久久久久日本 | 成人免费视频网站在线观看 | 欧美日韩精品亚洲 | 天天草天天干天天 | 中文字幕亚洲一区 | 一区二区福利视频 | 网站黄色在线免费观看 | 成人在线视频一区 | 国产精品成人在线观看 | 男人天堂网址 | 欧美日韩在线播放 | 久久青视频 | 久久国产亚洲精品 | 国产精品一区二区三区免费观看 | 51ⅴ精品国产91久久久久久 | 北条麻妃视频在线观看 | 免费观看日韩精品 | 欧美 日本 国产 | 综合久久综合久久 | 人人叉| 久久久综合久久 | 乱一性一乱一交一视频a∨ 色爱av | 精品视频在线观看 | 亚洲国产一区在线 | 久久国产欧美日韩精品 | 视频在线一区二区 | 国产精品毛片 | 国产成视频在线观看 | 久www| 欧美一级免费黄色片 | 国产美女精品视频免费观看 | 亚洲经典一区 |