什么是Shell,能做什么?
Shell变量
Shell运算
Shell条件判断,以及循环
Shell函数
Shell测试
一、Shell能做什么
二、Shell变量
分:局部变量、环境变量
2.1 【声明变量】
2.1.1、变量名只能是:字母、下划线、数字,首字符不能为数字;
2.1.2、不能有空格,可用下划线代替;
2.1.3、不能有标点符号;
2.1.4、不能是bash关键字;
2.1.5、命名时,等号两边不能有空格;
【Shell系统变量】
符号 | 含义 |
---|---|
$0 | 当前程序名称 |
$n | 当前程序的第n个参数 ,n=1,2,3…9 |
$* | 当前程序的所有参数(不包括程序本身) |
$# | 当前程序的参数个数(不包括程序本身) |
$? | 命令或程序执行完后的状态,一般返回0表示执行成功 |
$UID | 当前用户的ID |
$PWD | 当前所在目录 |
【只读变量】
1、readonly 变量名 可以讲变量设置为只读变量,只读变量不能被修改、删除(unset)
【删除变量】
1、unset可以删除变量,使用unset后变量无法输出值;
【数组】
1、声明数组:数组名=(value1 value2 value3 value4 value5)值之间用空格隔开
2、数组之增删改查:
【增】索引方式增加值,数字索引从0开始
数组变量[索引号]=new value
a=(1 2)
a[3]=3
echo ${a[@]}
-----------------------------------------------
输出:123
【删】
a=(1 2)
unset a[0]
echo ${a[@]}
-----------------------------------------------
输出:2
【查】
变量名[索引号]
a=(1 2)
echo ${a[1]}
-----------------------------------------------
输出:2
变量名[@]输出数组所有值
echo ${a[@]}
-----------------------------------------------
输出:123
统计数组值的个数
a=(1 2 6)
echo ${#数组名[@]}
-----------------------------------------------
如果数组是上文的a:3
【改】
数组名[索引号]=new value
2.2 【Shell运算】
2.2.1 算数运算
符号 | 含义 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 余 |
2.2.2 逻辑运算
符号 | 含义 | 备注 | 取反 |
---|---|---|---|
-f | 判断文件是否存在 eg: if [-f filename] | file | ! |
-d | 判断文件夹是否存在 eg: if [-e dirname] | dir | ! |
-eq | 等于,也可用“ = ”代替 | equal , 用于整型比较 | ! |
-ne | 不等于 | not equal, 用于整型比较 | ! |
-lt | 小于,也可用“ < ”代替 | less then, 用于整型比较 | ! |
-gt | 大于 | great then, 用于整型比较 | ! |
-le | 小于等于 | less equal, 用于整型比较 | ! |
-ge | 大于等于 | great equal, 用于整型比较 | ! |
-a | 双方都成立(and) | and,逻辑表达式 | ! |
-o | 单方成立(or) | or, 逻辑表达式 | ! |
-z | 空字符串 | ! |
Shell条件判断
【 if 】
【 if else】
【 if elif else fi 】
循环
【 for 循环 】
语法:
for 变量 in 字符串
do
语句1
done
举例一:
for i in `seq 15`
do
echo "number is $i"
done
【 while 循环 】
语法:
while 条件语句
do
语句1
done
案例一:while条件判断数字
i=1;
while (( $1 < 10 ))
do
echo $i;
((i++));
done;
案例二:读取文件,并输出
while read line
do
echo $line;
done </etc/hosts
案例三:读取文件,并将本地/tmp/text.txt文件copy至远程服务器/tmp目录下
while read line
do
echo scp -r /tmp/test.txt root@$line:/tmp;
done </tmp/list.txt
注:/tmp/list.txt文件存储着远程服务器ip地址列表
list.txt文件内容如下:
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
案例四:读取多行多列文件,取出每行第二列并实现远程部署
while read line
do
IP=`echo $line |awk '{print $2}'`
echo scp -r /tmp/test.txt root@$IP:/tmp;
done </tmp/mulit_list.txt
注:/tmp/mulit_list.txt 文件存储着"序号"、“IP地址”、“文件地址1”、 “文件地址2”列表
mulit_list.txt文件内容如下:
1 192.168.1.1 /etc /tmp
2 192.168.1.2 /etc /tmp
3 192.168.1.3 /etc /tmp
4 192.168.1.4 /etc /tmp
【until循环语句】
含义:直到满足条件,才退出循环,否则一直执行action
语法
until 条件语句
do
action
done
案例一、条件判断数字
a=10
until (( $a < 0 ));
do
echo $a;
((a--))
done;
【case选择语句】
含义:如果arg等于pattern1的话执行语句1,如果arg==pattern2的话执行语句2,否则执行语句3
语法:
case $arg in
pattern1)
语句1
;;
pattern2)
语句2
;;
*)
语句3
;;
esac
举例一、选择“安装”mysql、apache等
case $1 in
Apache)
echo "Install Apache Server Now"
;;
MySQL)
echo "Install MySQL Server Now"
;;
Python)
echo "Install Python Now"
;;
*)
echo "Usage: { Apache | MySQL | Python | Help }"
;;
esac
【select选择语句】
语法:
PS3="Select your will exec Menu:"
select i in "Apache" "MySQL" "Python"
do
echo "Install $i Now"
done
举例一、
PS3="Select your will exec Menu:"
select i in "Apache安装" "MySQL安装" "Python安装"
do
case $1 in
Apache安装)
echo "Install Apache Server Now"
;;
MySQL安装)
echo "Install MySQL Server Now"
;;
Python安装)
echo "Install Python Now"
;;
*)
echo "Usage: { Apache | MySQL | Python | Help }"
;;
esac
done
函数
语法:
声明:
function 函数名()
{
任何内容
}
调用:
函数名
举例一、函数创建,结合select+case选择语句创建菜单栏并调用函数
声明:
function 函数1()
{
内容1
}
function 函数2()
{
内容2
}
function 函数3()
{
内容3
}
select i in "函数1" "函数2" "函数3"
do
case $i in
函数名1)
调用函数1
;;
函数名2)
调用函数2
;;
函数名3)
调用函数3
;;
*)
echo "Usage: {函数名1|函数名2|函数名3|Help|}"
;;
esac
done
【增加知识点】sed、 awk、 grep、 find命令
【 sed 】这个命令经常使用,需深入学习一下
# 将text.txt文件中的192替换为10
sed -i 's/192/10/g' text.txt