zoukankan      html  css  js  c++  java
  • shell 脚本的坑

    最近都在写shell脚本,免不了遇到每个新手都要填的坑,在这里简单记录一下。

    test语句的坑

    test语句在shell脚本里用的非常多,像if语句后面的其实都是test语句,也是新手最容易遇到坑的地方之一

    (1)[: =: unary operator expected

    if [ $var = "hello" ]; then
        echo "world"
    fi

    如果var的值为空,执行上面这段脚本的时候会出现这样的错误./test.sh: line 12: [: =: unary operator expected

    运行脚本之前加上-x参数,在每条命令执行前打印出命,就可以发现问题了,这个时候 [ 跟 "hello"做比较,可以test语句少了个"[",因此解析时会出现语法错误。

    修正为 if [ "$var" = "hello" ] 问题就解决了,有了双引号之后,就可以将空字符与"hello"作比较,这样就不会出错了,当然这个错误只有在var为空值的时候才会发生。

     

    (2)[: too many arguments

    如果var是包含空格的字符串那么在if语句中没有给$var加上双引号时,会出现上面的错误,原因是在解析test语句时,没有引号就不能将=号左边的变量完整的解析成一个字符串,使得其无法跟右边的字符串比较,解决的方法也是给$var加上引号。

     

    ls语句的坑

    file_list=$(ls test/*)
    for file in $file_list; do
        echo $file
    done

    这样一段代码,看上去是没问题的,不过当test目录下的文件有文件名包含空格的话,文件名就会被拆开,这样输出的文件就不是目录下原有的文件了,

    解决的方法是直接把for语句写成 for file in test/* 注意不要写成“test/*”否则所有的文件都会在同一行列出,这样就不能一个个文件地进行操作。

    暂时就这么多坑,后续有的继续加上

  • 相关阅读:
    JVM垃圾回收
    JVM 新生代与老年代
    java 异常处理
    二叉搜索树转有序双向链表
    java 对象序列化
    java 字符集 Charset
    MySQL 过滤数据(WHERE子句)
    无重复字符的最长子串
    二叉查找树
    MySQL 检索数据(SELECT)
  • 原文地址:https://www.cnblogs.com/-Lei/p/3309077.html
Copyright © 2011-2022 走看看