要從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
問題就解決了。