1、shell脚本
是一些命令及表达式的集合,也是一种程序设计语言,用于高效率的完成任务,简单理解为批量的执行一些命令。
(1)脚本基本格式 vim 文件名.sh
#!/bin/bash #!说明使用哪种解释器来执行脚本 #注释信息 #开头为注释
命令1
命令2
……
命令n
(2)运行方式:
/bin/bash 文件名.sh bash解释器来运行
./文件名.sh 输入完整路径来运行,此方法必须有脚本的运行权限才可执行。
增加运行权限: chmod u+x 文件名.sh
(3)内设的接收参数变量
例子# test.sh one two three four five
$0 文件名本身,$*所有参数值,$1 第一个参数
$2 第二个参数 $3第三个参数 $n 第n个参数
$#参数总数
例子# test.sh one two three four five
$0 的值是test.sh $1是one $2是two
$*的值是one two three four five
$#的值是5 参数总数
2、变量
(1)定义变量 定义变量时变量名前不需要加$
变量名=变量值
例子 num=2
注意:变量名首字符不能是数字,
变量名和等号之间不能有空格
(2)使用变量 使用变量时要再变量名前加$
echo $num
(3) 只读变量 readonly定义的变量
例子 readonly num=5
(4) 删除变量 unset
格式: unset 变量名
例子 myurl="http://www.baidu.com"
unset myurl
注意:变量被删除后不能被使用
unset不能删除只读变量
(5)变量类型
局部变量 只在此脚本使用
环境变量 所有程序可使用
shell变量 shell设置的特殊变量,
shell变量一部分是环境变量一部分是局部变量。
(6)shell字符串 常用数据类型
单引号 内部的任何字符都会原样输出,内部变量无效
字符串中不能单独出现一个单引号(对单引号使用转义字符后也不行),但可以成对出现,作为字符串拼接使用。
双引号 双引号里可以有变量,可以有转义字符
例子:
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
(7)获取字符串长度
string="abcd"
echo ${#string} 输出4
(8)提取子字符串
string ="It's a book"
echo ${string:1:4} 输出 t's
注意:第一个字符的索引值是0
(9)查找字符在字符串位置
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
` 是反引号,而不是单引号 ',不要看错了哦。
3、Shell 数组
bash支持一维数组(不支持多维数组),数组元素的下标由 0 开始编号
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制。
读取数组
${数组名[下标]}
使用 @ 符号可以获取数组中的所有元素
echo ${array_name[@]}
获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
4、Shell 注释
以 # 开头的行就是注释,会被解释器忽略。
多行注释
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
5、流程控制 顺序、选择、循环
(1)文件测试所用参数
-d测试文件是否为目录
-e测试文件是否存在
-f判断是否为普通文件
-r是否有读权限
-w是否有写权限
-x是否有执行权限
例子:
# [ -d /etc/fstab ]
echo $? 前一个命令的值,结果为1,表示不是目录。
(2)逻辑 与、或、非
逻辑与 && 表示前面真后,才执行候命语句
例子: [ -d /etc/fstab ] && echo "Exist"
逻辑或 || 前面失败后才会执行后面
逻辑非 ! 取反
(3)整数比较运算符
-eq是否等于
-ne是否不等于
-gt是否大于
-lt 是否小于
-le 是否小于等于
-ge是否大于等于
(4)条件语句 1
if [条件 ]
then
语句
fi
(5)条件语句2
if [条件 ]
then
语句
else
语句
fi
(6)条件语句3
if [条件 ]
then
语句
elif [条件 ]
语句
else
语句
fi
(6)for循环
for变量名 in 取值列表
do
命令序列
done
(7)while循环
while 条件测试
do
命令序列
done
(8)case条件
case变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
模式n)
命令序列n
;;
esac
(9)read命令 从标准设备读取(输入)信息
-p参数后可以写提示信息
例子
vim test.sh
!/bin/bash
read -p "请输入一个数值:" num
echo "你输入的数值是:" $num
(10) &>/dev/null
表示不显示没必要的信息
(11) 字符串比较运算符
= 等于 != 不等于 -z 是否为空
(12)综合例子 读取文件中的用户名进行用户创建工作 需要root用户权限
users.txt文件内容为:
wlb11
wlb22
wlb33
vim UseraddTest.sh
#!/bin/bash
for UNAMEin `cat users.txt`
do
echo "现在从文件中读取的用户是:"$UNAME
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo $UNAME"用户已经存在"
else
read -p "请输入用户:"$UNAME"的密码" PASSWD
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME,成功建立用户"
else
echo "$UNMAE, 建立用户失败"
fi
fi
done
注意事项:
$? -eq 0 测试上个命令的运行情况,0为成功
&> /dev/null 输出到空的地方,也就是不输出信息
--stdin 获取字符串(数据),echo的输出为passwd的输入
`cat users.txt` `是反引号,执行反引号内的命令