LINUX中shell脚本编程的方法是什么


这篇文章主要介绍了LINUX中shell脚本编程的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇LINUX中shell脚本编程的方法是什么文章都会有所收获,下面我们一起来看看吧。当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为 Shell 脚本。shell脚本是纯文本文件,以行为单位逐行执行。相当于一种命令翻译器。使用文本编辑器(或touch)创建脚本文件语法:touch a.sh将脚本添加可执行权限语法:chmod +x a.sh执行脚本命令:(1)./a.sh(2)sh a.sh(3)source a.sh //不需要x权限编辑脚本:vim a.sh#!/bin/bash //系统以bash解释器执行脚本cd /etc/pwd //命令语句重定向输出:将命令的执行结果覆盖到目标文件语法:df > a.txt //将磁盘信息覆盖到a.txt文件重定向追加:uname -p >> a.txt //将处理器类型追加到a.txt重定向输入:vim pass.txt123456passwd –stdin jerry
tail -2 /etc/shadow //查看用户密码信息后两行将左侧的命令输出结果,作为右侧命令的处理对象cat a.txt |grep “123” //筛选出含字符串“123”的行grep “bash$” /etc/passwd | awk -F: ‘{ print $1,$7 }’ //-F:后要求有空格例:提取根分区/的磁盘使用情况df -hT //查看磁盘使用情况-h显示更易读-T显示文件系统类型df -hT | grep “/$” | awk ‘{print $6}’shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。格式:变量名=变量值格式:echo $变量名echo命令的选项:-n:取消自动换行-e:使用转义字符,把字符串中某些字符当成特殊字符处理t:制表符n:换行符b:删除前一个字符f:换行但光标仍旧停留在原来的位置r:光标移至行首,但不换行赋值时使用引号双引号:允许通过$符号引用其他变量值单引号:禁止引用其他变量值,$视为普通字符反撇号:命令替换,提取命令执行后的输出结果格式: read [-p “提示信息”] 变量名Shell变量的数值运算多用于脚本程序的过程控制,只能进行整数运算,不支持小数 运算。整数的运算主要通过内部命令Expr进行。格式:expr 变量1 运算符 变量2 [运算符 变量3]… //注意空格常用运算符:加(+)、减(-)、乘(*)、除(/)、取模(%)例:设置X(值为35)、Y(值为16)两个变量,并进行加、减、乘、除、取模运算X=35Y=16expr $X + $Yexpr $X – $Yexpr $X * $Y //乘法符号在shell中有其它含义,运算时需要转意符号expr $X / $Yexpr $X % $Y由系统提前创建,用来设置用户的工作环境配置文件:/etc/profile 、~/.bash_profileenv :查看当前工作环境下的环境变量。这表示为 $n,n为1~9之间的数字例:编写一个加法运算的小脚本a.sh,用来计算两个整数的和。需要计算的两个整数在执行脚本时以位置变量的形式提供。#vim a.sh#!/bin/bashSUM=`expr $1 + $2`echo “$1 + $2 = $SUM”#chmod +x a.sh#./a.sh 12 24 //$1为12、$2为24是由Bash程序预先定义好的一类特殊变量,使用”$”符号和另一个符号组合表示。$# :命令行中位置变量的个数$* :所有位置变量的内容$? :表示上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错$0 :当前执行的进程/程序名例:编写一个备份小脚本#vim mybak.sh#!/bin/bashTARFILE=beifen-`date +%s`.tgztar zcf $TARFILE $* &> /dev/nullecho “已执行$0脚本,”echo “共完成$#个对象的备份”echo “具体内容包括:$*”#chmod +x mybak.sh#./mybak.sh /boot/grub#./mybak.sh /etc/passwd /etc/shadow测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值格式1:test 条件表达式格式2:[ 条件表达式 ] //注意空格,中括号与表达式之间有空格执行条件测试操作以后,通过预定义变量”$?”获取返回状态值。根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、 可写、可执行等。用法:[ 操作符 文件或目录 ]-d:测试是否为目录(Directory)-e:测试目录或文件是否存在(Exist)-f:测试是否为文件(File)-r:测试当前用户是否有权读取(Read)-w:测试当前用户是否有权写入(Write)-x:测试是否设置有可执行权限(Excute)例:[ -d /media/cdrom ]echo $?0 //返回0表示条件成立,返回1表示条件不成立使用逻辑与”&&”和echo命令一起更直观的显示结果[ -d /media/cdrom ] $$ echo “yes”yes根据给定的两个整数值,判断第一个与第二个数的关系用法:[ 整数1 操作符 整数2]-eq:等于(Equal)-ne:不等于(Not Equal)-gt:大于(Greater Than)-lt:小于(Lesser Than)-le:小于或等于(Lesser or Equal)-ge:大于或等于(Greater or Equal)例:判断当前已登录的用户数,超出五个时输出”Too many”Unum=`who | wc -l` //查看当前已登录用户数[ $Unum -gt 5 ] && echo “Too many.”通常用来检查用户输入、系统环境等是否满足条件用法1:[ 字符串1 = 字符串2] [ 字符串1 != 字符串2 ]用法2:[ -z 字符串 ] //检查是否为空通用 :[ 字符串1 操作符 字符串2 ]例1:判断当前系统语言,不是”http://en.US”时输出”Nothttp://en.US”echo $LANG[ $LANG != “http://en.US” ] && echo “Nothttp://en.US”例2:用户需输入yes或no来确认操作read -p “是否覆盖现有文件(yes/no)?” ACK[ $ACK = “yes” ] && echo “覆盖”read -p “是否覆盖现有文件(yes/no)?” ACK[ $ACK = “no” ] $$ echo “不覆盖”判断两个或多个条件之间的关系用法1:[ 表达式1 ] 操作符 [ 表达式2 ]用法2:命令1 操作符 命令2&& :逻辑与,“而且”,使用test命令时可改为”-a”|| :逻辑或,“或者”,使用test命令时可改为”-o”! :逻辑否,“不”例:测试当前系统内核版本是否符合要求uname -rMnum=$(uname -r | awk -F. ‘{print $1}’)Snum=$(uname -r | awk -F. ‘{print $2}’)[ $Mnum -eq 2 ] && [ $Snum -gt 4 ] && echo “符合要求”根据复杂程度:单分支的if语句,双分支的if语句,多分支的if语句只有条件成立时才会执行一条相应的代码用法:if 条件测试then 命令序列fi例:判断挂载点目录是否存在,若不存在则新建此目录vim chkmountdir.sh#!/bin/bashMOUNT_DIR=”/media/cdrom/”if [ ! -d $MOUNT_DIR ]thenmkdir -p $MOUNT_DIRfichmod +x chkmountdir.sh //给chkmountdir.sh执行的权限./chkmountdir.sh用法:if 条件测试操作then 命令序列1else 命令序列2fi例:检查目标主机是否能连通,显示相应信息vim pinghost.sh#!/bin/bashping -c 3 -i 0.2 -w 3 $1 &> /dev/null //命令执行时的消息都不看if [ $? -eq 0] //判断前一条命令的返回状态thenecho “Host $1 is up.”elseecho “Host $1 is down.”fichmod +x pinghost.sh./pinghost.sh 192.168.4.11用法:if 条件测试操作1then 命令序列1elif 条件测试操作2then 命令序列2else命令序列3fi例:判断分数范围,分出优秀、合格、不合格三挡vim gradediv.sh#!/bin/bashread -p “请输入您的分数(0-100):” GRADEif [ $GRADE -ge 85 ] && [ &GRADE -le 100 ]thenecho “$GRADE 分!优秀”elif [ $GRADE -ge 70 ] && [ &GRADE -le 84 ]thenecho “$GRADE 分,合格”elseecho “$GRADE分?不合格”fichmod +x gradediv.sh./gradediv.sh读取不同的变量,用来逐个执行同一组命令用法:for 变量名 in 取值列表do命令序列done例1:根据姓名列表批量添加用户vim /root/users.txt //用做测试列表文件jdyttltccvim uaddfor.sh#!/bin/bashULIST=$(cat /root/users.txt)for UNAME in $ULIST //从列表文件读取用户名douseradd $UNAMEecho “123456” | passwd –stdin $UNAME &> /dev/null//通过管道指定密码字串donechmod +x uaddfor.sh./uaddfor.shtail -3 /etc/passwd例2:根据IP地址列表检查主机状态vim /root/ipadds.txt192.168.4.11192.168.4.100192.168.4.120vim chkhosts.sh#!/bin/bashHLIST=$(cat /root/ipadds.txt)for IP in $HLISTdoping -c 3 -i 0.2 -W 3 $IP &> /dev/nullif [ $? -eq 0 ] //嵌套if语句判断连通性thenecho “Host $IP is up.”elseecho “Host $IP is down.”fidonechmod +x chkhosts.sh./chkhosts.shfor循环语句非常适合用于列表对象无规律,且列表来源已经固定。而对于要求控制循环次数,操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合while循环语句。重复测试某个条件,只要条件成立则反复执行用法:while 条件测试操作do命令序列done例:批量添加规律编号的用户#vim uaddwhile.sh#!/bin/bashPREFIX=”stu”i=1while [ $i -le 20 ]douseradd ${[PREFIX}$iecho “123456” | passwd –stdin ${PREFIX}$i &> /dev/nulllet i++ //序号递增,避免死循环donechmod +x uaddwhile.sh./uaddwhile.shgrep “stu” /etc/passwd | tail -3例:猜价格游戏,要求由脚本预先生成一个随机的价格数目(0-99)作为实际价格,判断用户猜测得价格是否高出或低于实际价格,给出相应的提示后再次要求用户猜测,直到用户猜中实际价格为止,输出用户共猜测的次数、实际价格。#vim pricegame.sh#!/bin/bashPRICE=$(expr $RANDOM % 1000) //输入price一个随机数TIMES=0echo “商品实际价格范围为0-999,猜猜看是多少?”while true //循环条件:truedoread -p “请输入你猜测的价格数目:” INTlet TIMES++if [ $INT -eq $PRICE ] ; t免费云主机域名henecho “恭喜你答对了,实际价格是$PRICE”echo “你总共猜测了$TIMES次”exit 0elif [ $INT -gt $PRICE ] ; thenecho “太高了!”elseecho “太低了!”fidonechmod +x pricegame.sh./pricegame.sh针对变量的不同取值,分别执行不同的命令序列用法:case 变量值 in模式1)命令序列1;;模式2)命令序列2;;……*)默认命令序列esac例:检查用户输入的字符类型提示用户从键盘输入一个字符,通过case语句判断该字符是否为字母、数字或者其他控制字符,并给出相应的提示信息。#vim hitkey.sh#!/bin/bashread -p “请输入一个字符,并按Enter键确认:” KEYcase “$KEY” in[a-z] || [A-Z])echo “你输入的是 字母.”;;[0-9])echo “你输入的是 数字.”;;*)echo “你输入的是 空格、功能键或其他控制字符.”esacchmod -x hitkey.sh./hitkey.shsed是stream editor(流编辑器)的缩写,是一种在线编辑器,它一次处理一行内容。sed是非交互式的编辑器。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。格式:sed+[选项]+‘命令’+文件名常用选项:-n :取消默认输入-e :多项编辑-i :直接修改读取的档案内容,而不是由屏幕输出常用命令:a :当前行后添加行i :当前行前添加行c :用字符串替换行d :删除行p :打印行s :用一个字符串替换另一个w :将所选的行写入文件用于‘命令’之前,决定对哪些行进行编辑。如果没有指定地址,sed将处理输入文件的所有行。1.地址是一个数字,则表示行号;是“$”符号,则表示最后一行。2.地址可以指定范围,当需指定范围时使用逗号(,)隔开。1.p命令格式:sed -n ‘行号p’ 文件名2.d命令格式:sed -n ‘行号d’ 文件名3.s命令格式:sed -n ‘行号s/a/b/g’文件名将文件中指定行里所有的a字符替换为b字符,g为全局变量4.i命令格式:sed -i ‘行号3d’文件名直接修改文件内容,不打印在屏幕上5.e命令格式:sed -e ‘3d’ -e ‘4p’ 文件名先删除第三行,再打印第四行字符awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。1.格式:awk ‘ pattern {action} ‘pattern常指关系表达式,例如:awk‘/a/’file——显示文件中包含a的行awk‘$2>10’file——显示第二列中数字大于10的行2. 分隔提取:awk –F“分隔符”‘{print $1}’例如:awk –F.‘{print $1, print $2}’表示以点为分隔符将每一行的前二个字段,分行输出判定输入ip的有效性:vim a.sh#!/bin/bashread -p “请输入ip:” AB=`echo $A |awk -F. “{print $1}”`if [ $B -le 0 ] || [ $B -gt 255 ]then echo “请输入正确的IP”elseecho “ok”fichmod +x a.shsh a.sh例1:编写一个系统服务脚本vim myprog#!/bin/bashcase “$1” instart)echo -n “正在启动sleep服务…”if sleep 7200 &thenecho “OK”fi;;stop)echo -n “正在停止sleep服务…”pkill “sleep” &> /dev/sullecho “OK”;;status)if pgerp “sleep” &> /dev/sull ;thenecho “sleep服务已经启动.”elseecho “sleep服务已经停止.”fi;;restart)$0 stop$0 start;;esacchmod +x myprog./myprog start例2: shell打印九九乘法表使用for循环for i in $(seq 1 9)dofor j in $(seq 1 $i)doecho -n “$j * $i” = $[i * j] “ ”doneechodone//例中$[i * j]可写为:$((i * j))、$[$j*$i]、$(( $j * $i ))、`expr $i * $j`//修改:第二个do下加一行 let “temp = i * j”,再把$[i * j]改为:$tempwhile 反向的乘法表:i=9j=1while ((i>=1))dowhile ((j
doecho -n “$j * $i”=$[$j * $i] “ ”let j++donelen j=1let i–echo “”done关于“LINUX中shell脚本编程的方法是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“LINUX中shell脚本编程的方法是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注云编程开发博客行业资讯频道。

相关推荐: 如何在AD中方便查询被锁定的帐号状态和特定条件的查询被锁定的帐号

你们有没有试过这样一个情况,为了加强AD域的帐号安全,防止帐号被恶意的密码枚举,所以在AD域中设置了帐号锁定的策略,当你设置了帐号锁定策略之后,发现真的有很多的用户反馈帐号用不了了,查看这个用户的帐号时原来已经被锁定了,这时肯定就需要解锁。上了帐号锁定策略后,…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/06 10:29
下一篇 02/06 10:30