一、Shell脚本是利用shell的功能所写的一个程序(shell是一个解释性的语言,不需编译,直接执行)
#!/bin/bash
echo "hello world"
$取值
第一种执行方式:bush d6.sh
第二种执行方式:source d6.sh
第三种执行方式:chmod 0777 d6.sh 给最高权限的执行
./d6.sh
二、Shell脚本编写步骤
1.需求分析
2.命令测试
3.脚本编写
4.测试调优
三、Shell脚本变量
1.变量可以通过变量名访问。在指令式语言中,变量通常是可变的
2.变量用来存放系统和用户需要使用的特定参数
3.变量的命名规则:
(1)区分大小写;
(2)不能使用程序内的保留字和内置变量;
(3)只能使用数字、字母及下划线,且不能以数字开头;
(4)使用英文尽量使词义通俗易懂。
4.变量分类
(1)自定义变量:由用户自己定义、修改和使用
双引号:允许通过$符号引用其他变量值(弱引用,其中的变量引用会被替换为变量值)
单引号:进制引用其他变量值,$视为普通字符(强引用,其中的变量引用不会被替换为变量值,而保持源字符串)
反撇号:命令替换,提取命令执行后的输出结果,``和$(...)作用相同
#!/bin/bash
echo "hello world"
#array数组
a=(1 2 3 4 5)
#默认是一个数组元素的值
echo $a
#取所有数组元素
echo ${a[*]}
echo ${a[@]}
#取数组元素的个数
echo ${#a[*]}
echo ${#a[@]}
#取其中某一个元素
a[2]=9
echo ${a[2]}
#删除数组中的某一个元素
unset a[2]
echo ${a[*]}
#删除数组
unset a
(2)特殊变量
环境变量:由系统维护,用于设置工作环境;
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
export可以将变量指定为全局变量
只读变量:用于变量值不允许被修改的情况;最快方式重启
#!/bin/bash
#只读变量
readonly COUNT=3
位置变量:通过命令行给脚本程序传递参数;
#!/bin/bash
#位置变量
echo $0
echo $1
echo $2
echo $3
#传递参数的个数
echo $#
#打印所有传递的数据(打印的这些数据是分开的)
echo $@
#打印所有传递的数据(打印的数据看成一个整体)
echo $*
#上一条指令执行的结果
echo $?
#正在执行进程的ID号
echo $$
预定义变量:bash中内置的一类变量,不能直接修改。
四、Shell程序由零或多条shell语句构成。
shell语句包括三类:说明性语句、功能性语句、结构性语句。
1.说明性语句(注释行):以#开始到该行结束,不被解释执行
2.功能性语句(命令)
(1)read从标准输入读入一行, 并赋值给后面的变量,其语法为:
read var 把读入的数据全部赋给var。
read var1 var2 var3 把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量。
如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。
(2)算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如
#!/bin/bash
#-s 输入不回显
#-t 指定输入的时间
#-p 指定输入的提示字符串
#read -s -t 3 -p "please input two num: " val1 val2
read -p "please input two num: " val1 val2
#read val1
echo "val1 = $val1"
#read val2
echo "val2 = $val2"
#算术运算
temp=`expr $val1 + $val2`
echo $temp
temp=`expr $val1 - $val2`
echo $temp
temp=`expr $val1 \* $val2`
echo $temp
temp=`expr $val1 / $val2`
echo $temp
(3)test语句可测试三种对象:字符串 整数 文件属性
每种测试对象都有若干测试操作符
字符串测试(条件成立echo $?条件返回值为0,不成立返回1)
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
整数测试
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
文件测试
-e name 测试一个文件是否存在
-d name 测试name 是否为一个目录
-f name 测试name 是否为普通文件
-L name 测试name 是否为符号链接
-r name 测试name 文件是否存在且为可读
-w name 测试name 文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
-s name 测试name 文件是否存在且其长度不为0
f1 -nt f2 测试文件f1 是否比文件f2 更新
f1 -ot f2 测试文件f1 是否比文件f2 更旧
#!/bin/bash
#测试字符串
val1="hell"
val2="hello"
test "$val1" != "$val2"
#echo $?
val1="hi"
test -n "$val1"
#echo $?
#整数测试
val1=3
val2=5
#test $val1 -ne $val2
test $val1 -lt $val2
#echo $?
#测试文件
test -f read.sh
echo $?
3.结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:
条件测试语句(两路分支)
多路分支语句
循环语句
循环控制语句等