Day3-shell脚本编程
创始人
2024-11-14 18:04:55
0

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

相关内容

热门资讯

秒懂教程!创建拼三张链接房间房... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
1分秒分析”海草众厅房卡充值“... 1分秒分析”海草众厅房卡充值“先锋大厅房间卡怎么购买 微信牛牛房卡客服微信号微信游戏中心打开微信,添...
秒懂教程!微信链接炸金花房卡怎... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
秒懂普及”良友大厅获取房卡教程... 秒懂普及”良友大厅获取房卡教程“牛牛房卡哪里有卖 微信牛牛房卡客服微信号微信游戏中心打开微信,添加客...
秒懂教程!微信链接拼三张房卡怎... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
玩家攻略”微友约局如何购买房卡... 玩家攻略”微友约局如何购买房卡“人海大厅房卡充值微信房卡充值 添加房卡批售商:微【113857776...
秒懂教程!微信里面炸金花房卡哪... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
1分秒分析”星云大厅获取房卡教... 1分秒分析”星云大厅获取房卡教程“王者大厅房间卡怎么购买 微信牛牛房卡客服微信号微信游戏中心打开微信...
实测分享”荣耀乐娱是如何购买的... 实测分享”荣耀乐娱是如何购买的“王者大厅房间卡怎么购买游戏中心打开微信,添加客服【113857776...
秒懂教程!拼三张房卡如何购买,... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
1分秒分析”王者互娱获取房卡教... 来教大家如何使用获取房卡教程房卡充值 添加房卡批售商:微【113857775】复制到微信搜索、直接添...
秒懂教程!微信怎么开炸金花房间... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
玩家攻略”老夫子互娱哪里买低价... 玩家攻略”老夫子互娱哪里买低价获取“先锋大厅房间卡怎么购买游戏中心打开微信,添加客服【1138577...
秒懂教程!微信群拼三张房间卡怎... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂普及”神盾大新房卡购买“牛... 秒懂普及”神盾大新房卡购买“牛牛房卡批发平台微信房卡充值 添加房卡批售商:微【113857776】复...
秒懂教程!正版玩牛牛购买房卡,... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
实测分享”新竹大厅哪里有详细房... 哪里有详细房卡介绍是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:113857776许多玩家在游戏中...
玩家攻略”热玩吧房卡领取码“炸... 玩家攻略”热玩吧房卡领取码“炸金花房间卡怎么购买游戏中心打开微信,添加客服【113857776】,进...
秒懂教程!微信玩链接拼三张房卡... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
一分钟实测分享”辣椒互娱房卡在... 来教大家如何使用房卡在哪里买房卡充值 添加房卡批售商:微【113857775】复制到微信搜索、直接添...