shell脚本是一种shell编写的脚本程序,将一些命令写入到文件中,然后用shell解析执行。
1、执行方式
1、chmod +x test.sh
./test.sh #test.sh是创建的脚本文件(以.sh为后缀),可以用touch命令创建,也可直接vi创建
2、bash test.sh
3、source test.sh
区别:第一种执行方法需要赋予文件可执行权限,bash和source不需要执行权限即可运行。bash和 ./ 是在子终端运行后将结果显示在当前终端,source是直接在当前终端运行。
2、shell变量
shell有3种类型的变量,分别为位置变量、环境变量和用户自定义变量。
用户自定义变量
shell脚本中,所有变量都是字符串,且不需要声明(不支持数据类型)。
shell定义变量时不需要规定数据类型,变量名不加美元符号,变量名和等号之间不能有空格。使用一个定义过的变量,要在变量名前面加美元($)符号或使用 ${变量名}。
#!/bin/bash
num=12
ch=a
echo "$num"
echo "${a}" #{}里变量两边不能有空格
#! :用来声明脚本由什么shell解释,否则使用默认shell
位置变量
位置变量是预先就设置好具有特殊含义的变量,可以直接使用。常用的位置变量有:
$0 | 文件名,也就是脚本文件名 |
$n | 第n个参数 |
$# | 输入参数的个数 |
$@ | 所有参数的内容 |
$$ | 当前进程号 |
$? | 程序执行返回的状态。成功为0,失败为1 |
$* | 所有参数的内 |
#!/bin/bash
echo "脚本名:$0"
echo "第一、二个参数:$1,$2"
echo "参数个数:$#"
echo "所有参数:$*"
echo "返回值:$?"
echo "进程号PID:$$"
echo "所有参数:$@"
环境变量
环境变量保存一些路径信息。
PATH | 可执行程序或命令的路径,以冒号分割 |
HOME | 打印用户家目录 |
SHELL | 显示当前shell类型 |
PWD | 显示用户当前所在位置的绝对路径 |
UID | 打印当前用户id信息 |
USER | 打印当前用户名 |
#!/bin/bash
echo "home:$HOME"
echo "path:$PATH"
echo "uid:$UID"
echo "user:$USER"
echo "pwd:$PWD"
echo "shell:$SHELL"
特殊符号
" " 双引号可以解析变量的值。双引号内部使用变量,可以正常输出。
' ' 单引号不能解析变量的值,单引号里无论什么内容都会作为字符串输出
` ` 反引号是命令置换符。将` `里的命令实现的内容赋给变量
\ :转义字符,使用echo输出要加参数 -e 才能实现转义
#!/bin/bash
num=100
echo "num is $num"
echo 'num is $num'
ls
ch=`ls` #将ls命令实现的内容赋给变量ch
echo "显示当前目录下的文件:$ch"
echo "num = $num\n"
echo -e "num = $num\n" #因为echo本身自带换行效果,所以num=100后会空一行
printf "num=%d" $num #printf的使用与C语言中类似
3、流程控制语句
测试语句
1、test 测试语句
2、[ 测试语句 ] #测试语句的前后都要有空格。
测试语句的结果为真返回0,为假返回1
-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
-a 与 &&
-o 或 ||
! 非
算数运算
1、(( 表达式 )):要使用(( 表达式 ))的结果,需要在最前面加$符号。使用变量时可加$,也可不加$,运算符之间可加空格,也可没有。
2、$[ 表达式 ]:必须用变量接收结果,例 ret=$[a+b],使用变量时可加$,也可不加$,运算符之间可加空格,也可没有。
3、let:let要写在最开始,$可加可不加,运算符之间不能有空格
4、expr:本身就有输出功能;运算符前后必须有空格(做运算使用);使用变量必须加$
完整的表达式要被 ` `(反引号)包含,例:val=`expr 2 + 2`
进行乘法运算要用转义字符,不加会认为是通配符 /*
小括号要使用转义字符,不加会认为是数组 /( /)
尖括号要使用转义字符,不加会认为是重定向符 /< />
结构语句
if
if条件语句:if开头,fi结尾。else或elif进行多条件判断,若要写在一行,需用“;”隔开,else后不跟测试语句。
# 单分支语句
if 测试语句
then
语句1
fi
# 多支条件语句
if 测试语句1
then
语句1
elif 测试语句2
then
语句2
else
语句2
fi
#比较两个数的大小
#!/bin/bash
read -p "输入a的值:" a #read是输入命令,read -p:显示提示内容
read -p "输入b的值:" b
if [ $a -gt $b ] #比较符两侧一定要有空格
then
echo $a
else
echo $b
fi
case
case语句:case中的模式匹配是比较字符串是否相同;每个模式必须以右括号结束,命令结尾以双分号结束。
case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
*) -->其他情况
命令
;;
esac
#给成绩评级,[90-100]为A,[80-90)为B,[60-80)为C,[0-60)为D
#!/bin/bash
read -p "输入num的值:" num
case $num in
9[0-9]|100) # | 是或者的意思
echo "A"
;;
8[0-9])
echo "B"
;;
6[0-9]|7[0-9])
echo "C"
;;
[1-5][0-9]|[0-9])
echo "D"
;;
*)
echo "num error"
;;
esac
for
for 变量名 in 取值列表
do
语句 1
done
#计算0-100的偶数和
#!/bin/bash
sum=0
for i in {0..100}
do
if [ $((i%2)) -eq 0 ]
then
sum=$(($sum + $i))
fi
i=$(( i+1 ))
done
echo $sum
while
while 测试语句
do
语句1
done
#计算1-10的乘积
#!/bin/bash
n=1
sum=1
while [ $n -le 10 ]
do
sum=$((sum*n))
let n=n+1
done
echo "sum=$sum"