天天看点

初始Sell脚本记录一下学习过程并且完成一个实际案例

Sell脚本初始语法介绍

==>编写规范

第一行,指定哪个程序来执行脚本

#!/bin/bash

或者

#!/bin/sh

这样的开头是证明一个Shell脚本的标准开始

接下来我们来写一个HelloWord的Shell脚本

写之前我们要创建一个Helloword.sh的文件

初始Sell脚本记录一下学习过程并且完成一个实际案例

touch helloword.sh 创建一个文件夹

初始Sell脚本记录一下学习过程并且完成一个实际案例

chmod 755 helloword.sh 修改文件权限

加入如下内容

初始Sell脚本记录一下学习过程并且完成一个实际案例

执行结果

初始Sell脚本记录一下学习过程并且完成一个实际案例

刚刚的那个指令

echo “data” —>表示在控制台输出data

接下来我们使用一下Shell中的判断和分支

if [ command ];then #开始
     符合该条件执行的语句
elif [ command ];then # 开始
     符合该条件执行的语句
else 
     符合该条件执行的语句
fi	 
# 结束if
           

if 判断中分为三种

  • 整数测试
  • 字符测试
  • 文件测试
  • 条件测试的表达式:
      [ expression ]  括号两端必须要有空格
      [[ expression ]] 括号两端必须要有空格
               
  • 组合测试条件:
      a: and
      o: or
      !:  非
               
    整数比较:
  • eq 测试两个整数是否相等
      ne 测试两个整数是否不等
      gt 测试一个数是否大于另一个数
      lt 测试一个数是否小于另一个数
      ge 大于或等于
      le 小于或等于
      命令间的逻辑关系
      逻辑与:&&
      第一个条件为假 第二个条件不用在判断,最总结果已经有
      第一个条件为真,第二个条件必须得判断
      逻辑或:||
      第一个为真或者第二个为真都可以
               
    文件/文件夹(目录)判断
  • [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
     [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
     [ -d DIR ] 如果 FILE 存在且是一个目录则为真。
     [ -e FILE ] 如果 FILE 存在则为真。
     [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
     [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
     [ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
     [ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
     [ -r FILE ] 如果 FILE 存在且是可读的则为真。
     [ -s FILE ] 如果 FILE 存在且大小不为0则为真。
     [ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
     [ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
     [ -w FILE ] 如果 FILE存在且是可写的则为真。
     [ -x FILE ] 如果 FILE 存在且是可执行的则为真。
     [ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
     [ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
     [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
     [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
     [ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
     [ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
     [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
     [ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
               

Shell 中的String操作

$ str=hello word
           

**# :截左取右,截到第一次匹配 **

$ echo ${str#*w}  
执行
[[email protected] ~]# ./helloword.sh
ord
           

##截左取右,匹配最后一次 匹配最后一个空格

#!/bin/bash
str="he llo wo rd"
echo ${str##* }
執行
[[email protected] ~]# ./helloword.sh
rd
           

% :截右取左 截到第一次匹配

str="he llo wo rd"
echo ${str% *}

执行结果
[[email protected] ~]# ./helloword.sh
he llo wo
           

%% :截右取左 截到最后一次匹配

str="he llo wo rd"
echo ${str%% *}
[[email protected] ~]# ./helloword.sh
he
           

匹配长度截取

  • echo ${str:0:2}结果 he
     echo ${str:1} 结果为e llo wo rd
     还有echo {str:0-3:2} 和echo ${str:0-2} 都可以试一下
               

读取文件路径操作

  • basename

    取一个文件名(去掉后缀名),可以用basename。这个命令使用起来貌似有些死板。你要完整地写出 后缀名(想要剔除的部分)。

basename /usr/bin/sort          -> "sort" 
 basename include/stdio.h .h     -> "stdio" 
 basename -s .h include/stdio.h  -> "stdio" 
 basename -a any/str1 any/str2   -> "str1" followed by "str2" 
           

dirname

取一个文件存储路径

dirname /usr/bin/          -> "/usr" 
 dirname dir1/str dir2/str  -> "dir1" followed by "dir2" 
 dirname stdio.h            -> "."
           
find /usr/local/backups  查询数据
 -mtime +10 // -mtime 表示修改时间
  -name "*.*" 文件名
   -exec  即将执行一个进程指令
   rm -rf {} \; rm -rf{} \表示转义  ; 需要转义