一、计算机组成:
内核在中间位置,连接软件与硬件(雷纳斯开发)
内核功能:
内存(物理、虚拟(交换空间)内存);
软件管理(进程管理);
硬件管理
二、 shell 编程基础
命令行进入脚本的绝对路径或相对路径
●方式1 1)首先要chmod 744 helloworld.sh 改变权限(变绿为可执行文件) 2)执行脚本 ●方式2(bash/bash+脚本) 说明:不用赋予脚本+x权限,直接执行即可。
1 2 3 4 例:输出“hello world” # !/bin/bash echo "hello world"# 注意:echo 命令中想输出单引号用双引号包裹,双引号同理
三、shell的变量
系统变量
$HOME、$USER、$UID、$PWD等等
用户自定义变量
定义变量=值
1 2 3 4 5 6 7 8 9 10 例:系统变量与自定义变量的使用# !/bin/bash echo "当前用户信息:$USER" var=10 var1=$var echo "上一个值是:$var" echo "第二个值是:$var1"# shell命令中,在用户自定义命令时,切勿在等号两旁留空格
其他内容:
撤销命令 unset 变量名
设置静态变量 readonly(不能unset)
1 2 3 4 5 6 7 8 # !/bin/bash var=10 var1=$var readonly var2=3 unset var echo "第一个值是:$var" echo "第二个值是:$var1" echo "第三个值是:$var2"
四、 显示消息 1 2 3 4 5 # !/bin/bash A=`ls -la` echo $A B=$(ls -la) echo $B
五、设置环境变量
基本语法
export变量名=变量值(功能描述: 将shell变量输出为环境变量)
source配置文件(功能描述:让修改后的配置信息立即生效)..
echo $变量名(功能描述: 查询环境变量的值)
快速入门 1)在/etc/profile文件中定义TOMCAT HOME环境变量 2)查看环境变量TOMCAT_ HOME的值 3)在另外-一个shell程序中使用TOMCAT_ HOME 注意:在输出TOMCAT_ HOME环境变量前,需要让其生效 source /etc/profile
六、位置参数变量
介绍 当我们执行一个shelI脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参 数变量比如: ./myshell.sh 100200 ,这个就是一 个执行shell的命令行,可以在 myshell脚本中获取到参数信息
基本语法
$n (功能描述: n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的 参数,十以上的参数需要用大括号包含,如${10})1 2 3 4 5 6 7 8 9 10 # !/bin/bash echo $0 $1 $2# echo $* $@ $# pi@raspbian:~/bash$ bash test.sh 1 2 test.sh 1 2 pi@raspbian:~/bash$ bash test.sh 1 2 3 test.sh 1 2 pi@raspbian:~/bash$ bash test.sh 1 test.sh 1
$* (功能描述: 这个变量代表命令行中所有的参数,$’ 把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个量代表命令行中所有参数的个数) 位置参数变量 ●应用实例 案例:编写一个shel脚本positionPara.sh,在脚本中获取到命 令行的各个参数信息。
七、运算符
基本介绍 学习如何在shell中进行各种运算操作。
基本语法
i “$(运算式)” 或“$[运算式]” 2)expr m + n 注意:expr运算符间要有空格
expr m - n
expr \*,/, % (乘,除,取余)
应用实例. 案例1:计算(2+3) X4的值 案例2:请求出命令行的两个参数[整数]的和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # !/bin/bash expr 1 + 4 expr 1 \* 4 var1=10 var2=20 var3=$(expr $var1 + $var2) echo $var3 var4=$[20 + 20] echo $var4 var5=$[$var4 * 3] echo $var5 var6=$[$var1 * ($var3 + $var4)] echo var6# (2+3)*4 # error:expr 需分开做 # var7=$(expr (2 + 3) \* 4) # echo var7 var7=$(expr 2 + 3) var8=$(expr $var7 \* 4)
只支持整数级运算
1 2 3 # !/bin/bash var4=$(expr1.56 + 5.69) echo var4
bash中自带计算器,可使用bc 使用(quit退出)
1 2 3 4 5 6 7 # !/bin/bash # bc 计算器;管道传给bc ? echo "scale=4;3.777 / 5" | bc var1=$(echo "scale=4;3.777 / 5" | bc) var2=3 var3=$(echo "scale=4; $var1 *$var2" | bc) echo var3
八、判断语句
两个整数的比较 =字符串比较 -lt小于 -le小于等于 -eq等于 -gt大于 -ge大于等于 -ne不等于
按照文件权限进行判断-r有读的权限 -w有写的权限 -x有执行的权限
按照文件类型进行判断-f 文件存在并且是一个常规的文件 -e文件存在 -d文件存在并是一个目录
1 2 3 4 5 6 7 8 9 10 # !/bin/bash # 条件判断 [ qust ] echo $? #输出上一条指令判断结果 [ "qust" = "qust"] echo $? [ "qust" = "gmqust"] echo $?
九、流程控制
if-then
1 2 3 4 5 # !/bin/bash if [ "ok" = ok ] #[ commond ]即中括号内项与符号之间也要保留空格 then echo "相等" fi #表示if判断结束
1 2 3 4 5 # !/bin/bash if pwd then echo "相等" fi
1 2 3 4 5 6 7 8 9 10 # !/bin/bash # ❌ 没有相应命令 if dewedawa then echo "相等" fi pi@raspbian:~/bash$ bash test.sh 相等 test.sh: line 1: waasdad: command not found
1 2 3 4 # !/bin/bash if pwd;then echo "相等" fi
十、复习: 1.位置参数变量 $n(0-9) : $0表示其本身;10以上用大括号表示${10};$*;$#; 2.预定义变量 $$(进程号PID);$!(最后一个进程号);$? 3.运算符(不支持浮点数) expr m + (/ - \* \) n (注:空格); ${运算式} 4.条件判断 1 2 3 4 if command then commands fi
十一、if语句 example 01: if—else流程 1 2 3 4 5 6 7 8 9 10 11 example 01:if——else流程# !/bin/bash testuser=pi if grep $testuser /etc/passwd then echo "hello" echo "你好" echo "有这个用户" else echo "用户不存在" fi
example 02:流程控制(嵌套if) 1 2 3 4 5 6 7 8 9 10 11 12 example 02:流程控制(嵌套if) testuser=NoSuchUser if grep $testuser /etc/ passwd then echo "The user $testuser exists on this system. else echo "The user $testuser does not exist on this system. ” if ls -d /home/$testuser/ then echo "However, $testuser has a directory.' fi fi
example 03: if-elif
example 04: if [ condition ]条件判断 1.注意:中括号前后需保留空格 2.常见的应用
3.数值比较
1 2 3 4 5 6 7 8 9 10 11 example 0401:if[ condition ]# /bin/bash var1=5 var2=10 if [ var1 -le var2 ] then echo "var1小于等于var2" else echo "var1大于var2" fi
4.字符串比较
[ $m = $n ]
[ $m != $n ]
[ $m < $n ] (根据首字母顺序比较)
[ $m > $n ] (根据首字母顺序比较)
[ -n str1 ] (判断str1长度是否非零)
[ -z str1 ] (判断str1长度是否为零)
1 2 3 4 5 6 7 8 9 10 example 0402:字符串比较# !/bin/bash str1=pi str2=root if [ $str1 = $str2 ] then echo "相同" else echo "不相同" fi
1 2 3 4 5 6 7 8 9 example 0403:得到的结果永远都是sr1>str2,原因:>在此处是记录,会创建新文件# !/bin/bash str1=pi str2=root if [ $str1 > $str2 ] then echo"str1 大于 str2" else echo"str1 小于 str2"
5.文件比较
1 2 3 4 5 6 7 8 9 10 example 0404:文件比较# !/bin/bash dir 1=/hone/pi if[-e dir1] then echo“目录$dtr1存在 cd dir1 else echo "不存在" fi
1 2 3 4 5 6 7 8 # !/bin/bash dir1=t05.sh if [ t04.sh -nt Sdir1 ] then echo"t04 更新一些" else echo "t05 更新一些" ft
6.复合条件测试 [ condition1 ] &&[ condition2 ] [ condition1 ] II [ condition2 ] if-then的高级特性 使用双括号 (( expression ))
1 2 3 4 5 6 7 8 example 0405:复合条件测试# !/bin/bash val1=10 if (( $val1 ** 2 > 99 )) then (( $val2 = val1 ++ )) #使用"++"时注意不要加"$"符号 echo $val2 fl
example 05 : case命令 1 2 3 4 5 case variable in pattern1|pattern2)commands;; pattern3)commands2;; *)default commands;; esac
1 2 3 4 5 6 7 8 9 10 11 12 13 14 example 05:当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出 "other"# !/bin/bash var=$1 case $var in 1) echo "星期一" ;; 2) echo "星期二" ;; *)default echo "other" ;; esac
1 2 3 4 5 6 7 8 结果: pi@raspbian:~/bash$ . test.sh 2 星期二 pi@raspbian:~/bash$ . test.sh 1 星期一 pi@raspbian:~/bash$ . test.sh 7 bash: default: command not found other
1 2 3 4 5 6 7 8 9 example 06:请编写一个shell程序,如果输入的参数,大于等于60,则输出 "及格了",如果小于60,则输出 "不及格# !bin/bash grade=$1 if [ $grade -ge 60 ] then echo "及格了" else echo "不及格" fi
1 2 3 4 5 6 7 结果: pi@raspbian:~/bash$ . test.sh 60 及格了 pi@raspbian:~/bash$ . test.sh 80 及格了 pi@raspbian:~/bash$ . test.sh 59 不及格
十二、循环语句 1、for命令 1 2 3 4 for var in list do commands done
注:var若不修改,则在for循环执行后会保留列表中最后一个字符。
1 2 3 4 5 example 01:句子中包含',可通过转意和""处理操作 for var in I don\'t know if "this'll" work do echo $var done
1 2 3 4 5 example 02:默认以空格划分,可以通过""进行处理操作 for var in "a apple" "a orang" do echo $var done
1 2 3 4 5 6 example 03:读取变量 list="a apple ia on the desk" for var in $list do echo $var done
1 2 3 4 5 example 04:读取文档 for var in $(cat test01.txt) do echo $var done
1 2 3 4 5 6 example 05:IFS问题(内部字段分隔符:空格,制表符,换行符) IFS=$'\n' #修改指定分隔符 for var in $(cat test01.txt) do echo $var done
1 2 3 4 5 6 7 8 9 10 11 example 06:遍历查看某个路径下文件 for var in /home/pi/* do if [ -d $var ] then echo "$var是一个目录" elfi [ -f $var ] then echo "$var是一个文件" fi done
1 2 3 4 5 6 example 07:C语言的for命令-单变量 for ((i=1;i<=10;i++)) do echo $i done
1 2 3 4 5 6 example 08:C语言的for命令-多变量 (条件只能是一个!!) for((a=1,b=2;a<=10;a++,b++)) do echo [$a+$b] done
1 2 3 4 5 6 7 8 9 example 09:$@ 与 $*区别 for i in "$*" do echo "第一种*显示的:$i" done for j in "$@" do echo "第二种显示的:$j" done
1 2 3 4 5 6 结果: pi@raspbian:~/bash$ . test.sh 1 2 3 第一种*显示的:1 2 3 第二种显示的:1 第二种显示的:2 第二种显示的:3
十三、while循环
1 2 3 4 5 6 7 example 01:简单例子 var=10 while [ $var -gt 0 ] do echo $var var=$[ $var - 1 ] done
1 2 3 4 5 6 7 8 9 10 11 example 02:while的嵌套 var=10 while [ $var -gt 0 ] do for(( var2=1;$var<5;var2++ )) do echo "内层循环的值:$var2" done echo "外层循环的值:$var" var=$[ $var - 1 ] done
1 2 3 4 5 6 7 example 03:until(条件判断与while相反) var=100 until { $var -eq 0 } do echo $var var=$[ $var - 10 ] done
1 example 04:控制循环:break;continue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 example 05:用while循环实现从命令行输入一个数n,统计从 1+..+ n 的值是多少# !/bin/bash n=$1 sum=0 i=1 while [ $i -le $n ] do sum=$[ $i + $sum ] i=$[ $i + 1 ] done echo $i echo $sum 结果: pi@raspbian:~/bash$ . test.sh 100 101 5050
1 2 3 4 5 6 7 8 9 10 11 12 13 example 06:用for 实现从1加到100的结果,输出显示# !/bin/bash sum=0 for ((i=1;i<=100;i++)) do sum=$[ $i + $sum] done echo $sum 结果: pi@raspbian:~/bash$ . test1.sh 5050
十四、read读取控制台输入 基本语法 1 2 3 4 5 sample 01 简单例子# ! /bin/bash echo -n "Enter your nane:" read name echo $name
p:指定读取值时的提示符; 1 2 3 4 sample 02 -p 参数的应用# !/bin/bash read -p "请输入你的姓名:"name echo $name
1 2 3 4 5 6 sample 03 多参数输入# !/bin/bash read -p "请输入你的姓名年龄(空格分隔):"name age echo "用户的姓名是$name,用户的年龄是$age"# 若用户输入变量数目大于原有变量数目,则剩余输入值全部赋给最后一个个预定变量
1 2 3 4 sample 04 若不指定变量,则会存储在默认环境变量$REPLY中# !/bin/bash read -p "请输入你的姓名年龄(空格分隔):" echo $REPLY
t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等 1 2 3 4 5 sample 05 -t计时器应用# !/bin/bash read -t 5 -p "请输入你的姓名年龄(空格分隔):"name age echo "用户的姓名是$name,用户的年龄是$age"
1 2 3 4 5 6 7 8 sample 06 -t与if函数的结合应用# !/bin/bash if read -t 5-p "请输入你的姓名,年龄(空格分割) :" name age then echo "欢迎你: $name" else echo "对不起,您登陆超时" fi
1 2 3 4 5 6 7 8 9 10 11 sample 07 常见的case应用# !/bin/bash read -p "Do you want to continue?[Y/N]" answer case $answer in y | Y)echo echo "continue";; n | N)echo echo "ok byebye" exit;; esac echo "end……"
-s选项可以避免在read命令中输入的数据出现在显示器上 1 2 3 4 5 sample 08 -s选项可以避免在read命令中输入的数据出现在显示器上# !/bin/bash read -s -p "请输入你的密码:"passwd echo echo "你的密码是:"$passwd
读取文件 1 2 3 4 5 6 7 8 9 sample 09 读取文件# !/bin/bash count=1 cat 1og.200527 | while read line do echo "line $count :$line" count=$[ $count + 1] done echo "end....."
十五、函数 1.系统函数:driname basename
dirname基本语法 功能:返回完整路径最后的前面的部分,常用于返回路径部分
dirname文件绝对路径(功能描述: 从给定的包含绝对路径的文件名中去除文件名(非然后返回剩下的路径(目录的部分) )1 2 3 4 5 sample : 终端 pi@raspbian:~$ dirname bash/test1.sh bash pi@raspbian:~$ basename bash/test1.sh test1.sh
2.函数自定义函数 1 2 3 4 5 6 7 8 9 ●基本语法 [ function ]funname{ Action; [return int;] } 或 name(){ commands }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sample 01 函数基本调用简单例子# !/bin/bash function func1{ echo "这是函数1" } count=1 while [ $count -le 5 ] do func1 count=$[ $count +1 ] done echo "结束循环" func1 echo "结束循环"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sample 02 error# !/bin/bash function func1 { echo“这是函数1” } count=l whtle [ $count -le 5 ] do func1 count=$[ Scount + 1 ] done echo "结束循环" func2 function func2 { echo "这是函数2" } echo "结束脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sample 03 函数覆盖# !/bin/bash function func1 { echo“这是函数1” } count=l whtle [ $count -le 5 ] do func1 count=$[ Scount + 1 ] done echo“结束循环" function func1 { echo "这是函数2" } func1 echo "结束脚本
十六、函数 1.返回值 bash shell会把函数当作一个小型脚本,运行结束时会返回一个退出状态码。bash shell使用return命令来退出函数并返回特定的退出状态码。
⚠函数结束后需要立刻取回返回值⚠
1 2 3 4 5 6 7 8 9 10 sample 01# !/bin/bash func1(){ echo "尝试显示不存在的文件" 1s -1 badfile } echo "调用函数" func1 echo "函数的状态码$?"
⚠状态码的范围0-255⚠
1 2 3 4 5 6 7 8 9 10 11 sample 02 加十器(大于255就会报错)# !/bin/bash func1(){ read -p "请输入一个数字:" value echo "正在进行加十运算:" return $[ $value + 10 ] } echo "调用函数" func1 echo "运算之后的值:$?"
使用函数输出
1 2 3 4 5 6 7 8 9 10 sample 03 函数输出# !/bin/bash func1(){ read -p "请输入一个数字:" value echo "正在进行加十运算:" } echo "调用函数" result=$(func1) echo "今天天气很好" echo "运算之后的结果:$result"
2.函数中的变量 在函数中使用变量,向函数传递参数
1 2 3 4 5 6 7 sample 04 通过位置传参# !/bin/bash func1(){ echo $[ $1 + $2 ] } result=$(func1 100 200) echo $result
在函数中处理变量
脚本任何地方定义的变量都是全局变量
1 2 3 4 5 6 7 8 sample 05# !/bin/bash func1(){ value=$[ $val + 2 ] } read -p "输入一个数字:" val func1 echo $value
06 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sample 06 全局变量的弊端:比大小 #!/bin/bash func1(){ temp=$[ $value + 5] result=$[ $temp * 2 ] } temp=4 value=6 func1 echo "函数结果$result" if [ $temp -gt $value ] then echo "temp larger" else echo "value larger" fi
局部变量 local关键字声明的变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sample 07 局部变量# !/bin/bash func1(){ local temp=$[ $value + 5] result=$[ $temp * 2 ] } temp=4 value=6 func1 echo "函数结果$result" if [ $temp -gt $value ] then echo "temp larger" else echo "value larger" fi
3、数组 1 2 3 4 sample 08 简单数组输出# !/bin/bash array=(1 2 3 4) echo ${array[*]}
1 2 3 4 5 6 7 8 sample 09 数组的读入# !/bin/bash func1(){ temparray=$@ echo "数组的值为:$temparray" } array=(1 2 3 4) func1 ${array[*]}
1 2 3 4 5 6 7 8 sample 10 数组的输出# !/bin/bash func1(){ array=(1 2 3 4 5 6) echo ${array[*]} } result=$(func1) echo $result
4.函数的递归 1 2 3 4 5 6 7 8 9 10 11 12 13 # !/bin/bash func1(){ if [ $1 -eq 1 ] then echo 1 else local temp=$[ $1 - 1 ] local result=$(func1 $temp) echo $[$result * $1] } read -p "请输入一个数字:" value result=$(func1 $value) echo $result
十七、创建一个菜单 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # !/bin/bash func1(){ df -hl } func2(){ lastlog -b 60 } func3(){ pstree } clear echo -e "\t1. Display disk space" echo -e "\t2. Display logged information" echo -e "\t3. Display pstree" echo -e "\t0. exit program" read -n 1 -p "请输入您的选项:" option case $option in 0) break;; 1) func1;; 2) func2;; 3) func3;; esac
参考