Shell脚本容易写错的几个语法

来自Alex's wiki
跳转至: 导航搜索
1. if [$1 == ""]; then
    fi
   2处错误
   []前后要加空格,前和后都要
   $1是危险的,如果是空等于[ == "" ]; 有语法错误
   正确写法
    if [ "$1" == "" ]; then
    fi
2. a = 1
   1处错误,shell变量定义=前后不能有空白
   正确写法
   a=1
3. a=`ls`或a=$("ls")
     echo $a
     错误,如果结果是多行,echo是有问题的,尤其配合while使用时
     正确做法,加双引号
     echo "$a"
4.  grep "- data $abc" file
    两处错误,字符串参数的第一个字母如果是-需要转义,$需要转义,grep是示例,问题不仅限于grep
    正确 grep "\- data \$abc" file
5. 脚本参数转给命令
    ls $1   错误,如果$1有空格,变成了两个参数,正确用法 ls "$1"
    ls "$@" 错误 ,本意是传所有参数,这样变成了一个大参数,正确用法 ls $@
6. rm -f file cp -f file
    错误,服务器一般会将这两个命令重定向为带-i参数,-f参数失效,卡住
    正确用法 /bin/rm -f file /bin/cp -f file
7. 判断
    if [ $? -eq 0 || $? -eq 1 ]; then
    fi
    if [ $? -eq 0]; || [ $? -eq 1 ]; then
    fi
    错误,成功第二种经常复制而来
    正确做法每个条件独立一个[],只有最后一个需要;
    if [ $? -eq 0] || [ $? -eq 1 ]; then
    fi
8. 返回值判断
    if [ $? -eq 0 ] || [ $? -eq 1 ]; then
    fi
    错误后在的$?已经不再是命令返回值,而是前一个判断的返回值,恒定为0
    正确做法,先存起来
    ret=$?
    if [ $ret -eq 0 ] || [ $ret -eq 1 ]; then
    fi