shell脚本练习手册

命令:

rename 修改文件名(适用于批量修改文件名)

与 mv 命令的区别 mv适用于 单个文件修改(单源移动时候才可以改名字)

语法:用法:

rename [选项] 表达式 替换文件...

选项:

-v, --verbose 解释正在进行的操作

-s, --symlink 在符号链接上执行

-h, --help 显示此帮助并退出

-V, --version 输出版本信息并退出

例如:

rename de mo demo?

解读 通配demo? 找到其中的 de 改成mo

命令:

uptime

可以查看系统启动时间

代码注释:

               缩进,适度添加空白行;

              

     语言:编程语法格式,库,算法和数据结构



              

     变量:

               局部变量

               本地变量

               环境变量

              

               位置参数变量

               特殊变量

              

     数据类型:字符型、数值型

               shell 默认:弱类型:字符型

              

     算术运算:

               +, -, *, /, %, **(乘方)

              

               let  VAR=expression

               VAR=$[expression]

               VAR=$((expression))

               VAR=$(expr argu1 argu2 argu3)

              

               注意:有些时候乘法符号需要转义;

              

               增强型赋值:

                        变量做某种算术运算后回存至此变量中;

                                 let i=$i+#   变量不用声明 直接使用 引用变量  使用$

                                 let i+=#

                                

                        +=,-=,*=, /=, %=

                       

                        自增:

                                 VAR=$[$VAR+1]

                                 let  VAR+=1

                                 let  VAR++

                                 let  ++VAR

                                

                        自减:

                                 VAR=$[$VAR-1]

                                 let  VAR-=1

                                 let  VAR--

                                 let  --VAR

                                

     条件测试:

               判断某需求是否满足,需要由测试机制来实现;

              

               如何编写测试表达式以实现所需的测试:

                        (1) 执行命令,并利用命令状态返回值来判断;

                                 0:成功

                                 1-255:失败

                        (2) 测试表达式

                                 test  EXPRESSION

                                 [ EXPRESSION ]

                                 [[ EXPRESSION ]]

                                

                                 注意:EXPRESSION两端必须有空白字符,否则为语法错误;

                                

               bash的测试类型:

                        数值测试

                        字符串测试

                        文件测试

                       

                        数值测试:数值比较

                                 -eq:是否等于; [ $num1 -eq $num2 ]

                                 -ne:是否不等于;

                                 -gt:是否大于;

                                 -ge:是否大于等于;

                                 -lt:是否小于;

                                 -le:是否小于等于;

                                

                        字符串测试:

                                 ==:是否等于;

                                 >:是否大于;

                                 <:是否小于;

                                 !=:是否不等于;

                                 =~:左侧字符串是否能够被右侧的PATTERN所匹配;

                                

                                 -z "STRING":判断指定的字串是否为空;空则为真,不空则假;

                                 -n "STRING":判断指定的字符串是否不空;不空则真,空则为假;

                                

                                 注意:

                                           (1) 字符串要加引用;

                                           (2) 要使用[[ ]];

                                          

                        文件测试:

                                 存在性测试

                                           -a  FILE

                                           -e  FILE

                                                    文件的存在性测试,存在则为真,否则则为假;

                                 存在性及类型测试

                                           -b  FILE:是否存在并且为 块设备 文件;

                                           -c  FILE:是否存在并且为 字符设备 文件;

                                           -d  FILE:是否存在并且为 目录文件;

                                           -f  FILE:是否存在并且为 普通文件;

                                           -h  FILE或 -L  FILE:是否存在并且为 符号链接文件;

                                           -p FILE:是否存在且为 命名管道文件;

                                           -S  FILE:是否存在且为 套接字文件;

                                 文件权限测试:

                                           -r  FILE:是否存在并且 对当前用户可读;

                                           -w  FILE:是否存在并且 对当前用户可写;

                                           -x  FILE:是否存在并且 对当前用户可执行;

                                 特殊权限测试:

                                           -u  FILE:是否存在并且 拥有suid权限;

                                           -g  FILE:是否存在并且 拥有sgid权限;

                                           -k  FILE:是否存在并且 拥有sticky权限;

                                 文件是否有内容:

                                           -s  FILE:是否有内容;

                                 时间戳:

                                           -N FILE:文件自从上一次读操作后是否被修改过;

                                 从属关系测试:

                                           -O  FILE:当前用户是否为文件的属主;

                                           -G  FILE:当前用户是否属于文件的属组;

                                 双目测试:

                                           FILE1  -ef  FILE2:FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接;

                                           FILE1  -nt  FILE2:FILE1是否新于FILE2;

                                           FILE1  -ot  FILE2:FILE1是否旧于FILE2;

                        组合测试条件:

                                 逻辑运算:

                                           第一种方式:

                                                    COMMAND1 && COMMAND2

                                                    COMMAND1 || COMMAND2

                                                    ! COMMAND

                                                   

                                                    [ -O FILE ] && [ -r FILE ]

                                                   

                                           第二种方式:

                                                    EXPRESSION1  -a  EXPRESSION2

                                                    EXPRESSION1  -o  EXPRESSION2

                                                    ! EXPRESSION

                                                   

                                                    [ -O FILE -a -x FILE ]

               脚本的状态返回值:

                        默认是脚本中执行的最后一条件命令的状态返回值;

                        自定义状态退出状态码:

                                 exit  [n]:n为自己指定的状态码;

                                           注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束;

     向脚本传递参数:

               位置参数变量

              

               myscript.sh  argu1 argu2

                        引用方式:

                                 $1,  $2, ..., ${10}, ${11}, ...

                                

                        轮替:

                                 shift  [n]:位置参数轮替;

     特殊变量:

               $0:脚本文件路径本身;

               $#:脚本参数的个数;

               $*:所有参数(多个字符串) "3" "4" "5"

               $@:所有参数 (单个字符串)"3 4 5"



     过程式编程语言的代码执行顺序:

               顺序执行:逐条运行;

               选择执行:

                        代码有一个分支:条件满足时才会执行;

                        两个或以上的分支:只会执行其中一个满足条件的分支;

               循环执行:

                        代码片断(循环体)要执行0、1或多个来回;

                       

               选择执行:

                        单分支的if语句:

                                 if  测试条件

                                 then

                                           代码分支

                                 fi

                                 if  测试条件; then

                                           代码分支

                                 fi

                       

                        双分支的if语句:

                                 if  测试条件; then

                                           条件为真时执行的分支

                                 else

                                           条件为假时执行的分支

                                 fi

                                

               示例:通过参数传递一个用户名给脚本,此用户不存时,则添加之;

                        #!/bin/bash

                        #

                        if ! grep "^$1\>" /etc/passwd &> /dev/null; then

                                 useradd $1

                                 echo $1 | passwd --stdin $1 &> /dev/null

                                 echo "Add user $1 finished."

                        fi      

                       

                        #!/bin/bash

                        #

                        if [ $# -lt 1 ]; then

                                 echo "只能添加一个用户"

                                 exit 2

                        fi



                        if ! grep "^$1\>" /etc/passwd &> /dev/null; then

                                 useradd $1

                                 echo $1 | passwd --stdin $1 &> /dev/null

                                 echo "Add user $1 finished."

                        fi               

                                

                        #!/bin/bash

                        #

                        if [ $# -lt 1 ]; then

                                 echo "At least one username."

                                 exit 2

                        fi



                        if grep "^$1\>" /etc/passwd &> /dev/null; then

                                 echo "User $1 exists."

                        else

                                 useradd $1

                                 echo $1 | passwd --stdin $1 &> /dev/null

                                 echo "Add user $1 finished."

                        fi                         

推荐阅读更多精彩内容