Shell程序编写

shell第11章shell脚本

2018-10-02  本文已影响22人  Chaweys

什么是shell?

我们在Linux中输入命令的界面就称为shell,支持如下功能:
1、命令补齐tab键
2、记录历史命令
3、通配符
4、快捷键
5、命令别名:alias 用法:alias 命令别名='具体的命令'  
alias ld='ll -h'

Bash shell:

Shell的版本:
shell脚本的版本,目前最常用的是:/bin/bash,也是linux默认的shell版本
cat /etc/shells:可查看系统中shell可用的版本

[root@localhost home]# echo $SHELL   //SHELL是一个变量,查看用户自己的默认shell
/bin/bash
[root@localhost home]# echo $0          //查看当前系统默认的shell
-bash

什么是shell脚本?

其实就是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令写在里面,搭配正则表达式、管道命令与数据流重定向等等功能,以达到我们想要的目的。
如果编写良好,shell脚本自身独立执行时也可以变为强大的命令行工具,甚至可以由其他脚本进一步利用。

#最简单的shell:
命令解释权#!
Bash shell脚本的第一行以【#!】开头,表示文件是可执行的shell脚本,如果不写【#!】那么就表示该文件不可被shell执行
【#!】后面跟上的路径名称是命令解释器,由于Bash shell脚本将由Bash shell解释,因此开头为:#! /bin/bash


变量的介绍:

变量:用来存储一个可变的值,通常用于大写来命名
预设变量PATH,定义了常用命令的绝对路径,因此我们可以直接输入命令
echo命令可以输出一些语句,也可以读取变量的值
$符号用来读取变量内容
变量分为两种:普通变量,环境变量

普通变量介绍:

普通变量:一般是大写,但亦可以小写,名字由字母、数字和_组成
例子:
NAME=hudechao   //定义变量
echo $NAME          //读取变量
unset NAME           //取消变量的定义

环境变量介绍:

环境变量:就是系统预定义的参数。在wins下也有。
在Linux中环境变量按照生存周期可以分为两大类:
1、临时的
2、永久的
临时的环境变量:使用export命令声明即可,变量在关闭shell时失效
语法: export变量名=值
export定义临时的环境变量,在切换shell的时候,临时的环境变量也会生效。

临时的环境变量介绍:export命令

[root@localhost shell-hudechao]# export ab=123
[root@localhost shell-hudechao]# echo $ab
123
[root@localhost shell-hudechao]# sh
sh-4.2# echo $ab
123   #可以看出,定义了临时变量ab,切换shell后,临时变量扔生效【如果是普通变量赋值,切换shell后会失效】

临时的环境变量介绍:su命令

su hudechao   //未关闭shell的切换用户,即环境变量还是原来用户的环境
su - hudechao  //关闭了shell的切换,加了-的切换才是真正的切换用户

永久的环境变量介绍

永久的:需要修改配置文件,变量才会永久生效。
永久的环境变量分为:全局和用户
定义全局变量的文件:/etc/bashrc和/etc/profile
定义用户变量的文件:~/.bashrc和~/.bash_profile

位置变量:

用数字表示的变量
$0表示脚本名称
$1表示第一个参数
$2表示第二个参数,以此类推,$3、$4
$?表示程序退出的代表(一般0代表执行成功,非0表示执行失败)
$*代表所有参数内容(有哪些参数)
$$代表当前进程的PID号码
$#代表当前shell的参数个数
$@代表所有参数内容(逐个读取)

转义字符:

转义字符有三种:\   ' '   " "
反斜杠\:可以消除紧跟在字符后面的单个字符的特殊含义
[root@localhost shell-hudechao]# echo \#123 \#123
#123 #123

单引号' ' :可以屏蔽一切特殊字符,但是双引号不会屏蔽$符号,其他都屏蔽
[root@localhost shell-hudechao]# echo '#123 #123 $B'
#123 #123 $B
[root@localhost shell-hudechao]# echo "#123 #123 $B"
#123 #123 99

case语句:

case $变量名 in
  变量名1)        #判断执行脚本时输入的参数和此变量名1的值
      echo语句
        ;;                #两个;;分号表示一个判断结束
  变量名2)
        echo语句
         ;;          #两个;;分号表示一个判断结束
    *)                #上面的判断都为false时
        echo语句
          ;;            #两个;;分号表示一个判断结束
esac               #esac表示case语句的结束


#!/bin/bash                                                             
case $1 in              #$1表示执行脚本时输入的第一参数获取到          
        1)                    #获取到参数值和1比较,如果相等就打印如下内容
        echo "input 2"                                                        
        ;;                                                                                
        2)                                                                               
         echo "input 1"                                                        
         ;;                                                                                
        *)                                                                               
          echo "./3.sh input 1 or 2"                                     
          ;;                                                                                
esac

#!/bin/bash                                                                         
echo "please input number (1-5)"                                                                                  
read num                                                                                                
echo "your input number is $num"                                                                                  
case $num in                                                                                  
            1)
                echo "one" i
            ;;
            2)                           
                echo "two"                        
            ;;                           
            3|4|5)
                echo "three to five"
            ;;
            *)
                echo "please input 1-5"
            ;;
esac

整数测试,数值比较【只适用数值】:

-eq等于
-ne不等于
-gt大于
-ge大于等于
-lt小于
-le小于等于

bash字符【即适用字符串,也适用整型】:

>大于
>小于
==等于

操作符,判断式[ ] 常用到:

-f测试其是否为普通文件,即ls -l时文件类型为-的文件                  
-d测试其是否为目录文件,即ls -l时文件类型为d的文件          
-e测试文件是否存在;存在为真,否则为假                                      
-r测试文件对当前用户来说是否可读                                                   
-w测试文件对当前用户来说是否可写                                            
-x测试文件对当前用户来说是否可执行                                             
-s测试文件大小是否为空,不空则真,空则假

逻辑操作符:

-a:与
-o:或
!  :非
&&与运算
| |或运算

单分支if语句:

if [条件]; then                            
    执行语句1
    执行语句2
    ...                                                                              
fi     #fi表示if语句的结束

双分支if语句:

if [条件]; then                                                    
    执行语句1
    执行语句2
    ...
else                                                                                               
    执行语句1
    执行语句2
fi                                                                                                                                                                           

多分支if语句:

if [条件1]; then     
    执行语句1
    执行语句2
    ...
elif [条件2]; then
    执行语句1
    执行语句2
    ...
elif [条件3]; then
    执行语句1
    执行语句2
    ...
else
    执行语句1
    执行语句2
    ...  
fi

if脚本运用

1、编写个脚本,测试系统中是否存在有/student/dir1目录,如果没有则创建:
#!/bin/bash
a="/student/dir1"
if [ ! -d "$a" ];then     #[ ]之间内容要带有空格,判断目录是否存在
    mkdir -p $a
fi

2、编写一个成绩小脚本,90-100显示优秀,70-80显示一般,其他不及格
#!/bin/bash
read -p "请输入你的成绩:" a          #-p 参数指定read命令一个参数,输入值写入变量a
if [ "$a" -ge 90 ] && [ "$a" -le 100 ];then
    echo "你的成绩优秀"
elif [ "$a" -ge 70 ] && [ "$a" -le 89 ];then
    echo "你的成绩一般"
else
    echo "你的成绩不及格"
fi

3、编写一个脚本,生成两个随机数,比较其大小;显示较大的数;bash有个内置变量:$RANDOM
#!/bin/bash
a=$RANDOM
b=$RANDOM
echo "a=$a"
echo "b=$b"
if [ $a -ge $b ];then
    echo "the max number is:$a"
else
    echo "the max number is:$b"
fi

4、编写一个脚本,判断一个随机数的奇偶性
#!/bin/bash
a=$RANDOM
echo "a=$a"
if [ $[ $a%2 ] -eq 0 ];then
    echo "It's偶数"
else
    echo "It's奇数"
fi

循环语句:

在生产环境下有大量需要重复运行的指令,这里shell给我们提供了for while until select 循环语句以实现指令的反复执行功能.
在所有循环语句中,变量必须要有初始值,每次运行命令都要进行条件过滤,只有满足条件才会运行命令,否则不执行.

1、for——shell风格:
for——shell风格
语法:
for变量 in {list}              
do                                 
    命令
done
例子:
#!/bin/bash                                    
for a in {1,2,3,4}
do
    echo $a
done

2、for——C语言风格:
语法:
for ((变量赋值;判断;算法  ))
do                                               
    命令
done
例子:
求1到10的和
#!/bin/bash                                           
sum=0
for (( i=0;i<=100;i++))   #第一个括号是C语言的表达式,在外面的括号是做的for循环while的用法和for一样,util则是条件为假时执行语句。
do
    sum=$((sum+i))   #第一个括号是做的运算,在外面的括号是用到$取值用i=0
done
echo $sum

3、while循环:
#!/bin/bash
while ((i<=100))
do
    sum=$((sum+i))
    i=$((i+1))
done
echo $sum
上一篇 下一篇

猜你喜欢

热点阅读