Shell腳本中的文件名擴展和判斷條件中的空格

要從server庫裏下載一些文件,就寫腳本。在寫的過程中遇到兩個問題。

1. 文件名擴展
#!/bin/sh
A="core"
if [ "$A" == c* ];then
  echo "OK"
fi

運行腳本時,報錯“[: too many arguments”。查了網上的一些資料知道是文件名擴展(File globbing)的原因。
運行腳本的目錄下有這樣幾個文件:
cmdfile,core12,dirlist

在“[]”裏c*進行了文件名擴展,它代表“cmdfile,core12”,[ "$A" == c* ]就展開爲[ "$A" == cmdfile core12],所以報錯“too many arguments”.
刪除文件cmdfile,就不會有錯。如果把文件core12改爲core,會輸出OK。

解決的方法是使用"[[ ]]"。
#!/bin/sh
A="core"
if [[ "$A" == c* ]];then
  echo "OK"
fi

使用"[[ ]]"進行判斷同時也避免了單詞分割"word splitting"。參考http://mywiki.wooledge.org/WordSplitting

2.注意判斷條件的空格

需要找出一個目錄以及子目錄下所有的jar文件

#!/bin/sh
prntfiles(){
    cur_dir=$1
    for name in `find $cur_dir -name "*"`;  do
    if [ -f $name ]; then
      if [[ "$name"==*jar ]]; then
        echo $name
      fi

    fi
    done

}
prntfiles $1

用上面的腳本去運行,什麼文件都能輸出。很納悶。後來百度一下,看一些文檔,知道了判斷條件中要注意空格。
將if [[ "$name"==*jar ]]; then 改爲
  if [[ "$name" == *jar ]]; then
問題就解決了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章