Shell脚本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本相关的知识,希望对你有一定的参考价值。
Shell脚本:
特殊的后缀名的意义:
.sh shell脚本文件
.py python脚本文件
.jsp Java网页文件
.repo yum仓库配置文件
.php php语言编写文件
.html html编写的网页文件
.db 数据库文件
Shell的作用:
1、翻译官,解释用户输入的命令。
2、用户的登录shell程序,默认为/bin/bash
3、shell脚本文件,编写脚本代码必须有执行权限。
Shell脚本的执行方式:
1、脚本的路径:
绝对路径 root/first.sh
相对路径 首先切换到脚本文件所在的目录,然后用”./脚本名”去执行。
注:必须脚本文件要有执行权限。
2、sh脚本路径:
方法一:绝对路径 sh /opt/first.sh
方法二:相对路径 首先切换到脚本文件所在的目录,然后用”sh 脚本名”去执行。
3、source脚本路径:
方法一:绝对路径 source /opt/first.sh
方法二:相对路径 首先切换到脚本文件所在的目录,然后用”source 脚本名”去执行。
Shell脚本的构成:
1、脚本声明
#!/bin/bash 声明后面的命令可以通过此shell程序去解释并执行。
2、注释信息
摘要、脚本的作用、参数说明、工作效率、创建日期、作者、版本声明、第几次的修改、每次返回的动态值得定义等
3、可执行的命令语句
注:所有特殊符号必须是英文模式输入。
四大剑客:awk,sed,egrep,grep
管道符号的作用:将管道符号左侧的命令执行的结果,作为右侧命令的处理对象。
重定向操作:
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向输出 | >> | 将输出结果追加到指定的文件(追加内容) |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
标准错误输出 | 2>> | 将错误信息追加到指定的文件中(追加内容) |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件 |
混合输出 | &>> | 将标准输出、标准错误的内容保存到同一个文件中 |
自定义变量(小总结):
1、声明变量不需要声明类型
2、可以存储不同类型内容 A=weixin01
3、有时候使用变量时要明确变量类型
4、严格区分大小写
5、等于号两边不允许出现空格
6、首个字符必须是字母(a-z,A-Z或者_)
7、不能使用标点符号作为变量名
8、不能使用bash里面的关键字作为变量名
最基本的赋值方法:
格式:变量名=变量值 等于号两边不允许为空格。
查看变量
格式:echo $变量名
echo ${变量名}
通过echo进行一个输出变量,其中$是引用变量的特殊字符是特殊字符(必须要使用$符号)。
注:echo和调用的变量之间必须要有空格
当需要一起调用多个变量时,以空格隔开
当变量名和后面的字符混淆的时候,因使用{}将变量名括起来
变量赋值的特殊方法:
1、双引号“”
注:echo和调用的变量之间必须要有空格
当需要一起调用多个变量时,以空格隔开
2、单引号‘’ 所见即所得
禁止应用变量值,将$符号当作普通字符来使用
3、反撇号 ``
与$()效果一样
作用:命令替换,提取命令执行的结果
ls -l `which useradd`
优先执行反撇号里面的命令,在执行其他
变量赋值的时候,如果要赋值的是某条命令执行的结果,必须使用反撇号
缺点:反撇号不是实现嵌套命令替换操作,这时候使用$()来代替。
rpm -qc $(rpm -qf $(which useradd))
A=`rpm -qc $(rpm -qf $(which useradd))`
A=$(rpm -qc $(rpm -qf $(which useradd)))
4、交互式赋值 read
read命令用于提示用户输入信息,从而实现简单交互过程
(输入命令就是一种交互式的过程)
多个变量名交互式赋值,赋值之间有空格,变量名也有空格。
为了更友好,通常使用-p来设置提示信息
只是在当前shell程序中定义一个变量,但是到其他shell程序中无法引用
设置变量的作用范围:
export 变量名=变量值
设置全值变量,所有子shell程序都可以使用此变量
数值变量的运算:
expr
$(()) 加加:++ 减减:-- 2的n次方:2**n
环境变量:
常见的环境变量:
PWD:显示当前所在的工作目录
USER:用户的名称,可以查看当前登录的用户
HOME:用户的加目录,显示当前用户的家目录
LANG:语言和字符集变量
PATH:命令搜索路径,可以用tab键补全
PS1:提示符变量
位置变量:
方便通过命令行为程序提供操作参数。
当执行命令时,第一个字段表示命令名或者脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量
第一个字段位置变量是$0
第二个字段位置变量是$1
第三个字段位置变量是$2
例子: ls /opt /bot /root
/opt/a.sh /opt
vi weizhi.sh
#!/bin/bash
sum=$(($1+$2))
echo”$1+$2=$sum”
预定义变量脚本:
$#:代表命令行的位置变量的个数
$*:代表每个位置变量的内容
$?:返回上一次执行的结果,0为正确 执行,非0的代表异常(报错)
$0:代表当前执行的命令或者程序名
条件测试:
test 条件表达式 / 条件表达式
常用的测试操作符:
-d 测试是否为目录
-e 测试目录或文件
-f 测试是否为文件
-r 测试当前用户是否有权限读取read
-w 测试当前用户是否有权写入write
逻辑测试:
&&:逻辑与(可改为"-a")
||:逻辑或(可改为"-o")
!:逻辑否
整数值比较:
-eq A=B
-ne A≠B
-gt A>B
-lt A<B
-le A<=B
-ge A>=B
字符串比较:
格式1 [ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二 [ -z 字符串 ]
=:第一个字符串与第二个字符串相同
!=:第一个字符串与第二个字符串不相同,其中”!”符号表示取反
-z:检查字符串是否为空,对于未定义或赋予空值得变量将视为空串
循环语句:
for循环语句:
需要指定一个变量以及可以取值的取值列表,针对每一个不同的取值相同的命令序列,直到变量值用尽,退出循环
取值列表:for语句的执行条件,其中包括多个属性相同的对象,需要预先指定。
格式:
for 变量名 in 取值列表
do
命令序列
done
注:
for语句的操作对象为用户指定名称的变量
通过in关键字为改变量预先设置一个取值列表
多个取值之间以空格作为分隔
do~done之间是一个循环体
应用领域:
1、字符串取值列表:
#!/bin/bash
#字符串取值列表
for HOME in 北京 上海 广州 安徽 南京
do
echo "$HOME欢迎你"
done
2、文件取值列表:
#!/bin/bash
#文件取值列表(命令执行取值列表)
i=1
for USER in $(cat /opt/a)
do
echo ”$i号用户:$USER”
let i++ //循环加一
done
3、扫描ip地址:
#!/bin/bash
#扫描ip地址
for IP in 192.168.108.{1..254} //1到254
do
ping -c 3 -i 0.2 -W 1 $IP &> /dev/null
if [ $? -eq 0 ];then
echo “$IP is up!!!”
else
echo “$IP is down!!!”
fi
done
要求:down的主机ip地址统计有多少个,up的有多少个??
#!/bin/bash
#扫描ip地址
up=0
down=0
for IP in 192.168.108.{1..254}
do
ping -c 3 -i 0.2 -W 1 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "$IP is up!!!"
let up++
else
echo "$IP is down!!!"
let down++
fi
done
echo "up地址有=$up,down地址有=$down"
4、批量添加用户:
方法一:同一个姓
#!/bin/bash
#批量添加用户
for A in teacher{1..5}
do
useradd $A
echo 123 | passwd --stdin $A $> /dev/null
done
方法二:不同姓名
vi b.txt
lisi
zhangsan
wangwu
jack
#!/bin/bash
#批量添加用户
for A in $(cat /opt/b)
do
useradd $A
echo 123 | passwd --stdin $A $> /dev/null
done
while循环语句:
while和for的区别
for语句非常适合用于列表对象无规律,且列表来源是固定的场合
while对于要求控制循环次数、操作对象按数字顺序编号,按特定条件执行重复操作。
重复测试某个条件时,只要条件成立就会反复执行(无限),除非强制终止,或者exit语句退出脚本
格式:
while 条件测试操作(判断语句)
do
命令序列
done
应用领域
1、批量添加用户
#!/bin/bash
U=”student”
i=1
while [ $i -le 10 ]
do
useradd $U$i
echo 123 | passwd --stdin $U$i $> /dev/null
let i++
done
2、交互式批量创建
#!/bin/bash
read -p “请输入要创建用户的前缀:” X
read -p “请输入要创建用户的个数:” M
read -p “请输入用户的初始密码:” N
i=1
while [ $i -le $10 ]
do
useradd $X$i
echo “$N” | passwd --stdin $X$i $> /dev/null
chage -d 0 $X$i
let i++
done
3、猜价格游戏
#!/bin/bash
P=$(($PANDOM%1000))
T=0
echo “商品实际价格范围0~999,请猜一猜看是多少?”
while true
do
read -p “请输入猜测的价格数目:”INT
let T++
if [ $INT -eq $P ];then
echo “恭喜答对了,实际价格是$P”
echo ”你总共猜测了$T次”
exit 0 //正常退出脚本
elif [ $INT -gt $P ];then
echo “太高了”
else
echo “太低了”
fi
done
作业:99乘法表
#!/bin/bash
#for loop
for (( i=1;i<=9;i++ ))
do
for (( j=1;j<=i;j++ ))
do
let "temp=i*j"
echo -n "$i*$j=$temp "
done
echo ""
done
shell函数
格式:
[ function ] 函数名(){
命令序列
[return x]
}
注:
[ function ]是可写可不写,表示该函数的功能,可省略
()里面是没有内容的,固定格式
执行的命令序列放在{}里面
[return x]的作用是当命令序列执行完后返回给系统一个值相当于echo $?
例子:
两个求和
#!/bin/bash
sum(){
echo "你需要计算的两个整数分别是:$1和$2"
SUM=$(($1+$2))
echo "$1 + $2 = $SUM"
}
sum $1 $2
单分支:
if 条件测试操作
then
命令序列
fi
双分支:
if 条件测试操作
then
命令序列1
else
命令序列2
fi
多分支:
if 条件测试操作
then
命令序列1
elif 条件测试操作2
then
命令序列2
else
命令序列3
fi
以上是关于Shell脚本的主要内容,如果未能解决你的问题,请参考以下文章