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
问题就解决了。

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