【Linux基础】shell脚本

1:开机脚本/etc/rc.local

 sudo vi  /etc/rc.local
 echo  "nameserver 192.168.8.1" >> /etc/resolvconf  

2:Shell脚本的本质

  Shell命令的有序集合。
  命令who: 查看当前登录用户的信息。
  date: 查看当前时间。

3:shell 编程的基本过程

   step1: 编辑shell脚本文件。
   step2: 添加可执行权限。(chmod)
      m1: 8进制
        sudo  chmod  775 date.sh 
      m2: 字符方式
        sudo  chmod  u+x  date.sh 
        sudo  chmod  a+x   date.sh 
   step3: 执行脚本
      m1: 指明具体路径名。
      m2(了解): 修改环境变量PATH,或者将可执行文件放到/bin, /sbin等环境变量指定的目录。

4:shell基本语法

   4-1: shell变量
      定义: 用了存储数据,shell将所有的变都解释为一串字符。
      创建变量:
           Variable=value
           变量名=变量值。 // remark:等号之间不能有空格。
       使用: 
        在变量名前加"$"取出变量的值。
       变量的分类:
       a: 用户自定义变量
         生命周期: 此种变量只能在用户的脚本文件中使用。
       命令unset删除变量

       b:环境变量(系统定义的变量)
         生命周期: 从开机启动到关机之间都可以使用。
HOME: /etc/passwd文件中列出的用户主目录 
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>) 


重点:
       c:位置变量:用来保存命令行参数,此变量是可读型变量,不能更改。
          $0: 存放shell脚本的名字
          $1~9: 存放第一个到第九个命令行参数
          ${10}~${n}: 存放第十个到第n个命令行参数。

       d:预定义变量: 保存一些其他信息。
        $#  包含命令行参数的个数
        $@  包含所有命令行参数:“$1,$2,……$9$?  包含前一个命令的退出状态
        $*  包含所有命令行参数:“$1,$2,……$9$$  包含正在执行进程的ID号

5:基本命令

  5-1: read从标准输入读入一行, 并赋值给后面的变量,其语法为:
          read  var
       read  var1  var2:如果从标准输入中输入的值超过2个,那么后面的值都赋给var2
  5-2: expr: 算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作
      注意:运算符和运算数之间要加空格。
  5-3: test:测试字符串,整数,判断文件属性。
            test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).

        $?    保存前一个命令的退出状态
     --: 字符串:
         s1 = s2    测试两个字符串的内容是否完全一样
          如果一样的话,test返回0表示逻辑真, 如果不一样放回非0值表示逻辑假。
        s1 != s2    测试两个字符串的内容是否有差异
           如果 不一样的话,test返回0, 
        -z s1   测试s1 字符串的长度是否为0
        -n s1   测试s1 字符串的长度是否不为0

     --:整数测试
        a -eq b         测试a 与b 是否相等
     a -ne b        测试a 与b 是否不相等
     a -gt(great than) b        测试a 是否大于b
     a -ge b        测试a 是否大于等于b
     a -lt b        测试a 是否小于b
     a -le b        测试a 是否小于等于b
   --:文件测试
        类型:bcd-lsp
        -d name         测试name 是否为一个目录
        -f name         测试name 是否为普通文件
        -L name         测试name 是否为符号链接
        -b name:       测试name 是否为块设备文件
        -c name:       测试name 是否为字符设备文件
        -p name :      测试name 是否为管道文件
        -S name:       测试name 是否为套接字文件

        权限:
        -r name         测试name 文件是否存在且为可读
        -w name         测试name 文件是否存在且为可写
        -x name         测试name 文件是否存在且为可执行

6:结构性语句

test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).

  6-1:条件语句(单分支语句)
    ifthen…fi
语法结构:
         if    表达式
                then  命令表
         fi  
     other command 

 **: 如果表达式的值为真,则执行命令表,然后执行other command, 否则直接执行other command

ifthenelse…fi(双分支语句)
语法结构为:
        if      表达式1
        then 命令表1
        else  命令表2
        fi
    other command 
**: 如果表达式1的值为真,则执行命令表1,表达式1为假则执行命令表2.然后执行other command

**:test 可以用[]来代替。
 [+空格+判断表达式+空格+]

   多分枝语句:
     if 表达式1
     then
        命令表1
     elif 表达式2
     then
      命令表2
     else
      命令表3
     fi
     other command 
  **:如果表达式1的值为真则执行命令表1,然后执行other command, 如果表达式1的值为假则判断表达式2,如果表达式2的值为真则执行命令表2中的内容。
  否则执行命令表3中的内容。然后执行other command

练习: 通过命令行传递参数的方式判断一个文件的类型。
    例如,  ./file_type.sh  filename :判断文件filename的类型。

7:多路分支语句

   多路分支语句case用于多重条件测试, 语法结构清晰自然.  其语法为:
     case   字符串变量   in
            模式1)
                       命令表1
                        ;;
            模式2)
                       命令表2
                        ;;
             ……
            模式n)
                       命令表n
                        ;;
    esac
    other command
  如果字符串变量的值和模式1相同,则执行命令表1中的内容。执行完后退出case语句,如果和模式1不相同则字符串变量和模式2相比较,如果相同,则执行
  命令表2中的内容执行完后退出case语句,否则和模式3 比较,。。。。如果和模式n-1不相同则和模式n比较,如果和模式n相同则执行命令表n中的内容,然后退出
  case语句,否则直接退出case语句。

8:循环语句

    for   变量名   in   单词表
              do
                      命令表
               done


  **: 当单词表示$@或者$*命令的行的所有参数时,可以省略in 单词表。
  for  变量名
  do
      命令表
  done
  变量从命令行参数中去单词,也就是将命令行的所有参数作为单词表。

9:while…do…done

              语法结构为:   
                           while     命令或表达式
                            do
                                    命令表
                            done

练习: 通过脚本创建文件
     file0.txt, file2.txt,file4.txt,file6.txt,file8.txt,file10.txt,file12.txtbreak 和 continue 
当循环语句中执行break时则跳出循环。
当循环语句中执行continue时则去执行下一次循环,省略此次循环的剩余部分。

10:shell函数

    定义:  把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数名即可。
    注意:  函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。
    注意: 可以给函数传递参数, 通过return返回一个值给调用函数的语句。


    函数定义格式:
    function_name ( )//括号里面是空的,不能有参数。调用函数时只能通过命令行传递参数。
    {
            command1
            ……
            commandn
    }

    function  function_name ( )
    {
            command1
            ……
            commandn
    }

 函数的调用方式:
   1: value_name=`function_name  [arg1 arg2 … ]`  : 将函数function_name的标准输出保存在变量 value_name中,
   2:function_name  [arg1  arg2  …  ]
      echo   $?
      用$?取出函数function_name的返回值(return  的值)

   --: 变量
      默认情况下函数中的变量是全局变量,即当函数执行完后变量的值不释放。
      如果要定义局部变量则在变量前加local.



  ***: 如何一次注释多行。
  底行模式
  :n,ms/^/#/g : 在n到m行行首加“#”,即注释n到m行。  “^":代表行首。

作业

      一: 符合下列三个要求
          1:在用户的家目录下创建一个目录backup,如果此目录存在则不创建,
          如果不存在则创建。(注意同一个目录下文件名不能相同)
          2:将当前目录下的可执行的普通文件copy到家目录下的backup目录下。
          3:统计符合条件的文件个数。
      二: 
      通过read 从标准输入里输入学生成绩
      通过多分枝语句判断学生成绩的等级。
          大于等于60小于70:及格
          大于等于70小于80:中等
          大于等于80小于90:良好
          大于等于90小于100:优秀
          等于100          :优秀

      三:通过man手册来学习find和grep的用法

      find  ./ -name "xxx" :在当前目录以及子目录中查找文件名为xxx的文件。
      grep  “xxx”  ./* -r  :在当前目录以及子目录中文中包含“xxx”内容的文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值