-
以
#!/bin/bash
开头:指定解析器 -
以
.sh
作为shell脚本文件后缀
test0.sh
#!/bin/bash
echo "hello world"
- 执行脚本:
% sh test0.sh # 通过sh解析器执行脚本,所以脚本本身不需要执行权限
hello world
% ./test0.sh # 脚本自己执行,所以需要执行权限
hello world
1. 变量
1.1 常用系统变量
- $HOME:家目录
- $PWD:当前目录
- $SHELL:默认shell解析器
- $USER:当前用户
1.2 自定义变量:
变量=值:注意等号两边不能有空格!!
% A=1
% echo $A
% 1
撤销变量
% unset A
静态变量:不能unset撤销变量,不能修改B的值
% readonly B=3
- 变量默认都是字符串类型,无法直接进行数值运算
- 变量的值如果有空格要用双引号或单引号包裹起来
% A=1+1
% echo $A
1+1
% A="a b"
% echo $A
a b
1.3 特殊变量$n
n为参数,$0代表该脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 如 9代表第一到第九个参数,十以上的参数需要用大括号包含如 9代表第一到第九个参数,十以上的参数需要用大括号包含如{10}
#!/bin/bash
echo $0 $1 $2 $3
% ./test0.sh wu di 123
./test0.sh wu di 123
1.4 特殊变量$#
获取所有输入参数个数(不包括脚本名),常用于循环
#!/bin/bash
echo $#
% ./test0.sh wu di 123
3
1.5 特殊变量 $* / $@
把所有参数看成一个整体(不包括脚本名)
#!/bin/bash
echo $*
echo $@
% ./test0.sh wu di
wu di
wu di
1.6 特殊变量 $?
返回上一条执行的命令返回状态,如果$?值为0则上一条命令正确执行。如果非0(具体哪个数由命令自己决定)则证明上一个命令执行不正确
% ls
% echo $?
0
2. 运算符
-
$((运算式))
% echo $((3+4)) 7
-
$[运算式] 推荐
% echo $[3+4] 7 % echo $[(2+3)*4] # (2+3)*4 20
-
expr 注意:运算符有:+加,-减,\*乘,/除,%余。运算符之间必须要有空格
% expr 3 \* 4 12 % expr `expr 2 + 3` \* 4 # (2+3)*4 20
3. 条件判断
**[ condition ]**注意condition前后要有空格
条件非空即为true,如[ wudi ]返回true,[]返回false
% [ wudi ]
% echo $?
0 # 说明上一条指令正确,即[]返回true
% []
zsh: no matches found: []
% echo $?
1 # 说明上一条指令不正确,即[]返回false
3.1 常用判断条件
-
两个整数之间比较:
=字符串比较
-lt 小于 less than
-le小于等于 less equal
-eq等于 equal
-gt大于 greater than
-ge大于等于 greater equal
-ne不等于 not equal
% [ 1 -lt 2 ] # 1<2 % echo $? 0 # 正确
-
按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
% [ -r test0.sh ] # 判断test0.sh是否有读权限 % echo $? 0 # 正确
-
按照文件类型进行判断
-f 文件存在且是常规文件
-e 文件存在
-d 文件存在并是一个目录
% [ -d test0.sh ] # 判断test.sh是否是一个目录 % echo $? 1 # 错误
3.2 多条判断语句:&& ||
% [ 3 -lt 4 ] && [ 6 -gt 3 ] # 3<4 && 6>3
% echo $?
0 # 正确
% [ 3 -lt 4 ] && [ 6 -gt 7 ] # 3<4 && 6>7
% echo $?
1 # 错误
% [ 3 -lt 4 ] || [ 6 -gt 7 ] # 3<4 || 6>7
% echo $?
0 # 正确
4. 流程控制
4.1 if判断
- [ 条件判断式 ]中括号和条件判断式中间必须有空格
- if后面要有空格
if [ 条件判断式 ]
then
程序
fi
例子:输入1打印wu,输入2打印d
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "wu"
elif [ $1 -eq 2 ]
then
echo "di"
fi
运行结果
% ./test0.sh 1
wu
% ./test0.sh 2
di
4.2 case语句
#!/bin/bash
case $1 in
1) # 如果变量值等于1,执行下面语句
echo "当参数是1时"
;;
2) # 如果变量值等于2,执行下面语句
echo "当参数是2时"
;;
*) # 如果变量值不等于以上值,执行下面语句
echo "默认"
;;
esac # case倒着写
运行结果
% ./test0.sh 1
当参数是1时
% ./test0.sh 2
当参数是2时
% ./test0.sh 3
默认
4.3 for语句
基本语法1
for((初始值;循环控制条件;变量变化))
do
程序
done
例子:1加到100
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
基本语法2
for 变量 in 值1 值2 值3 ...
do
程序
done
例子:打印所有输入参数
#!/bin/bash
for i in $*
do
echo "输入了 $i"
done
4.4 while语句
- [ 条件判断式 ]中括号和条件判断式中间必须有空格
- While后面要有空格
while [ 条件判断式 ]
do
程序
done
例子:从1加到100
#!/bin/bash
s=0
n=0
while [ $n -le 100 ]
do
s=$[$s+$n]
n=$[$n+1]
done
echo $s
5. read读取控制台输入
read(选项)(参数)
选项:
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒)
参数:
- 变量:指定读取值的变量名(读取到的内容极为该变量的值)
例子:提示3秒内,读取控制台输入的名称
#!/bin/bash
read -p "请在3秒内输入" -t 3 NAME
echo $NAME
6. 函数
6.1 系统函数(可以直接调用)
-
basename函数:从给定的文件路径中返回文件名
% basename ~/Desktop/notes/tests/shelltest/test0.sh test0.sh % basename ~/Desktop/notes/tests/shelltest/test0.sh .sh # 并删除.sh后缀 test0
-
diename函数:从给定的文件路径中返回路径部分
% dirname ~/Desktop/notes/tests/shelltest/test0.sh /Users/wudi/Desktop/notes/tests/shelltest
6.2 自定义函数
[ function ] funname[()]
{
程序
[return int;]
}
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行的
- 函数返回值,只能通过$?系统变量获得。可以显式通过return返回(return后跟数值n(0-255))。如果不加,则以最后一条命令运行结果作为返回值。
例子:计算两个数字和
#!/bin/bash
function sum()
{
s=0
s=$[$1+$2] # 注意这里指的是函数参数
return $s
}
read -p "输入第一个参数:" P1
read -p "输入第二个参数:" P2
sum $P1 $P2 # 调用函数
echo "the answer is $?"
运行结果
% ./test0.sh
输入第一个参数:3
输入第二个参数:5
the answer is 8