文章目录
一、Shell介绍
Shell 是一个用 C 语言编写的程序,它是一种命令行解释器,是用户使用 Linux 内核的桥梁。
- Shell脚本程序以#!/bin/bash开头,/bin/bash是Linux中默认的Shell解释器程序
- Shell语言不需要
";"
- 运行.sh文件需要有可执行权限,如果没有可执行权限,可以通过
# sh 脚本路径
的方式
二、简单输出
#!/bin/bash
echo "Hello World!"
三、变量
(一)变量的声明
NAME="zhang san"
DT=`date +'%F'`
DT2=$(date)
注意:
=
左右不能有空格!!!- 命名需规范,习惯使用大写,不能使用关键字和系统变量(
$PATH
,$USER
等)。 - 双引号字符串能识别转义字符“
\
”和变量,单引号字符串不能。 - 使用反引号“ ` ”或者“$( )”可以将指令执行结果赋值给变量
- 使用关键字
readonly
可以将变量声明为只读变量,也叫静态变量。
(二)变量的使用
在变量名前增加$
使用变量
#!/bin/bash
echo $NAME $DT
(三)变量的接收
使用read
关键字从命令行接收输入,语法:
read [选项] [变量]
选项:-p: 提示文字,-t: 等待时间
变量:指定读取值的变量名
read -p '请输入:' INPUT
echo "您输入的为:$INPUT"
(四)变量的删除
使用unset
关键字撤销变量
a=10
echo $A
unset A
注意:只读变量不能被unset
(五)设置环境变量
进入/etc/profile文件,使用export
关键字声明环境变量,并使用source命令使配置文件生效。
(六)位置参数变量
执行Shell脚本时传递参数,#./test.sh a b c
则“$0”表示Shell命令,“$1”=a,“$2”=b,
“$*”表示所有参数作为一个整体,“$#”表示位置参数个数3
(七)预定义变量
Shell设计者已经定义好的变量,如:
变量名 | 含义 |
---|---|
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
$? | 最后执行的命令的返回状态,0表示正确执行 |
四、运算符
(一)运算表达式
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,Shell语言有三种表达式形式,分别是:
\$[m+n]
、\$((m+n))
、expr m + n
- 表达式1:(推荐)
#!/bin/bash
RESULT=$[(1+2)*3]
echo $RESULT
- 表达式2:(注意小括号个数)
#!/bin/bash
RESULT=$(((1+2)*3))
echo $RESULT
- 表达式3:(expression)
#!/bin/bash
TEMP=`expr 1 + 2`
RESULT=`expr $TEMP \* 3`
echo $RESULT
注意:
- expr后面的参数间要有空格,否则报参数数目错误
- 乘法运算符要用转义字符
\*
- 反引号的使用
(二)算术表达式
常见的算术表达式有:
运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
= | 赋值 |
== | 相等。用于比较两个数字,相同则返回 true(真)。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 |
注意:==
等条件运算符左右要有空格
(三)关系表达式
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。常见的关系表达式有:
运算符 | 说明 |
---|---|
-eq | equal,检测两个数是否相等,相等返回 true。 |
-ne | not equal,检测两个数是否相等,不相等返回 true。 |
-gt | great than,检测左边的数是否大于右边的,如果是,则返回 true。 |
-lt | less than,检测左边的数是否小于右边的,如果是,则返回 true。 |
-ge | great than or equal,检测左边的数是否大于等于右边的,如果是,则返回 true。 |
-le | less than or equal,检测左边的数是否小于等于右边的,如果是,则返回 true。 |
(四)逻辑表达式
也就布尔表达式,Shell常用的逻辑表达式有:
运算符 | 说明 |
---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 |
(五)字符串运算符
运算符 | 说明 |
---|---|
= | 检测两个字符串是否相等,相等返回 true。 |
!= | 检测两个字符串是否相等,不相等返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 |
-n | 检测字符串长度是否为0,不为0返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 |
(六)文件测试运算符
操作符 | 说明 |
---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 |
-r file | 检测文件是否可读,如果是,则返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 |
五、流程控制
(一)if条件判断语句
语法:
if [ condition1 ]
then
command1
elif [ condition2 ]
then
command2
else
commandN
fi
注意:condition
左右要有空格!
(二)case语句
语法:
case $变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列
;;
esac
案例:判断字符
#!/bin/bash
read -p "press some key ,then press return :" KEY
case $KEY in
[a-z]|[A-Z])
echo "It's a letter."
;;
[0-9])
echo "It's a digit."
;;
*)
echo "It's function keys、Spacebar or other ksys."
esac
案例:判断系统
#!/bin/sh
SYSTEM=`uname -s`
case $SYSTEM in
Linux)
echo "My system is Linux"
echo "Do Linux stuff here..."
;;
FreeBSD)
echo "My system is FreeBSD"
echo "Do FreeBSD stuff here..."
;;
*)
echo "Unknown system : $SYSTEM"
echo "I don't what to do..."
;;
esac
(三)for循环
Shell的for循环有两种语法格式
语法1:
for 变量名 in 列表
do
循环体
done
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start…end} 如:{1…10}
(b) $(seq [start [step]] end) 如:$(seq 1 2 100)
表示1-100之间的所有奇数
(3) 返回列表的命令 $(COMMAND) 如:for i in `ls /etc`
(4) 使用glob,如:*.sh
(5) 变量引用;$@, $*
语法2:
for ((初始值;循环控制条件;变量变化))
do
循环体
done
(四)while循环
while [ 条件判断式 ]
do
循环体
done
六、函数
(一)basename和dirname函数
basename
函数
根据完整路径,得到文件名
例如:
basename /root/test.txt
# 输出:test.txt
basename /root/test.txt .txt
# 输出:test
dirname
函数
根据完整路径,得到目录
例如:
dirname /root/test.txt
# 输出:/root
注意:basename和dirname都是系统函数,可以直接在命令行使用。
(二)自定义函数
Shell的一个.sh文件可以理解为一个命令,函数也可以理解为是一个命令,Shell中自定义函数的语法为:
[ function ] funname [()]{
action;
[return int;]
}
声明和调用一个求和函数的实例:
#!/bin/bash
function getSum(){
SUM=$[$a + $b]
echo "和为: $SUM"
}
read -p "输入a:" a
read -p "输入b:" b
#调用函数
getSum $a $b
注意:
- Shell自定义函数可以不需要声明形参
- Shell是解释型语言,函数要先定义再调用
- 如果不加return,将以最后一条命令运行结果作为返回值。 return后跟数值n(0-255)