高编——shell编程

1 shell编程 对比 C编程 
shell编程: (1.执行过程,2.开发效率,3.执行效率,4.移植性)  
    解释型语言  
        边翻译边执行 (ls cp(程序))
        擅长文件处理,操作系统管理
        开发效率高  cp 1 2
        执行效率低    
        移植性好
    .c
    编译型语言
        先编译再执行   //gcc 编译 (.c ---> 机器代码) 
        擅长数据计算和数据处理
        开发效率低
        执行效率高
        移植性差

2.2 shell脚本编写     
    1.shell脚本编写流程:
        1.vim XX.sh  #!/bin/bash     //编辑文件 
        2.编写脚本
        3.chmod +x XX.sh             //给执行权限 
        4. ./XX.sh                   //执行文件 
        
     注意:
          #    --- 第一行 不要写注释 这些

文件类型 所属用户权限  所属组  其他人       
-           rw-        rw-     r--

chmod +x  1.sh 
chmod 
    
//chmod - ls -l  权限位     
    chmod  +x 
    chmod  0777 01.sh  
    
    r w x - r w x  - r w x 
    1 1 1   1 1 1    1 1 1 
    -----   -----    -----
      7       7        7 
      
    r w x - r w x  - r w x 
    0 0 1   1 1 1    1 1 1 
    -----   -----    -----
      1       7        7 

2.shell变量  
        1.环境变量: env
            PATH:保存当前工作的默认路径
            PWD :当前所在的工作路径
            HOME:当前登录用户的家目录
            ...

键(key)值(value)对  
        KEY=value 
        

        2.位置变量:  ./3.sh /etc/passwd 123   内置变量
        main(int argc,char* argv[]) // a.out 1  2
        
        @argc --- 命令行参数的个数
        @argv --- 命令行参数对应的数组的首地址 
        
    
             $0:脚本文件名
            $1:传入脚本的第一个参数
            $2:传入脚本的第二个参数
            ...
            $9:
            ls /etcpass 
            cp /etc/passwd 123 ;
            
            
            $#:传入参数的个数
            
            $?:上一句shell命令执行的结果
               0 表示成功 
            $$:当前shell的PID --- $$ 21694 //进程的概念提示  
            进程 ---- 进行中程序(process id--进程的身份证号)  
            
            a=123

//[说明]:
表 1 位置参数变量
位置参数变量    作 用
$n    n 为数字,$0 代表命令本身,$1〜$9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如${10}
$*    这个变量代表命令行中所有的参数,把所有的参数看成一个整体
$@    这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
$#    这个变量代表命令行中所有参数的个数

 3.自定义的变量:
        注意:
            (1).shell中数据是弱类型,默认识别为字符串类型         
            (2).不需要,先定义
            (3).名字规则 ,遵循C的命名规则。 //(不要带空格)    
                不能带 $符号 
                [注]
                 给值的时候 等号两边不能有空格 
                 var=123 (√)
                 var = 123 (x) 
            
echo ~ printf
read --表示从哪个键盘获取输入     

3.shell脚本输入输出
            read  name
            echo  '$name'
            a+b;

        4.shell中的引号
          "":打印字符串,遇到$变量($name)则打印变量中的值(name变量的值)
          '':打印字符串,遇到$变量依然打印 $变量 (原样输出)
          ` `:将中间的字符串按照命令打印   (命令置换)

read
     read从标准输入读入一行, 并赋值给后面的变量,其语法为:
   .   read  var
     把读入的数据全部赋给var
   .   read  var1  var2  var3
     把读入行中的第一个单词(word)赋给var1, 
     第二个单词赋给var2, 
     ……把其余所有的词赋给最后一个变量.
     如果执行read语句时标准输入无数据, 
     则程序在此停留等侯, 
     直到数据的到来或被终止运行。


//字符串不能进行运算,需要专门命令 expr 
运算:
expr             
expr 
算术运算命令expr主要用于进行简单的整数运算,
#注意:
     (1).符号两边要有空格
     (2).注意对应的运算符是否需要转义 

包括:
    加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。

分支语句:
    

1.if语句

     if (表达式)
     {
        语句1;     
     }
     else 
     {
        语句2;
     }
  
        if 条件
        then
            语句1
        else
            语句2
        fi //fi

 //多分支 


    if 条件表达式
    then
        语句 
    elif [条件表达式]  #else if (表达式)
    then 
        语句 
    elif [条件表达式]
    then
       语句 
    else 
       语句 
    fi

//条件的生成 --test的命令      //注意: test 执行结果为真  0
                             // 执行结果为假 1
    man test 
    -a and  &&
    -o or  ||
    
    test    -eq        相等   
    test 10 -eq $i     [ $i -eq 10 ]      if( a == 10)
            -ne        不相等
        
            -gt        大于
            -lt        小于
            -ge        大于等于
            -le     小于等于
            [ $i ge 0  -a $i lt 59 ]
            
  //命令的写法
  test 10 -eq $i
 
  //中括号 
  [ $i -eq 10 ]  //注意: 中括号里面,前后都要有空格。
  
  //C风格 
  (( c语言风格的表达式 ))

test 
        -b            块设备文件        block      test -b /dev/usb0 --- 硬盘 // ls -l /dev/sda
        -c            字符设备文件      char                         --- 鼠标,键盘 // ls -l /dev/input/mice
        -d            目录文件          directory 
        -f             普通文件          regular 
        -L            链接文件          link       类似 windows下的快捷方式 // ln -s 源文件 目标文件
        -S             套接字文件        socket     (本地socket/网络socket )
        -p            管道文件          pipe       (管道) //进程的通信  mkfifo pipe

练习 5:
    从终端输入一个文件名,判断该文件的类型

  1 #!/bin/bash 
  2 
  3 echo "Input a name"
  4 read file                                                                                                                                                                          
  5 
  6 if test -L $file
  7 then
  8     echo "link"
  9 elif test -c $file
 10 then
 11     echo "char"
 12 elif test -d $file
 13 then
 14     echo "director"
 15 elif test -b $file
 16 then
 17     echo "block"
 18 elif test -f $file
 19 then
 20     echo "regular"
 21 elif test -s $file
 22 then
 23     echo "socket"
 24 elif test -p $file
 25 then
 26     echo "pipe"
 27 else
 28     echo "no exist"
 29 
 30 fi

2.case    

switch(n)
    {
        case 1:
             ...
             break;
             
        default:
             ...
             break;
    }
    
    
    //shell 
        case $num in 
            9)语句
                ;;  //C中的 --- break
            8|6|5|4)语句
                ;;  //C中的 break 
            7)语句
                ;;
            *)语句 //default 
                ;;
        esac  //esac --->case 反着写 

练习:从终端接收一个成绩,并评级

  1 #!/bin/bash 
  2 
  3 read n
  4 ret=`expr $n / 10`
  5 
  6 case $ret in
  7     0|1|2|3|4|5)                                                                                                                                     
  8         echo "E"
  9         ;;
 10     6)
 11         echo "D"
 12         ;;
 13     7)
 14         echo "C"
 15         ;;
 16     8)
 17         echo "B"
 18         ;;
 19     9|10)
 20         echo "A"
 21         ;;
 22     *)
 23         echo "false"
 24         ;;
 25 esac
 26 

for 循环:


for循环一般格式为:

//c
for (表达式1;表达式2;表达式3)
{
    语句;
}

//shell 
for var in item1 item2 ... itemN  //for循环的条件 
do                                //for循环的执行体
    command1
    command2
    ...
    commandN
done

  1 #!/bin/bash 
  2 
  3 for var in 1 2 3 4 5 6 7 8 9
  4 do
  5     echo "var = $var"
  6 done  

while 循环:


一般格式:
while condition
do
    command
done

实例:100求和

  1 #!/bin/bash 
  2 
  3 i=1
  4 
  5 while test $i -le 100
  6 do
  7     echo "i = $i"
  8 #   ((i++))
  9     i=`expr $i + 1`                                   
 10 done

until 


语法格式:
until condition
do
    command
done

condition 一般为条件表达式,
如果返回值为 false
继续执行循环体内的语句,否则跳出循环。
实例:100求和

  1 #!/bin/bash 
  2 
  3 i=1
  4 sum=0
  5 until [ $i -gt 100 ]
  6 do
  7     echo "i = $i"
  8 #   ((++i))
  9 #   sum=`expr $sum + $i`
 10     ((sum+=i))
 11     i=`expr $i + 1`
 12 done
 13 echo "sum = $sum"  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值