@Great-Chinese
2017-03-17T08:44:59.000000Z
字数 5910
阅读 870
Shell编程进阶
mkdir shellcd 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/bashls -l /bin/shsh first.sh # 也可以有sh执行sh -x first.sh # 查看脚本的执行过程,方便排错
date # 查看系统日期cal # 查看当月日历cal -y # 查看整年的日历date -s "2016-12-8 11:08" # 修改系统时间yum install -y ntp # 安装ntpntpdate 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.shPlease 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=2c=$[$a+$b]echo $c
大于:-gt 小于:-lt 等于:-eq 不等于:-ne 大于等于:-ge 小于等于:-le
1, 简单格式
vim if.sh # 增加内容如下:#!/bin/basha=5if [ $a -gt 3 ]thenecho "a>3"fi# 执行if脚本sh -x if.sh
2,多条件的if格式
#!/bin/basha=5if [ $a -gt 10 ]thenecho "a>10"elseecho "a<=10"fi# 执行if脚本sh -x if.sh
3,多条件的if格式
#!/bin/basha=5if [ $a -gt 10 ]thenecho "a>10"elif [ $a -lt 4 ]thenecho "a<4"elseecho "4<a<10"fi# 执行if脚本sh -x if.sh
1,判断变量是否不为空 -n,反引号表示把一个命令的结果赋值给m,即一个变量
vim if2.sh # 增加内容如下#!/bin/bashread -p "Please input a number: " n # 输入一串字符 赋值$nm=`echo $n|sed 's/[0-9]//g'` #if [ -n "$m" ] # 如果变量$m不是空格 ?????????????????????????thenecho "The character you input is not a number, please retry." # 则输出此行elseecho $n # 否则输出$nfi# 执行if脚本sh if2.sh
2,判断变量是否为空 -z,反引号表示把一个命令的结果赋值给m,即一个变量
vim if2.sh # 增加内容如下#!/bin/bashread -p "Please input a number: " n # 输入一串字符 赋值$nm=`echo $n|sed 's/[0-9]//g'` #if [ -z "$m" ] # 如果变量$m是空格thenecho $n # 则输出$nelseecho "The character you input is not a number, please retry." # 否则输出此行fi# 执行if脚本sh if2.sh
3,针对文件和目录的逻辑判断
grep '^melody' /etc/passwdgrep '^gary' /etc/passwd# -q 作为判断条件if grep -q '^gary' /etc/passwd; then echo "gary exist"; fiif [ -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/bashread -p "Please input a number:" n # 输入一串字符 赋值$nm=$[$n%2] # 变量=$n除以2echo $m # 判断变量$mcase $m in1) # 等于1echo "The number is jishu." # 输出这是个奇数;;0) # 等于0echo "The number is oushu." # 输出这是个偶数;;*) # 等于其他echo "It is not jishu or oushu." # 输出这不是奇数和偶数;;esac# 执行case脚本 (一个字符串的值,默认为0)sh case.shPlease input a number:222The number is oushu.
1,序列命令
# 产生序列的命令seq 1 101 2 3 4 5 6 7 8 9 10# 从1开始增加2显示这个数字,到8结束seq 1 2 81 3 5 7# 从8开始减除2显示这个数字,到1结束seq 8 -2 18 6 4 2# 从8开始减除1显示这个数字,到1结束seq 8 -1 18 7 6 5 4 3 2 1# 按最宽的长度生成序列格式 -wseq -w 1 10seq -w 1 100
2,循环1,10 (两种格式一样的效果)
vim for.sh # 增加内容如下,格式1#!/bin/bashfor i in `seq 1 10`doecho $idone# 执行for脚本sh for.sh
vim for.sh # 增加内容如下,格式2#!/bin/bashfor i in {1..10}doecho $idone# 执行for脚本sh for.sh
3,数字求和
vim for.sh # 增加内容如下#!/bin/bashsum=0for i in {1..10}dosum=$[$sum+$i]doneecho $sum# 执行for脚本sh for.sh55
4,循环文件的内容
vim 2.txt # 编辑文件内容如下1 2jfdklsdlaa bb# for循环for l in `cat 2.txt`; do echo $l; done # 显示循环的文件内容12jfdklsdlaabb
5,循环ip
vim 3.txt # 编辑ip列表内容如下1.1.1.12.2.2.23.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/bashwhile :dodate +%Tsleep 3done# 执行死循环sh while.sh # 查看时间,3秒循环1次
2,打印1-10
vim while1.sh # 增加内容如下#!/bin/bashn=1while [ $n -le 10 ]doecho $nn=$[$n+1]done# 执行打印循环sh while1.sh
3,交互循环
不用if判断,如果输入的不是数字将一直进行,直到输入的是数字后,才会自动退出
vim while2.sh # 增加内容如下#!/bin/bashn=1while [ ! -z "$n" ] ?????????????????????????????doread -p "Please input a number:" mn=`echo $m |sed 's/[0-9]//g'`echo $mdone# 执行交互循环sh while2.sh # 如果输入的不是数字将一直进行,直到输入的是数字后,才会自动退出
break 是中断该层循环。 exit是直接退出脚本。 这个shift的意思是把第二个参数变为第一个参数,第一个参数删除
1, break 中断(结束整个for循环)
vim for3.sh # 增加内容如下#!/bin/bashfor i in `seq 1 3`doecho $iif [ $i -eq 2 ]thenbreakfiecho $idoneecho "for done"# 执行for循环sh for3.sh # 打印结果如下112for done
2,continue 继续 (结束本次shell脚本的循环) ???????????????????????????
vim for3.sh # 增加内容如下#!/bin/bashfor i in `seq 1 5`doecho $iif [ $i -eq 3 ]thencontinuefiecho $idoneecho "for done"# 执行for循环sh for3.sh # 打印结果如下11233for done
3,exit 退出 (直接结束整个shell脚本,后面的命令都不用执行) ??????????????
#!/bin/bashfor i in `seq 1 5`doecho $iif [ $i -eq 3 ]thenexitfiecho $idoneecho "for done"# 执行for循环sh for3.sh # 打印结果如下112
1,函数
vim fun.sh # 编辑函数,增加内容如下#!/bin/bashfunction mysum() { # function 可以省略不写sum=$[$1+$2]echo $sum}a=1b=2mysum $a $b# 执行函数sh fun.sh # 打印结果3
2,引用函数里面的变量
vim fun.sh # 编辑函数,增加内容如下#!/bin/bashfunction mysum() {sum=$[$1+$2]echo $sum}a=1b=2mysum $a $becho $sum# 执行函数sh fun.sh # 打印结果33
3,让函数里的变量只在函数里使用
vim fun.sh # 编辑函数,增加内容如下#!/bin/bashfunction mysum() {local sum=$[$1+$2] # local表示只在子函数中生效echo $sum}a=1b=2mysum $a $becho $sum# 执行函数sh fun.sh # 打印结果3
1,数组的定义
a=(1 2 3 4) # 定义一个数组echo ${a[@]} # 显示一个数组 @1 2 3 4echo ${a[*]} # 显示一个数组 *1 2 3 4echo ${a[0]} # 显示数组中的第一个元素1echo ${a[1]} # 显示数组中的第一个元素2a[4]=8 # 增加数组元素echo ${a[*]} # 显示增加数组元素后的数组1 2 3 4 8a[1]=6 # 更改数组中的某个元素echo ${a[*]} # 显示更改数组中的某个元素后的数组1 6 3 4 8echo ${#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 -n16493501365715794177882297526047288163024030956# 删除数组unset aecho ${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