@Great-Chinese
2017-03-17T08:44:59.000000Z
字数 5910
阅读 848
Shell编程进阶
mkdir shell
cd shell/
# 编辑脚本文件
vim first.sh # 增加内容如下
#!/bin/bash
##The first test shell script.
##Written by melody.
ls /tmp/
echo "This is the first script."
# 执行脚本方法
bash first.sh # bash直接接文件名
chmod a+x first.sh # 增加x权限,然后直接相对路径执行
./first.sh
/root/shell/first.sh # 用绝对路径执行
ls -l /bin/bash
ls -l /bin/sh
sh first.sh # 也可以有sh执行
sh -x first.sh # 查看脚本的执行过程,方便排错
date # 查看系统日期
cal # 查看当月日历
cal -y # 查看整年的日历
date -s "2016-12-8 11:08" # 修改系统时间
yum install -y ntp # 安装ntp
ntpdate time.windows.com # 同步windows时间
ntpdate ntp.fudan.edu.cn # 同步fudan时间
date +%F # 显示年-月-日
date +%T # 显示时:分:秒
date +%Y # 显示年(2016)
date +%y # 显示年(16)
date +%m # 显示月
date +%d # 显示日
date +%H # 显示时
date +%M # 显示分
date +%S # 显示秒
date +%s # 时间圈(距离1970-1-1 0:0:0到现在走了多少秒)
date +%w # 显示星期几
date +%W # 显示一年内的第几个星期
date +"%Y-%m-%d %H:%M:%S" # 显示年-月-日 时:分:秒
date -d "-2 days" +%F # 显示两天前的年-月-日
date -d "-2 month" +%F # 显示两个月前的年-月-日
date -d "-2 hour" +%T # 显示2小时前的时:分:秒
date -d "-2 min" +%T # 显示2分钟前的时:分:秒
date -d "-200 sec" +%T # 显示200秒前的时:分:秒
1,用户交互的脚本
# 编辑与用户交互的脚本
vim 2.sh # 增加内容如下
#!/bin/bash
##The first test shell script.
##Written by melody.
read -t 3 -p "Please input a number:" number (-t: 指3秒之后,会自动退出)
echo $number
# 执行脚本
sh 2.sh
Please input a number:1 # 输入什么打印什么
1
2,内指脚本 ???????????????????????????????????????????????????????????????????
# 编辑内指脚本
vim 3.sh # 增加内容如下
#!/bin/bash
##The first test shell script.
##Written by melody.
echo "\$1= $1"
echo "\$2= $2"
echo "\$3= $3"
echo "\$0= $0"
# 执行内指脚本
sh 3.sh aa bb cc # 显示内容如下
$1= aa
$2= bb
$3= cc
$0= 3.sh
3,数学运算
# 数学运算
a=1;b=2
c=$[$a+$b]
echo $c
大于:-gt 小于:-lt 等于:-eq 不等于:-ne 大于等于:-ge 小于等于:-le
1, 简单格式
vim if.sh # 增加内容如下:
#!/bin/bash
a=5
if [ $a -gt 3 ]
then
echo "a>3"
fi
# 执行if脚本
sh -x if.sh
2,多条件的if格式
#!/bin/bash
a=5
if [ $a -gt 10 ]
then
echo "a>10"
else
echo "a<=10"
fi
# 执行if脚本
sh -x if.sh
3,多条件的if格式
#!/bin/bash
a=5
if [ $a -gt 10 ]
then
echo "a>10"
elif [ $a -lt 4 ]
then
echo "a<4"
else
echo "4<a<10"
fi
# 执行if脚本
sh -x if.sh
1,判断变量是否不为空 -n,反引号表示把一个命令的结果赋值给m,即一个变量
vim if2.sh # 增加内容如下
#!/bin/bash
read -p "Please input a number: " n # 输入一串字符 赋值$n
m=`echo $n|sed 's/[0-9]//g'` #
if [ -n "$m" ] # 如果变量$m不是空格 ?????????????????????????
then
echo "The character you input is not a number, please retry." # 则输出此行
else
echo $n # 否则输出$n
fi
# 执行if脚本
sh if2.sh
2,判断变量是否为空 -z,反引号表示把一个命令的结果赋值给m,即一个变量
vim if2.sh # 增加内容如下
#!/bin/bash
read -p "Please input a number: " n # 输入一串字符 赋值$n
m=`echo $n|sed 's/[0-9]//g'` #
if [ -z "$m" ] # 如果变量$m是空格
then
echo $n # 则输出$n
else
echo "The character you input is not a number, please retry." # 否则输出此行
fi
# 执行if脚本
sh if2.sh
3,针对文件和目录的逻辑判断
grep '^melody' /etc/passwd
grep '^gary' /etc/passwd
# -q 作为判断条件
if grep -q '^gary' /etc/passwd; then echo "gary exist"; fi
if [ -d /tmp/ ] && [ -f 1.txt ]; then echo ok; fi # 并且
if [ -d /tmp/ ] || [ -f 2.txt ]; then echo ok; fi # 或者
if [ -d /tmp/ -a -f 1.txt ]; then echo ok; fi # -a 并且
if [ -d /tmp/ -o -f 1.txt ]; then echo ok; fi # -o 或者
1,判断奇偶数
vim case.sh # 增加内容如下
#!/bin/bash
read -p "Please input a number:" n # 输入一串字符 赋值$n
m=$[$n%2] # 变量=$n除以2
echo $m # 判断变量$m
case $m in
1) # 等于1
echo "The number is jishu." # 输出这是个奇数
;;
0) # 等于0
echo "The number is oushu." # 输出这是个偶数
;;
*) # 等于其他
echo "It is not jishu or oushu." # 输出这不是奇数和偶数
;;
esac
# 执行case脚本 (一个字符串的值,默认为0)
sh case.sh
Please input a number:222
The number is oushu.
1,序列命令
# 产生序列的命令
seq 1 10
1 2 3 4 5 6 7 8 9 10
# 从1开始增加2显示这个数字,到8结束
seq 1 2 8
1 3 5 7
# 从8开始减除2显示这个数字,到1结束
seq 8 -2 1
8 6 4 2
# 从8开始减除1显示这个数字,到1结束
seq 8 -1 1
8 7 6 5 4 3 2 1
# 按最宽的长度生成序列格式 -w
seq -w 1 10
seq -w 1 100
2,循环1,10 (两种格式一样的效果)
vim for.sh # 增加内容如下,格式1
#!/bin/bash
for i in `seq 1 10`
do
echo $i
done
# 执行for脚本
sh for.sh
vim for.sh # 增加内容如下,格式2
#!/bin/bash
for i in {1..10}
do
echo $i
done
# 执行for脚本
sh for.sh
3,数字求和
vim for.sh # 增加内容如下
#!/bin/bash
sum=0
for i in {1..10}
do
sum=$[$sum+$i]
done
echo $sum
# 执行for脚本
sh for.sh
55
4,循环文件的内容
vim 2.txt # 编辑文件内容如下
1 2
jfdklsdl
aa bb
# for循环
for l in `cat 2.txt`; do echo $l; done # 显示循环的文件内容
1
2
jfdklsdl
aa
bb
5,循环ip
vim 3.txt # 编辑ip列表内容如下
1.1.1.1
2.2.2.2
3.3.3.3
# for循环
for ip in `cat 3.txt`; do echo $ip; done # 根据ip做为循环的对象
for ip in `cat 3.txt`; do echo $ip;ssh $ip "w"; done # 改成自己的服务器ip,即可形成自动化运帷脚本
6,循环当前目录的名称
for file in `ls`; do echo $file; done # 循环当前目录下的每个名称内容
for file in `ls`; do echo $file;du -sh $file; done # 循环当前目录下的每个名称内容并显示大小
1,死循环
vim while.sh # 增加内容如下
#!/bin/bash
while :
do
date +%T
sleep 3
done
# 执行死循环
sh while.sh # 查看时间,3秒循环1次
2,打印1-10
vim while1.sh # 增加内容如下
#!/bin/bash
n=1
while [ $n -le 10 ]
do
echo $n
n=$[$n+1]
done
# 执行打印循环
sh while1.sh
3,交互循环
不用if判断,如果输入的不是数字将一直进行,直到输入的是数字后,才会自动退出
vim while2.sh # 增加内容如下
#!/bin/bash
n=1
while [ ! -z "$n" ] ?????????????????????????????
do
read -p "Please input a number:" m
n=`echo $m |sed 's/[0-9]//g'`
echo $m
done
# 执行交互循环
sh while2.sh # 如果输入的不是数字将一直进行,直到输入的是数字后,才会自动退出
break 是中断该层循环。 exit是直接退出脚本。 这个shift的意思是把第二个参数变为第一个参数,第一个参数删除
1, break 中断(结束整个for循环)
vim for3.sh # 增加内容如下
#!/bin/bash
for i in `seq 1 3`
do
echo $i
if [ $i -eq 2 ]
then
break
fi
echo $i
done
echo "for done"
# 执行for循环
sh for3.sh # 打印结果如下
1
1
2
for done
2,continue 继续 (结束本次shell脚本的循环) ???????????????????????????
vim for3.sh # 增加内容如下
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i -eq 3 ]
then
continue
fi
echo $i
done
echo "for done"
# 执行for循环
sh for3.sh # 打印结果如下
1
1
2
3
3
for done
3,exit 退出 (直接结束整个shell脚本,后面的命令都不用执行) ??????????????
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i -eq 3 ]
then
exit
fi
echo $i
done
echo "for done"
# 执行for循环
sh for3.sh # 打印结果如下
1
1
2
1,函数
vim fun.sh # 编辑函数,增加内容如下
#!/bin/bash
function mysum() { # function 可以省略不写
sum=$[$1+$2]
echo $sum
}
a=1
b=2
mysum $a $b
# 执行函数
sh fun.sh # 打印结果
3
2,引用函数里面的变量
vim fun.sh # 编辑函数,增加内容如下
#!/bin/bash
function mysum() {
sum=$[$1+$2]
echo $sum
}
a=1
b=2
mysum $a $b
echo $sum
# 执行函数
sh fun.sh # 打印结果
3
3
3,让函数里的变量只在函数里使用
vim fun.sh # 编辑函数,增加内容如下
#!/bin/bash
function mysum() {
local sum=$[$1+$2] # local表示只在子函数中生效
echo $sum
}
a=1
b=2
mysum $a $b
echo $sum
# 执行函数
sh fun.sh # 打印结果
3
1,数组的定义
a=(1 2 3 4) # 定义一个数组
echo ${a[@]} # 显示一个数组 @
1 2 3 4
echo ${a[*]} # 显示一个数组 *
1 2 3 4
echo ${a[0]} # 显示数组中的第一个元素
1
echo ${a[1]} # 显示数组中的第一个元素
2
a[4]=8 # 增加数组元素
echo ${a[*]} # 显示增加数组元素后的数组
1 2 3 4 8
a[1]=6 # 更改数组中的某个元素
echo ${a[*]} # 显示更改数组中的某个元素后的数组
1 6 3 4 8
echo ${#a[*]} # 获得数组的元素总个数
5
2,数组排序
# 选取10个随机数,即赋值
for i in `seq 0 9`; do a[$i]=$RANDOM; done; echo ${a[@]}
13476 495 11510 27164 28450 18206 7545 9094 19343 12099
# 比较随机数的大小,即排序
for i in `seq 0 9`; do a[$i]=$RANDOM; done; echo ${a[@]} |sed 's/ /\n/g'|sort -n
164
9350
13657
15794
17788
22975
26047
28816
30240
30956
# 删除数组
unset a
echo ${a[@]} # 删除数组后,数组值将为空
3,
# 选取10个随机数,即重新赋值
for i in `seq 0 9`; do a[$i]=$RANDOM; done; echo ${a[@]}
19206 1570 20842 11823 5848 31177 14322 2679 11957 3307
# 删除数组的第5个元素
unset a[4]
echo ${a[@]} # 显示删除数组第5个元素后的数组
19206 1570 20842 11823 31177 14322 2679 11957 3307
# 重新赋值
for i in `seq 0 9`; do a[$i]=$RANDOM; done; echo ${a[@]}
19349 12146 31114 2462 1238 5914 25162 32432 32167 2394
# 按顺序选取指定第几个元素
echo ${a[@]:0:4}
19349 12146 31114 2462