Day3-shell脚本编程

1. shell脚本-变量

1.1 shell脚本的介绍
shell脚本的本质:
    shell脚本语言是解释型语言,是shell命令的有序集合
    
shell编程的基本过程(三步)
    step1. 建立shell文件(一般以.sh结尾),包含任意多行操作系统命令或shell命令的文本文件
    step2. 赋予shell文件执行权限,用chmod命令修改权限
    step3. 执行shell文件,直接在命令行上调用shell程序
1.2 shell脚本的变量
shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符
    变量名 = 变量值
Bourne Shell有以下四种变量:
    用户自定义变量
    位置变量即命令行参数
    预定义变量
    环境变量
    
用户自定义变量:
    在shell编程中通常使用全大写变量,方便识别
    - $ COUNT=1
    变量的调用:在变量前加$
    - $ echo $HOME
    使用unset命令删除变量的赋值
    
位置变量:
    $0 与键入的命令行一样,包含脚本文件名
    $1,$2,....$9  分别包含第一个到第九个命令行参数
    $# 包含命令行参数的个数
    $@ 包含所有命令行参数
    $? 包含前一个命令的退出状态
    $* 包含所有命令行参数
    $$ 包含正在执行进程的ID号
    
环境变量:
    HMOE: /etc/passwd文件中列出的用户主目录
    PATH: shell搜索路径
#测试案例
linux@ubuntu:~/Linux_c/day03$ count=1
linux@ubuntu:~/Linux_c/day03$ echo $count
1
linux@ubuntu:~/Linux_c/day03$ count=10.5
linux@ubuntu:~/Linux_c/day03$ echo $count
10.5
linux@ubuntu:~/Linux_c/day03$ count=abcd
linux@ubuntu:~/Linux_c/day03$ echo $count
abcd
​
linux@ubuntu:~/Linux_c/day03$ Z=hello
linux@ubuntu:~/Linux_c/day03$ echo $Z
hello
linux@ubuntu:~/Linux_c/day03$ unset Z
linux@ubuntu:~/Linux_c/day03$ echo $Z

2. shell脚本-功能语句

shell程序由零或多条shell语句构成。shell语句包括三类:说明性语句、功能性语句和结构性语句。
说明性语句:
    以#号开始到该行结束,不被解释执行
功能性语句:
    任意的shell命令、用户程序或其他shell程序
结构性语句:
    条件测试语句、多路分支语句、循环语句、循环控制语句等
    
常用功能性语句(命令):
    read从标准输入读入一行,并赋值给后面的变量,语法为:
        read var    #把读入数据全部赋值给var
    expr命令
        算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、除(/)和求模(%)
    test命令
        test语句测试三种对象:
            字符串  整数 文件属性
        每种测试对象都有若干测试操作符,例如:
            .test "$answer" = "yes"
            变量answer的值是否为字符串yes
            test $num -eq 18
            变量num的值是否为整数18
            test -d tmp
            测试tmp是否为一个目录名
        字符串测试:
            =       测试俩个字符串的内容是否完全一样(等于为0,不等为1)
            !=      测试俩个字符串的内容是否有差异
            -z s1   测试s1字符串的长度是否为0
            -n s1   测试s1字符串的长度是否不为0
            整数测试:
            -eq     =
            -ne     !=
            -gt     >
            -ge     >=
            -lt     <
            -le     <=
        文件属性测试:
            -d name  是否为一个目录
            -e name  是否存在
            -f name  是否为普通文件
            -L name  是否为符号链接
            -r name  是否存在且为可读
            -w name  是否存在且为可写
            -x name  是否存在且为可执行
            -s name  是否存在且其长度不为0
            f1 -nt f2  文件f1是否比文件f2更新
            f1 -ot f2  文件f1是否比文件f2更旧
linux@ubuntu:~/Linux_c/day03$ vi demo4.sh
​
#!/bin/bash 
​
echo "input year mouth day:"
read Y M D
echo "Today is $Y-$M-$D"
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo4.sh
linux@ubuntu:~/Linux_c/day03$ ./demo4.sh
input year mouth day:
2020
Today is 2020--
linux@ubuntu:~/Linux_c/day03$ ./demo4.sh
input year mouth day:
2010 10
Today is 2010-10-
linux@ubuntu:~/Linux_c/day03$ ./demo4.sh
input year mouth day:
2024 8 2 9 53
Today is 2024-8-2 9 53
linux@ubuntu:~/Linux_c/day03$ vi demo5.sh
​
#!/bin/bash 
​
A=`expr 3 + 5 \* 4`     #置换符不可缺省,expr是一个命令,中间空格不能少
echo $A
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo5.sh
linux@ubuntu:~/Linux_c/day03$ ./demo5.sh
23
​
#字符测试
linux@ubuntu:~/Linux_c/day03$ vi demo6.sh
​
#!/bin/bash 
​
A="how"
B="how"
​
test $A = $B
echo $?
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo6.sh
linux@ubuntu:~/Linux_c/day03$ ./demo6.sh
0
​
#整数测试
linux@ubuntu:~/Linux_c/day03$ vi demo7.sh
​
#!/bin/bash 
​
A=99
B=90
​
test $A -ne $B
echo $?
​
test $A -gt $B
echo $?
​
test $A -lt $B
echo $?
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo7.sh
linux@ubuntu:~/Linux_c/day03$ ./demo7.sh
0          #ne !=
0          #gt  >
1          #lt  <

3. shell脚本-分支语句

结构性语句:
    结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程
    主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句
    
条件语句:
    if...then...fi
语法结构:
    if  表达式
        then 命令表
    fi
    -如果表达式为真,则执行命令表中的命令;否则退出if语句,即执行fi后面的语句
    -if和fi是条件语句的语句括号,必须成对使用;
    -命令表中的命令可以是一条,也可以是若干条
    
    if...then...else..fi
语法结构:
    if   表达式
    then 命令表达式1
    else 命令表2
    fi
    
    case...esac
语法结构:
    case 字符串变量 in
        模式1)
            命令表1
            ;;
        模式2 | 模式3)
            命令表2
            ;;
        ...
        模式n)
            命令表n
            ;;
    esac
linux@ubuntu:~/Linux_c/day03$ vi demo8.c
​
#!/bin/bash 
​
if [ $# -ne 1 ]
then
    echo "usage:$0 filename"
    exit
fi
​
if ! [ -e $1 ]
then 
    echo "$1 not exist"
    exit
fi
​
if [ -L $1 ]
then
    echo "l"
elif [ -d $1 ]
then
    echo "d"
elif [ -f $1 ]
then
    echo "-"
elif [ -b $1 ]
else
    echo "csp"
fi
​


linux@ubuntu:~/Linux_c/day03$ chmod u+x demo8.sh
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh ./link1
./link1 not exist
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /dev/ram4
b
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh demo1.sh
-
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /etc
d
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /dev/tty
csp
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /home/linux1
/home/linux1 not exist
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /home/linux
d
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh
usage:./demo8.sh filename
linux@ubuntu:~/Linux_c/day03$ touch demo9.sh
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo9.sh
linux@ubuntu:~/Linux_c/day03$ vi demo9.sh
​
#!/bin/bash 
​
echo -n "please choose (yes|no)?"
read R
​
case $R in
    yes)
        echo "yes"
        ;;
    y)
        echo "yes2"
        ;;
    no)
        echo "no"
        ;;
    *)
        echo "wrong"
        #;;
​
esac
​
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?yes
yes
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?y
yes2
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?no
no
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?n
wrong
 

4. shell脚本-循环语句

循环语句for
    当循环次数已知或确定,使用for循环语句来多次执行一条或一组命令。循环体由语句括号do和done来限定。格式为:
    for 变量名 in 单词表
        do
            命令表
        done
    变量依次取单词中的各个单词,每取一次单词,就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条,也可以是由分号或换行符分开的多条
    如果单词表是命令行上的所有位置参数时,可以在单词表部分
    
循环语句while
    语法结构:
        while 命令或表达式
            do
                命令表
            done
            
循环控制语句 break和continue
    break n 则跳出n层
    continue语句转到最近一层循环语句的下一轮循环上
    continue n则转到最近n层循环语句的下一轮循环上
vi demo10.sh
 chmod u+x demo10.sh
​
#!/bin/bash 
​
#for I in 1 3 5 7 9
for I in `seq 1  100`
do 
    SUM=`expr $SUM + $I`
done
echo $SUM
​
for ((I = 1; I <= 10 ; I++))
do
    echo "I=$I"
done
​
linux@ubuntu:~/Linux_c/day03$ ./demo10.sh
5050
I=1
I=2
I=3
I=4
I=5
I=6
I=7
I=8
I=9
I=10
linux@ubuntu:~/Linux_c/day03$ cp demo10.sh demo11.sh
linux@ubuntu:~/Linux_c/day03$ vi demo11.sh
​
#!/bin/bash 
​
I=0
​
while [ $I -lt 5 ]
do
    I=`expr $I + 1`
    echo -n "input score:"
    read S
​
    case `expr $S / 10` in
        10|9)
            echo "A"
            ;;
        6|7|8)
            echo "B"
            ;;
        *)
            echo "C"
            ;;
    esac
    echo "$I"
done
​
linux@ubuntu:~/Linux_c/day03$ ./demo11.sh
input score:100
A
1
input score:87
B
2
input score:6
C
3
input score:72
B
4
input score:83
B
5
linux@ubuntu:~/Linux_c/day03$ touch demo12.sh
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo12.sh
linux@ubuntu:~/Linux_c/day03$ vi demo12.sh
​
#!/bin/bash 
​
I=1
while [ $I -lt 5 ]
do 
    J=1
    while [ $J -lt 5 ]
    do
        J=`expr $J + 1`
        if [ $J -gt 3 ]
        then
            break 2
        fi
        echo "$I-$J"
    done
    I=`expr $I + 1`
done
​
linux@ubuntu:~/Linux_c/day03$ ./demo12.sh
1-2
1-3

5. shell脚本-函数

shell函数调用格式:
    方式1:
        value_name=`function_name [arg1 arg2 ...]`
    方式2:
        function_name [arg1 arg2 ...]
        echo $?
        
函数变量作用域
    全局作用域:在脚本的其他任何地方都能访问该变量
    局部作用域:只能在声明变量的作用域内访问
    声明局部变量的格式:
        Local 变量名 =值
linux@ubuntu:~/Linux_c/day03$ vi demo13.sh
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo13.sh
linux@ubuntu:~/Linux_c/day03$ ./demo13.sh
input username:linux
1
linux exist
linux@ubuntu:~/Linux_c/day03$ ./demo13.sh
input username:mm
0
mm not exist

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值