python用来解决互联网分布式
脚本是以文本进行保存
Shell脚本概述
shell的作用
shell编程规范
重定向与管道
Shell脚本变量
自定义变量
特殊变量
Shell脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种Shell控制语句已完成更复杂的操作
就是与内核沟通的界面、应用程序等。
是一个特殊的应用程序,介于操作系统内核和用户之间,充当“命令解释器“的角色,负责接受用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
shell脚本的作用
重复性操作
交互性任务(conf文件修改)
批量事务处理
服务运行状态监控
定时任务执行
等
Linux中有哪些shell?
sh:UNIX最初使用的 shell,已经被bash所替换。
bash:基准于GNU的框架下发展出的Shell,是 sh 的扩展。
csh:语法有点类似于c语言的Shell。
tcsh:整合了csh,提供更多的功能。
nologin:奇怪的shell,这个shell可以让用户无法登录主机。
注:bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。
当用户登录的时候,系统就会给一个shell来用,而这个登录取得的shell就记录在etc/passwd这个文件内。
为什么系统上合法的Shell要写入/etc/shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件。
用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内。
脚本语言又被称为扩建的语言,或者动态语言,是一种编程语言。
用来控制软件应用程序,脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。
在当前目录下
./执行当前目录下的脚本(先给执行权限);
source执行脚本不需要给执行权限;
bash执行脚本不需要给执行权限,调用bash解释器;
sh 执行脚本不需要给执行权限;
(生产环境一般都是赋权执行)
管道操作 |
将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
ps aux | wc -l
echo "abc123" | passwd --stdin zhangsan
交互式硬件设备
标准输入(STDIN):默认的设备是键盘,文件编号为 0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,文件编号为 1,命令将执行后的输出结果发送到标准输出文件。
标准错误(STDERR):默认的设备是显示器,文件编号为 2,命令将执行期间的各种错误信息发送到标准错误文件。
echo 123 > xxx
passwd --stdin yyy< xxx
grep "bash$" /etc/passwd | awk -F: '{print $1,$7}' 以冒号:分隔,输出第1、7个字段。
重定向操作
重定向输入 < 从指定的文件读取数据
重定向输出 > 将标准输出结果 保存 到指定的文件,并且覆盖原有内容
>> 将标准输出结果 追加 到指定的文件的尾部,不覆盖原有内容
重定向错误输出 2> 将错误信息 保存 到指定的文件,并且覆盖原有内容
2>> 将错误信息 追加 到指定的文件的尾部,不覆盖原有内容
混合输出 &> 将标准输出、标准错误保存到同一文件中
2>&1 将标准错误输出重定向到标准输出
shell监测机制:
bash -n [脚本名] 检查语法错误
bash -x [脚本名] 检查逻辑错误
变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设的或用户定义
变量值:能够根据用户设置,系统环境的变化而变化
变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量、只读变量、位置变量、预定义变量
1.不使用linux自带的命令作为变量名
2.不使用特殊字符:_ $等
3.一般不使用中文
4.以指定的英文名作为变量名(区分大小写)
${}用于任何变量名称,表直接引用
“”允许通过$符号引用其他变量值
'' 强行应用,应用的输出为字符串
`` 命令替换,提取命令输出的结果
使用read命令来获取输入的内容
read -p 提示用户输入的数据
[root@localhost~]#read -p "请输入一个变量:" a
请输入一个变量:cxk
[root@localhost~]#echo $a
cxk
read -a [数组的名称]
echo "第一个数组:${名称[0]}"
echo "第二个数组:${名称[1]}"
请输入一个数字
123 456
第一个数组:123
第二个数组:456
echo -n "提示"
提示[root@localhost~]#read 名字
123
[root@localhost~]#echo $名字
123
export 变量名=变量值 (全局变量:直接引用)
环境变量
环境变量由系统提前创建,用来设置用户的工作环境
使用env命令查看当前工作环境下的环境变量。
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
[root@localhost opt]# vim /root/.bash_profile
[root@localhost opt]# echo $HISTSIZE
1000
[root@localhost opt]# source /root/.bash_profile
[root@localhost opt]# echo $HISTSIZE
200
[root@localhost opt]# echo $HISTSIZE
1000
[root@localhost ~]# source /etc/profile
[root@localhost ~]# echo $HISTSIZE
200
位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变
量。$n:n为数字,$0代表命令本身,$1-$9代表带一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个
参数为${10}
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
echo xxx.sh 3 4
7
预定义变量
$*、$@:表示命令或脚本要处理的参数
$*:把所有参数看成以空格分隔的一个字符串整体,代表“$1 $2”
$@:把各个参数加上双引号分隔成n分的参数列表,每个参数作为一个字符串返回,代表"$1""$2"
去掉 $*引号
$#:是一个特殊全局变量,记录传了多少参数
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0均表示执行出现异常。也被用于shell脚本中的return退出。
vim test.sh
read -p "请输入第一个比较的数据:" a
read -p "请输入第二个比较的数据:" b
if [ $a == $b ]
then
echo "right"
else
echo $?
fi
function print_args_star {
for arg in "$*"; do
echo "$arg"
done
}
function print_args_at {
for arg in "$@"; do
echo "$arg"
done
}
print_args_star "Hello" "World" "!"
echo "--------"
print_args_at "Hello" "World" "!"
整数变量的运算
格式:expr 变量1 运算符 变量2 [运算符 变量3]
运算符:+ 加法、- 减法、\* 乘法、/ 除法、% 取余
expr 12 \* 5
常用的运算表达式:
i=$(expr 12 \* 5)
i=$((12*5))
i=$[12*5] #这种用法已弃用
let i=12*5
直接引用成变量 :
i =$ (expr 12 + 5)
echo $i 17
i=$((12 * 5))
echo $i
60
i=$[12*8]
echo $i
96
let i=13*8
echo $i
104
bc是一个简单易用的计算机程序,可用于执行基本的数学运算
a=$(echo 2*2 | bc)
4
a=$`echo 2*2 | bc`
4
i++ 相当于 i=$($i+1)
i-- 相当于 i=$($i-1)
i+=2 相当于 i=$($i+2)
i++ 先赋值再加
++i 赋值后再加
非整数运算
scale是一个特殊的变量,用于指定小数的精度。它通常用于Bash shell中的数学计算.
scale=2 #取小数点后两位
result=$(echo "scale=$scale;10/3" | bc)
echo $result
3.33
echo ${result}%
3.33
bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理。
#!/bin/bash
#加
f=$(echo "4.3+2.5"|bc)
echo "4.3+2.5=$f"
#减
f=$(echo "4.3-2.5"|bc)
echo "4.3-2.5=$f"
#乘
f=$(echo "4.30*2.50"|bc)
echo "4.3*2.5=$f"
#除
f=$(echo "scale=2;4.3/2.5"|bc)
echo "4.3/2.5=$f"
#混合运算
f=$(echo "2.2/(2.2-1.1)*2+1.1"|bc)
echo "2.2/(2.2-1.1)*2+1.1=$f"
#加
f=$(awk 'BEGIN{print 4.5+3.4 }')
echo "4.5+3.4=$f"
#减
f=$(awk 'BEGIN{print 4.5-3.4 }')
echo "4.5-3.4=$f"
#乘
f=$(awk 'BEGIN{print 4.5*3.4 }')
echo "4.5*3.4=$f"
#除
f=$(awk 'BEGIN{print 4.5/3.4 }')
echo "4.5/3.4=$f"
#混合
f=$(awk 'BEGIN{print (4.5-3.4)*2+3 }')
echo "(4.5-3.4)*2+3=$f"
[root@localhost ~]# f=$(echo "4.30*2.50"|bc)
[root@localhost ~]# echo "4.30*2.50=$f"
4.30*2.50=10.75
[root@localhost ~]# f=$(echo "scale=2;4.3/2.5"|bc)
[root@localhost ~]# echo "4.3/2.5=$f"
4.3/2.5=1.72
[root@localhost ~]# f=$(echo "4.3/2.5"|bc)
[root@localhost ~]# echo "4.3/2.5=$f"
4.3/2.5=1
[root@localhost ~]# f=$(echo "2.2/(2.2-1.1)*2+1.1"|c)
bash: c: command not found...
[root@localhost ~]# f=$(echo "2.2/(2.2-1.1)*2+1.1"|bc)
[root@localhost ~]# echo "2.2/(2.2-1.1)*2+1.1=$f"
2.2/(2.2-1.1)*2+1.1=5.1
[root@localhost ~]# f=$(awk 'BEGIN{print 4.5+3.4}')
[root@localhost ~]# echo "4.5+3.4=$f"
4.5+3.4=7.9
[root@localhost ~]# f=$(awk 'BEGIN{print 4.5-3.4}')
[root@localhost ~]# echo "4.5-3.4=$f"
4.5-3.4=1.1
[root@localhost ~]# f=$(awk 'BEGIN{print 4.5*3.4}')
[root@localhost ~]# echo "4.5*3.4=$f"
4.5*3.4=15.3
[root@localhost ~]# f=$(awk 'BEGIN{print 4.5/3.4}')
[root@localhost ~]# echo "4.5/3.4=$f"
4.5/3.4=1.32353
[root@localhost ~]# f=$(awk 'BEGIN{print (4.5-3.4)*2+3}')
[root@localhost ~]# echo "(4.5-3.4)*2+3=$f"
(4.5-3.4)*2+3=5.2