shell脚本的本质: shell脚本语言是解释型语言,是shell命令的有序集合 shell编程的基本过程(三步) step1. 建立shell文件(一般以.sh结尾),包含任意多行操作系统命令或shell命令的文本文件 step2. 赋予shell文件执行权限,用chmod命令修改权限 step3. 执行shell文件,直接在命令行上调用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
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 <
结构性语句: 结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程 主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句 条件语句: 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
循环语句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
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
上一篇:服务器防火墙状态怎么查看