定义:shell编程是使用linux命令来进行写程序的语言
脚本语言:写linux里执行命令的脚本
脚本就是一个文件,里面有很多的linux命令+if+for+case+while等流控语言
shell脚本执行顺序是从上而下,一条一条的执行,如果某条命令执行出错,后面的命令是否执行呢?
答案: 执行
(( 整数的运算和比较 ))
[[ 字符串的比较 ]]
1.变量 variable
为什么需要变量?----传递信息、数据
变量是临时存放数据的一个容器
-
变量的定义,=左右不能有空格
[root@localhost shell]# sg="xiaowei"
[root@localhost shell]# bsg="caojb"
[root@localhost shell]# ssg = "xiaoniu"
-
引用变量的值 ——$接变量名,就是引用这个变量的值
[root@localhost shell]# echo $sg $ssg $bsg $mn
xiaowei caojb
注:shell编程里变量如果没有定义直接使用,默认是空值,不会报错,可以直接使用
[root@localhost shell]# mkdir $sg
[root@localhost shell]# ls
first.sh xiaowei
[root@localhost shell]# echo $sg1
[root@localhost shell]# echo ${sg}1
xiaowei1
[root@localhost shell]#
{} 避免变量的混淆,给变量划定了边界
-
变量的命名
变量的名字里不能出现特殊符号
①下划线命名法 -->使用非常多
user_name="feng"
②区分大小写
③驼峰命名法
UserName="feng"
userName="feng"
[root@localhost shell]# UserName="fengdeyong"
[root@localhost shell]# echo $UserName
fengdeyong
[root@localhost shell]#
变量的命名不能以数字开头,包含特殊字符
[root@localhost shell]# 6sg="gaohui"
-bash: 6sg=gaohui: 未找到命令
[root@localhost shell]# sg6="gaohui"
[root@localhost shell]# sg>="gaohui"
用法:sg 组 [[-c] 命令]
2.流控语句:流程控制
-
if语句
①单分支
条件为真,就执行命令
条件可以是一条命令
if 条件 ;then
命令
fi
; 命令连接符号
命令1 ; 命令2 先执行命令1然后执行命令2 ,在一行里可以执行多条命令,不管前面的命令执行是否成功都会执行后面的命令
[root@localhost shell]# mkdir echo yes;echo no
yes
no
②双分支
if 条件 ;then
命令1
else
命令2
fi
③多分支
if 条件1 ;then
命令1
else if 条件2;then
命令2
else if 条件3;then
命令3
else
命令4
fi
拓展:$? 代表上一条命令的返回值
0 代表上一条命令执行成功
非0 代表上一条命令执行失败
[root@localhost shell]# fjdkjfdjkfdj
-bash: fjdkjfdjkfdj: 未找到命令
[root@localhost shell]# echo $?
127
[root@localhost shell]# ls
first.sh =gaohui xiaowei
[root@localhost shell]# echo $?
0
[[ ]] 进行字符串的比较
(( )) 数值的比较 ,只能用于整数的比较,不能进行小数的比较
[root@localhost shell]# a=10
[root@localhost shell]# b=20
[root@localhost shell]# (($b > $a))
[root@localhost shell]# echo $?
0
[root@localhost shell]# (($a > $b))
[root@localhost shell]# echo $?
1
[root@localhost shell]# (($b >10 && $b<100))
[root@localhost shell]# echo $?
0
[root@localhost shell]# (($b >50 && $b<100))
[root@localhost shell]# echo $?
1
[root@localhost shell]# cat if.sh
#!/bin/bash
#接受用户的输入
read -p "请输入用户名:" user_name
if [[ $user_name == "root" ]];then
echo "你是管理员root"
elif [[ $user_name == "admin" ]];then
echo "你是管理员admin"
elif [[ $user_name == "sg" ]];then
echo "你是帅哥sg"
else
echo "你是一个普通的用户"
fi
[root@localhost shell]# bash if.sh
请输入用户名:root
你是管理员root
[root@localhost shell]# bash if.sh
请输入用户名:admin
你是管理员admin
[root@localhost shell]# bash if.sh
请输入用户名:sc
你是一个普通的用户
-
for循环
for 变量 in 集合
do
命令
done
案例:
①
#!/bin/bash
for i in {1..10}
do
mkdir /shell/machi$i
done
break :跳出整个循环,执行循环后面的语句
continue : 结束本次循环,不再执行后面的语句,开始下一次循环
②
#!/bin/bash
for i in {1..10}
do
if (( $i == 6 ));then
touch wuyangming$i.txt
continue
fi
mkdir -p /shell/wuyangming$i
done
③
#!/bin/bash
for i in {1..10}
do
if (( $i == 6 ));then
touch renxiaojing$i.txt
#continue
break
fi
mkdir -p /shell/renxiaojing$i
done
mkdir /shell/renxj_end
双重for循环
#!/bin/bash
for i in {1..10}
do
for a in {1..5}
do
echo "$i $a"
done
done
控制循环次数的案例:
①
#!/bin/bash
i=1
while (( $i <= 10))
do
echo $i
((i++))
done
②
#!/bin/bash
i=1
#while true
while :
do
echo $i
((i++))
#暂停1秒
sleep 1
done
--------------
练习:
1.使用while死循环,当i=10的时候退出 整个循环
[root@localhost shell]# cat while3.sh
#!/bin/bash
i=1
while true
do
echo $i
((i++))
sleep 1
if((i==10));then
break
fi
done
[root@localhost shell]#
2.使用for循环编写一个九九乘法表
[root@localhost shell]# cat for3.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
for ((a=1;a<=i;a++))
do
echo -n "$i*$a=$[i*a] "
done
echo
done
拓展:
for ((i=1;i<=9;i++)) --》类似于c语言的写法
for i in {1..9} --》非常shell的写法
echo -n "$i*$a=$[i*a] "
echo -n "$i*$a=$((i*a)) "
在双圆括号里,变量可以不接$符号
3.位置变量
给脚本传递参数
[root@server ~]# cat pos_var.sh
#!/bin/bash
echo "第1个位置变量是 $1"
echo "第2个位置变量是 $2"
echo "第3个位置变量是 $3"
echo "第4个位置变量是 $4"
echo "第5个位置变量是 $5"
echo "一共有 $# 个位置变量"
echo "所有的位置变量的内容是 $*"
[root@server ~]# bash pos_var.sh panlinfeng zhenyani machi gaohui xiaowei liquan
第1个位置变量是 panlinfeng
第2个位置变量是 zhenyani
第3个位置变量是 machi
第4个位置变量是 gaohui
第5个位置变量是 xiaowei
一共有 6 个位置变量
所有的位置变量的内容是 panlinfeng zhenyani machi gaohui xiaowei liquan
脚本里面命令行模式:
:%s/sc/username/g
% 代表所有的行
s 替换操作 substitute
/sc/username/
old word new word
g 一行里有多个都替换 global
sc1 sc2 sc3
username1 username2 username3
4.数组 Array
声明:
数组名=(参数1 参数2 参数3 ...)