Shell脚本例子集合

合集下载

shell循环详解及实例

shell循环详解及实例

shell循环详解及实例⼀、条件选择、判断(if、case)1.1 if语句⽤法及实例当我们在脚本中遇到需要判断的时候,我们就可以⽤if语句来实现。

具体的语法如下:单分⽀if 判断条件;then 条件为真的分⽀代码 fi双分⽀if 判断条件; then条件为真的分⽀代码else条件为假的分⽀代码fi多分⽀if 判断条件1; then条件为真的分⽀代码elif 判断条件2; then条件为真的分⽀代码elif 判断条件3; then条件为真的分⽀代码else以上条件都为假的分⽀代码fi在多分⽀中,系统会逐条判断你写⼊的条件,第⼀次遇到“真”条件时,执⾏该分⽀,⽽后结束整个if语句。

注意:1、if和fi是成对出现的2、if语句可以嵌套。

Example:1)判断两个数字的⼤⼩1 #!/bin/bash2 #定义变量3 read -p "Please input the first num:" num14 read -p "Please input the second num:" num25 #判断数字是否符合标准6 if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then7 # 判断两个数字的⼤⼩并输出判断结果8 if [ $num1 -lt $num2 ];then9 echo "The num2 is biger than the num1"10 elif [ $num1 -eq $num2 ];then11 echo "Two numbers equal"12 else13 echo "The num1 is biger than the num2"14 fi15 else16 echo "Please enter the correct number"17 fi1819 #删除变量20 unset num1 num22)编写脚本/root/bin/createuser.sh,实现如下功能:使⽤⼀个⽤户名做为参数,如果指定参数的⽤户存在,就显⽰其存在,否则添加之;显⽰添加的⽤户的id号等信息1 #!/bin/bash2 #定义变量3 read -p "请输⼊⼀个⽤户名:" name4 #判断⽤户名是否存在5 if `id $name &> /dev/null`;then6 # 若存在,则输出ID等信息7 echo "⽤户存在,⽤户的ID信息为:`id $name`"8 else9 # 若不存在,则添加⽤户,设置密码为随机8位,下次登录时提⽰修改密码,同时显⽰ID等信息10 passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`11 `useradd $name &> /dev/null`12 `echo "$passwd" | passwd --stdin $name &> /dev/null`13 echo "⽤户名:$name 密码: $passwd" >> user.txt14 `chage -d 0 $name`15 echo "⽤户已添加,⽤户的ID信息为:`id $name` 密码为:$passwd"16 fi1718 #删除变量19 unset name passwd1.2 case⽤法及实例当涉及到多个条件匹配的时候,我们⽤if可能就很⿇烦了,这个时候,我们就可以⽤case来编写这个脚本。

Shell 经典实例

Shell 经典实例

Thizlinux 系统教程 Shell 经典实例----------------Milo经典小shell1 列目录树的shell脚本如下:#!/bin/sh# dtree: Usage: dtree [any directory]dir=${1:-.}(cd $dir; pwd)find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g"2 while中使用read (file是一个文件)cat file | while read linedoecho $lineecho " :: Please input any key(s):c"str4read=""while truedochr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null`str4read=$str4read$chr4readif [ "$chr4read" = "" ] ;then break; fidoneecho " :: |$str4read|"done3 将多个空格替换为字符sed 's/[ ][ ]*/ /g'如果空格与tab共存时用sed -e 's/[[:space:]][[:space:]]*/ /g' filename4用脚本实现分割文件#!/bin/bashif [ $# -ne 2 ]; thenecho 'Usage: split file size(in bytes)'exitfifile=$1size=$2if [ ! -f $file ]; thenecho "$file doesn't exist"exitfi#TODO: test if $size is a valid integerfilesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesizelet pieces=$filesize/$sizelet remain=$filesize-$pieces*$sizeif [ $remain -gt 0 ]; thenlet pieces=$pieces+1fiecho pieces: $piecesi=0while [ $i -lt $pieces ];doecho split: $file.$i:dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1doneecho "#!/bin/bash" > mergeecho "i=0" >> mergeecho "while [ $i -lt $pieces ];" >> mergeecho "do" >> mergeecho " echo merge: $file.$i" >> mergeecho " if [ ! -f $file.$i ]; then" >> mergeecho " echo merge: $file.$i missed" >> mergeecho " rm -f $file.merged" >> mergeecho " exit" >> mergeecho " fi" >> mergeecho " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge echo " let i=$i+1" >> mergeecho "done" >> mergechmod u+x merge'5得到上月未日期,格式为YYYYMMDDget_lastday_of_lastmonth(){yy=`date +%Y`mm=`date +%m-1|bc`[ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1`aaa=`cal $mm $yy`dd=`echo $aaa|awk '{print $NF}'`echo $yy$mm$dd}print $NF的$NF是打印最后一个列。

经典shell 脚本实例

经典shell 脚本实例

fi
done
#!/bin/bash
if [ $# -le 0 ]
then
echo "Not enough parameters"
exit 1
fi
#string="2 3 4 5 6"
#set string
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。#!/bin/sh
unset var
while [ "$var" != "end" ]
do
echo -n "please input a number: "
ቤተ መጻሕፍቲ ባይዱ
read var
if [ "$var" = "end" ]
then
break
fi
Linux shell 脚本实例
1. 写一个脚本,利用循环计算 10 的阶乘#!/bin/sh
factorial=1
for a in `seq 1 10`
do
factorial=`expr $factorial \* $a`
done
echo "10! = $factorial"
2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打
esac done #! /bin/sh a=10 b=20 c=30 value1=`expr $a + $b + $c` echo "The value of value1 is $value1" value2=`expr $c / $b` echo "The value of value2 is $value2" value3=`expr $c * $b` echo "The value of value3 is $value3" value4=`expr $a + $c / $b` echo "The value of value4 is $value4" var4=`expr $value4 - $value2` echo $var4

centosshell脚本编程1正则shell脚本结构read命令date命令的用法she。。。

centosshell脚本编程1正则shell脚本结构read命令date命令的用法she。。。

centosshell脚本编程1正则shell脚本结构read命令date命令的⽤法she。

centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的⽤法 shell中的逻辑判断 if 判断⽂件、⽬录属性 shell数组简单⽤法 $( )和${ } 和$(( )) 与 sh -n sh -x sh -v 第三⼗五节课Shebang/Sha-bang在计算机科学中, Shebang (也称为Hashbang)是⼀个由井号和叹号构成的字符串⾏(#!), 其出现在⽂本⽂件的第⼀⾏的前两个字符.在⽂件中存在Shebang的情况下, 类Unix操作系统的程序载⼊器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调⽤该指令, 并将载有Shebang的⽂件路径作为该解释器的参数. 例如, 以指令#!/bin/sh开头的⽂件在执⾏时会实际调⽤/bin/sh程序.)#!⽤于帮助内核找到相应的解释器,只有被直接执⾏的⽂件中才有必要加⼊#!Shebang指明了执⾏这个脚本⽂件的解释程序。

1. 如果脚本⽂件中没有#!这⼀⾏,那么它执⾏时会默认⽤当前Shell去解释这个脚本(即:$SHELL环境变量)。

2. 如果#!之后的解释程序是⼀个可执⾏⽂件,那么执⾏这个脚本时,它就会把⽂件名及其参数⼀起作为参数传给那个解释程序去执⾏。

3. 如果#!指定的解释程序没有可执⾏权限,则会报错“bad interpreter: Permission denied”。

如果#!指定的解释程序不是⼀个可执⾏⽂件,那么指定的解释程序会被忽略,转⽽交给当前的SHELL去执⾏这个脚本。

4. 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。

注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会⾃动到$PATH中寻找解释器的。

shell脚本常用命令

shell脚本常用命令

shell脚本常⽤命令shell基本命令1.#!/bin/sh是指此脚本使⽤/bin/sh来解释执⾏。

解释:#! 是⼀个约定的标记,它告诉系统这个脚本需要什么解释器来执⾏,即使⽤哪⼀种 Shell。

2.echo 命令⽤于向窗⼝输出⽂本。

举例:echo "Hello World !"3.your_name="qinjx"赋值变量echo ${your_name}打印变量;使⽤变量的时候加括号和美元符4.chmod +x ./test.sh #使脚本具有执⾏权限./test.sh #执⾏脚本chmod 777 /tmp -R 意思是把tmp⽂件夹及其⼦bai⽂件夹的权限全部修改为777解释语句⼀:ping -c 5 > /dev/null 2>&11. ping -c 5 -c<完成次数>:设置完成要求回应的次数;2. >/dev/null这条命令的作⽤是将标准输出1重定向到/dev/null中。

/dev/null代表linux的空设备⽂件,所有往这个⽂件⾥⾯写⼊的内容都会丢失,俗称“⿊洞”。

那么执⾏了>/dev/null之后,标准输出就会不再存在,没有任何地⽅能够找到输出的内容。

3. 2>&1这条命令⽤到了重定向绑定,采⽤&可以将两个输出绑定在⼀起。

这条命令的作⽤是错误输出将和标准输出同⽤⼀个⽂件描述符,说⼈话就是错误输出将会和标准输出输出到同⼀个地⽅。

linux在执⾏shell命令之前,就会确定好所有的输⼊输出位置,并且从左到右依次执⾏重定向的命令,所以>/dev/null 2>&1的作⽤就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重⽤了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。

执⾏了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到⽂件中。

常用shell脚本指令

常用shell脚本指令

常用shell脚本命令1、显示包含文字aaa的下一行的内容:sed -n '/aaa/{n;p;}' filename2、删除当前行与下一行的内容:sed -i '/aaa/{N;d;}' filename3、删除当前行与下两行的内容:sed -i '/aaa/{N;N;d;}' filename依次类推,删除三行,则为{N;N;N;d;},分析知:N为next4、得出以空格为分割的字符串中单词的个数,即统计个数:awk ' { print NF } '如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f则执行 echo $VALUE | awk ' { print NF } ' 后的结果为65、在linux中建立一个文件与另一文件的链接,即符号链接ln -s /var/named/chroot/etc/named.conf named.conf这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf 的符号链接。

即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf ,这时用ll命令查看的结果如:lrwxrwxrwx 1 root root 32 Mar 22 12:29 named.conf ->/var/named/chroot/etc/named.conf注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。

所以需对实际文件进行删除操作。

6、显示指定字符范围内的内容:如:显示文件test.txt中字符#test begin与#test end之间所有的字符sed -n "/#test begin/,/#test end/p" test.txt或 awk "/#test begin/,/#test end/" test.txt在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.1. 单引号和双引号的区别单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。

shell脚本100例、练习使用

shell脚本100例、练习使用

shell脚本100例、练习使⽤1、编写hello world脚本#!/bin/bashecho"hello world"2、通过位置变量创建linux系统账户和密码#!/bin/bash#$1是执⾏脚本第⼀个参数 $2是执⾏脚本第⼆个参数useradd "$1"echo"$2" | passwd --stdin "$1"#测试脚本[root@template-host sh1]# sh2.sh aaa 123Changing password for user aaa.passwd: all authentication tokens updated successfully.#测试登录[root@template-host sh1]# su - aaa[aaa@template-host ~]$3、每周五使⽤tar命令备份 /var/log下的所有⽇志⽂件#!/bin/bashtar -czPf log-`date +%y%m%d`.tar.gz /var/log #加P是因为如果不加会出现错误:tar: Removing leading `/' from member names date和+之间注意有空格。

修改系统参数[root@template-host sh1]# crontab -e00 03 * * 5 /data/sh1/3.sh4、⼀键部署LNMP(RPM包版本)#!/bin/bash#此脚本需要提前配置yum源,否则⽆法配置成功。

本脚本使⽤于7.4yum -y install httpdyum -y install mariadb mariadb-devel mariadb-serveryum -y install php php-mysqlsystemctl start httpd mariadb #启动httpd、mariadbsystemctl enable httpd mariadb #加⼊开机⾃启动systemctl status httpd mariadb #查看是否成功5、实时监控本机硬盘内存剩余空间,剩余内存空间⼩于500M,根分区剩余空间⼩于1000M时,发送警报信息到命令⾏#!bin/bash#提取分区剩余空间单位:kbdisk_size=$(df / | awk'/\//{print $4}')#提取内存空间单位Mmem_size=$(free -m | awk'/Mem/{print $4}')while :doif [ $disk_size -le 512000 -o $mem_size -le 1024 ];thenecho"警报:资源不⾜"sleep5fidone6、随机⽣成⼀个100以内的随机数,提⽰⽤户猜数字,提⽰⽤户猜⼤了、猜⼩了、猜对了,直⾄⽤户猜对,脚本结束。

一些基础但有趣的shell脚本

一些基础但有趣的shell脚本

⼀些基础但有趣的shell脚本⼀.打印9*9乘法表1 #!/bin/bash2for i in `seq 9`3do4for j in `seq $i`5do6echo -n "$i*$j=$[i*j]"7done8echo9done⼆.剪⼑⽯头布⼩游戏1 #!/bin/bash2 game=(⽯头剪⼑布)3 num=$[RANDOM%3]4 computer=${game[$num]}5 #随机⽣成出拳可能并存⼊数组game[$num]:game[0],game[1],game[2]分别代表⽯头,剪⼑,布6echo"请根据以下提⽰选择出拳⼿势"7echo"⽯头:1 剪⼑:2 布:3"8 read -p "请出拳:(1,2,3)": person9case $person in101)11if [ $num -eq 0 ];then12echo"平局"13elif [ $num -eq 1 ];then14echo"你赢"15else16echo"计算机赢"17fi;;182)19if [ $num -eq 0 ];then20echo"计算机赢"21elif [ $num -eq 1 ];then22echo"平局"23else24echo"你赢"25fi;;263)27if [ $num -eq 0 ];then28echo"你赢"29elif [ $num -eq 1 ];then30echo"计算机赢"31else32echo"平局"三.猜数字⼩游戏1 #!/bin/bash2 #脚本⽣成⼀个100以内的随机数,提⽰⽤户猜数字,根据⽤户的输⼊,>提⽰猜对了,猜⼤了或猜⼩了,直到⽤户猜对为⽌.3 num=$[RANDOM%100+1] #1~100的随机数4 read -p "计算机已⽣成⼀个1~100的随机数,请您猜:" cai15 l=06while :7do8 let l++9if [ $l -eq 1 ];then10if [ $cai1 -eq $num ];then11echo"恭喜,猜对了"12 exit13elif [ $cai1 -gt $num ];then14echo"猜⼤了"15else16echo"猜⼩了"17fi18else19 read -p "请继续:" cai220if [ $cai2 -eq $num ];then21echo"恭喜,猜对了"22 exit23elif [ $cai2 -gt $num ];then24echo"猜⼤了"25else26echo"猜⼩了"27fi28fi29done四.给三个随机数字排序1.交互式1 #!/bin/bash2 #依次提⽰⽤户输⼊三个整数,脚本根据数字⼤⼩排序输出3个数字3 read -p "请输⼊⼀个整数:" num14 read -p "请输⼊⼀个整数:" num25 read -p "请输⼊⼀个整数:" num36 #从⼩到⼤排序,设定最后输出num1,num2,num3,脚本运⾏中将最⼩,中间,最⼤值分别赋予这三个变量,引⼊对调变量tmp7 tmp=08 #如果num1⼤于num2则对调1和2,保持num1最⼩9if [ $num1 -gt $num2 ];then10 tmp=$num111 num1=$num212 num2=$tmp13fi14 #如果num1⼤于num3则对调1和3,保持num1最⼩15if [ $num1 -gt $num3 ];then16 tmp=$num117 num1=$num318 num3=$tmp19fi20 #如果num2⼤于num3则对调2和3,保持num2更⼩21if [ $num2 -gt $num3 ];then22 tmp=$num223 num2=$num324 num3=$tmp25fi26echo"排序后的数据为:$num1,$num2,$num3"2.⾮交互式1 #!/binbash2 l=03 tmp=04for i in `cat /home/student/桌⾯/shell脚本/⽂档/paixu.txt` #⼀个含3个数字的⽂件 6do7 let l++8if [ $l -eq 1 ];then9 num1=$i10fi11if [ $l -eq 2 ];then12 num2=$i13if [ $num1 -gt $num2 ];then14 tmp=$num115 num1=$num216 num2=$tmp17fi18fi19if [ $l -eq 3 ];then20 num3=$i21if [ $num1 -gt $num3 ];then22 tmp=$num123 num1=$num324 num3=$tmp25fi26if [ $num2 -gt $num3 ];then27 tmp=$num228 num2=$num329 num3=$tmp30fi31fi32done33echo"从⼩到⼤排序:$num1,$num2,$num3"五.点名器1 #!/bin/bash2 #提前准备⽂件user.txt,⼀⾏⼀个姓名3 read -p "请输⼊想要抽到的⼈数:" xxx4 l=15while [ $l -le $xxx ]6do7 let l++8 line=`cat /home/student/桌⾯/shell脚本/⽂档/user.txt | wc -l`9 num=$[RANDOM%line+1]10sed -n "${num}p" /home/student/桌⾯/shell脚本/⽂档/user.txt11sleep0.512done六.打印国际象棋棋盘1 #!/bin/bash2 #两个变量i和j代表⾏和列3for i in {1..8}4do5for j in {1..8}6do7sum=$[i+j]8if [ $[sum%2] -eq 0 ];then #偶数9echo -ne "\033[46m \033[0m"10else11echo -ne "\033[47m \033[0m"12fi13done14echo15done七.fork炸弹(会快速消耗计算机资源,导致计算机死机)(请在虚拟机中实验,千万不要在真机尝试,若操作失误请重启计算机)1 .(){2 .|.&3 }4 .⼋.打印斐波那契数列(后⼀个数字永远是前两个数字之和)1 #!/bin/bash2 list=(01)3for i in `seq211`4do5 list[$i]=`expr ${list[-1]} + ${list[-2]}`6done7echo ${list[@]}九.打印⼀些特殊图形1 #!/bin/bash2clear3for ((i=1;i<=9;i++))4do5for((j=1;j<=i;j++))6do7echo -n "$i"8done9echo""10done11 #图11213 read -n1 "按任意键继续" key14clear15for ((i=1;i<=5;i++))16do17for((j=1;j<=i;j++))18do19echo -n "|"20done21echo"_"22done23 #图22425 read -n1 "按任意键继续" key 26clear27for ((i=1;i<=5;i++))28do29for((j=1;j<=i;j++))30do31echo -n "*"32done33echo""34done3536for ((i=5;i>=1;i--))37do38for((j=1;j<=i;j++))39do40echo -n "*"41done42echo""43done44 #图3。

Linux系统自动化运维脚本使用Shell脚本实现对Linux系统运维工作的自动化执行

Linux系统自动化运维脚本使用Shell脚本实现对Linux系统运维工作的自动化执行

Linux系统自动化运维脚本使用Shell脚本实现对Linux系统运维工作的自动化执行Linux系统的运维工作对于系统管理员来说是非常繁琐而重要的,为了提高效率和减少人为错误,自动化运维脚本被广泛使用。

而Shell脚本则是一种强大的工具,可以通过编写脚本来实现对Linux系统的自动化运维工作。

本文将通过介绍Shell脚本的基本用法和示例,探讨如何使用Shell脚本来实现对Linux系统的自动化运维。

一、Shell脚本的基本概念和用法Shell是一种命令行解释器,常用的有Bash、Csh、Ksh等。

Shell脚本是一系列Shell命令的集合,可以通过编写脚本来实现对系统的自动化操作。

下面是一些Shell脚本的基本用法:1. Shebang每个Shell脚本的第一行都需要指定Shebang,即告诉系统使用哪种Shell执行该脚本。

常见的Shebang是#!/bin/bash。

2. 变量的定义和使用Shell脚本使用变量可以方便地存储和操作数据。

变量的定义格式为:变量名=值,例如:name="John"。

使用变量时需要在变量名前加上美元符号,例如:echo $name。

3. 条件语句可以使用条件语句来实现根据条件执行不同的操作。

常见的条件语句有if语句和case语句。

例如:```if [ $num -gt 10 ]; thenecho "The number is greater than 10."fi``````case $fruit in"apple")echo "It's an apple.";;"orange")echo "It's an orange.";;*)echo "Unknown fruit.";;esac```4. 循环语句循环语句可以用来重复执行一段代码。

shell脚本基础(又长又详细)

shell脚本基础(又长又详细)

shell脚本基础(⼜长⼜详细)第⼗⼀章 BASH脚本(⼀)常见的Shell变量的类型包括环境变量、预定义变量、位置变量、⽤户⾃定义变量。

本节将分别学习这四种Shell变量的使⽤。

11. 1、 Shell的环境变量通过set命令可以查看系统中所有Shell变量(包括环境变量和⽤户⾃定义变量),由于内容输出较多,建议使⽤less命令分页查看。

常⽤环境变量:PATH 决定了shell将到哪些⽬录中寻找命令或程序HOME 当前⽤户主⽬录HISTSIZE 历史记录数LOGNAME 当前⽤户的登录名USER 当前⽤户名UID 当前⽤名的UIDHOSTNAME 指主机的名称SHELL 前⽤户Shell类型LANGUGE 语⾔相关的环境变量,多语⾔可以修改此环境变量MAIL 当前⽤户的邮件存放⽬录PS1 基本提⽰符,对于root⽤户是#,对于普通⽤户是$PS2 附属提⽰符,默认是“>”例:以分号分隔,显⽰当前的⽤户的⽤户名、宿主⽬录、登录Shell。

例:查看当前命令的搜索路径,并将/opt/bin⽬录添加到现有搜索路径中去,从⽽可以直接执⾏此⽬录中的命令。

环境变量的配置⽂件⽤户可在当前的Shell环境中直接为环境变量赋值,但需要长期变更所使⽤的某个环境变量时,可以修改配置⽂件。

在Linux系统中,⽤户环境变量的设置⼯作习惯上在 /etc/profile ⽂件及宿主⽬录中 .bash_profile⽂件中进⾏,前者称为全局配置⽂件(对所有⽤户起作⽤),后者称为⽤户配置⽂件(允许覆盖全局配置)。

例:在当前⽤户环境中,将⽤于限制历史命令的环境变量HISTSIZE的值改为100。

例:编辑“~/.bash_profile”⽂件,修改PATH的设置,以便⽤户在下次登录后能够使⽤服务/opt/bin ⽬录作为默认的搜索路径。

# vi /root/.bash_profielPATH=$PATH:$HOME/bin:/opt/binExport PATH11.2 Shell位置变量为了在使⽤Linux程序时,⽅便通过命令⾏给程序提供操作参数,Bash引⼊了位置变量的概念。

Shell脚本常用模板

Shell脚本常用模板

Shell脚本常⽤模板 作为⼀个运维⼈员编写Shell脚本是很平常的,⼀个格式好的脚本不仅赏⼼悦⽬,后期⾃⼰和别⼈也易于维护。

下⾯的脚本就是我⾃⼰的shell编写格式,如下:1 [root@mini05 20180930-2]# cat template.sh2 #!/bin/sh3 ################ Version Info ##################4 # Create Date: 2018-09-295 # Author: Zhang6 # Mail: zhang@7 # Version: 1.08 # Attention: shell脚本模板9 ################################################1011 # 加载环境变量12 # 如果脚本放到crontab中执⾏,会缺少环境变量,所以需要添加以下3⾏13 . /etc/profile14 . ~/.bash_profile15 . /etc/bashrc1617 # 脚本所在⽬录即脚本名称18 script_dir=$( cd "$( dirname "$0" )" && pwd )19 script_name=$(basename ${0})20 # ⽇志⽬录21 log_dir="${script_dir}/log"22 [ ! -d ${log_dir} ] && {23mkdir -p ${log_dir}24 }2526 errorMsg(){27echo"USAGE:$0 arg1 arg2 arg3"28 exit 229 }303132 doCode() {33echo $134echo $235echo $336 }3738 main() {39if [ $# -ne 3 ];then40 errorMsg41fi42 doCode "$1""$2""$3"43 }4445 # 需要把隐号加上,不然传⼊的参数就不能有空格46 main "$@"测试如下:1 [root@mini05 20180930-2]# ./template.sh2 USAGE:./template.sh arg1 arg2 arg33 [root@mini05 20180930-2]# ./template.sh1114 USAGE:./template.sh arg1 arg2 arg35 [root@mini05 20180930-2]# ./template.sh111'222 333'6 USAGE:./template.sh arg1 arg2 arg37 [root@mini05 20180930-2]# ./template.sh111'222 333'"444 555"811192223331044455511 [root@mini05 20180930-2]# ./template.sh111'222 333'"444 555""666"12 USAGE:./template.sh arg1 arg2 arg3。

shell脚本中的4种循环语句使用

shell脚本中的4种循环语句使用

shell脚本中的4种循环语句使⽤1、for循环#语法结构#第⼀种:取值变量for变量名in变量取值表do指令done#例⼦:#⽰例for a in {1..9}domkdir dir$adone#第⼆种:C语⾔型for循环for ((exp1; exp2; exp3))do指令done#例⼦:#⽰例for ((i=1;i<=3;i++))doecho $idone#解释:i从1开始,当i<=3就可以运⾏,如果运⾏的值⼤于3,就退出循环#语法结构讲解for关键字后的双括号是三个表达式,第⼀个是变量初始化(例如:i=1),第⼆个为变量的范围(例如i<=3),第三个为变量⾃增或⾃减(例如i++)。

当第⼀个表达式的初始化值符合第⼆个变量的范围时,就进⾏如循环执⾏,当条件不满⾜时就退出循环#简单⽰例#1.竖向打印10 9 8 7 6 5⼏个数字#第⼀种⽅法:直接列出元素[root@game scripts]# cat for1.sh#!/bin/bashfor i in12345doecho $idone#效果[root@game scripts]# sh for1.sh12345第⼆种⽅法:使⽤⼤括号{}⽣成数字序列[root@game scripts]# cat for2.sh#!/bin/bashfor i in {1..5}doecho $idone#效果[root@game scripts]# sh for2.sh12345#第三种⽅法:使⽤seq⽣成数字序列[root@game scripts]# cat for3.sh#!/bin/bashfor i in `seq 15`doecho $idone#效果[root@game scripts]# sh for3.sh12345#2.获取当前⽬录下的⽬录或⽂件名,并将其作为变量列表打印输出#数据[root@game ~]# mkdir -p /test/{test1.txt,test2.txt,guo.txt,ke.txt}[root@game ~]# ls -l /test/total 0drwxr-xr-x. 2 root root 6 Aug 2122:14 guo.txtdrwxr-xr-x. 2 root root 6 Aug 2122:14 ke.txtdrwxr-xr-x. 2 root root 6 Aug 2122:14 test1.txtdrwxr-xr-x. 2 root root 6 Aug 2122:14 test2.txt#编写脚本[root@game scripts]# cat for4.sh#!/bin/bashusage(){echo "directory not found"}[ ! -d /test ] && usage && exit 1cd /testfor i in `ls`doecho $idone#效果[root@game scripts]# sh for4.shguo.txtke.txttest1.txttest2.txt2、while循环#while循环⼀般应⽤于守护进程程序或⼀直循环执⾏#语法格式while <条件表达式>do指令done#简单⽰例每隔2秒在屏幕上输出⼀次负载值[root@game scripts]# cat while1.shwhile truedouptimesleep 2 #暂停2秒再执⾏done#提⽰:while true表⽰条件永远为真,因此会⼀直运⾏,像死循环⼀样,称为守护进程#效果:每隔2秒就输出⼀次[root@game scripts]# sh while1.sh23:11:35 up 2 days, 2:00, 2 users, load average: 0.00, 0.01, 0.0523:11:37 up 2 days, 2:00, 2 users, load average: 0.00, 0.01, 0.0523:11:39 up 2 days, 2:00, 2 users, load average: 0.00, 0.01, 0.053、until循环#until循环是当条件表达式不成⽴时,就会进⼊循环,当条件表达式成⽴时,就会终⽌循环#语法格式until <条件表达式>do指令done#⽰例#如果⽤户输出的是guoke就符合条件,退出循环,如果不是,⽤户输⼊3次之后就退出循环[root@game scripts]# cat until1.sh#!/bin/bashi=1until [ "$user" = "guoke" -o "$i" -gt 3 ]doread -p "please enter you username:" userlet i++done#效果[root@game scripts]# sh until1.shplease enter you username:guoke[root@game scripts]# sh until1.shplease enter you username:1please enter you username:1please enter you username:1[root@game scripts]#4、select循环#语法格式select变量名in [菜单取值列表]do指令done#⽰例#第⼀种:直接使⽤列表字符串[root@game scripts]# cat select1.sh#!/bin/bashselect name in apache httpd nginx tomcatdoecho $namedone#效果[root@game scripts]# sh select1.sh1) apache2) httpd3) nginx4) tomcat#? 1#? 3nginx#? 4tomcat#? ^C#第⼆种:采⽤数组做变量列表[root@game scripts]# cat select2.sh#!/bin/basharray=(apache nginx tomcat lighttpd)select name in"${array[@]}"doecho $namedone#效果[root@game scripts]# sh select2.sh1) apache2) nginx3) tomcat4) lighttpd#? 3tomcat#? 4lighttpd#? ^C5.循环控制及状态返回值break (循环控制)continue (循环控制)exit (退出脚本)return (退出函数)#区别break continue在条件语句及循环语句(for if while等)中⽤于控制程序的⾛向exit是终⽌所有语句并退出脚本return:仅⽤于在函数内部返回函数执⾏的状态值#break⽰例#如果i等于3,那么就终⽌循环[root@game scripts]# cat break1.sh#!/bin/bashfor ((i=0;i<=5;i++))doif [ $i -eq 3 ];thenbreakelseecho $ifidoneecho "1111"yum install net-tools -y > /dev/null[ $? -eq 0 ] && echo "already install"#效果[root@game scripts]# sh break1.sh121111already install#说明:i等于3的时候就终⽌循环,但是没有跳出脚本#exit⽰例[root@game scripts]# cat exit1.sh#!/bin/bashfor ((i=0;i<=5;i++))doif [ $i -eq 3 ];thenexit 1fiecho $idoneecho "ok"#执⾏效果[root@game scripts]# sh exit1.sh12#说明:当i等于3的时候就会退出脚本了,就不会执⾏后⾯的语句#continue⽰例[root@game scripts]# cat con1.sh#!/bin/bashfor ((i=0;i<=5;i++))doif [ $i -eq 3 ];thencontinueelseecho $ifidoneecho "ok"#执⾏效果[root@game scripts]# sh con1.sh。

shell脚本四种数值计算方式

shell脚本四种数值计算方式

shell脚本四种数值计算方式在shell脚本中,可以使用四种不同的计算方式来进行数值计算:表达式求值、命令替换、算术运算和高级数学函数。

1.表达式求值:表达式求值是最简单的一种计算方式,只需要将数学表达式放在$(())中。

例如:```result=$(( 5 + 3 ))echo $result```在这个例子中,表达式求值计算了5 + 3,并将结果赋给变量result。

然后,使用echo命令打印出了结果。

2.命令替换:命令替换是一种在数学计算中使用shell命令的方式。

通过将命令放在$(中,shell会先执行该命令,然后将命令的输出结果作为数值计算的一部分。

例如:```result=$(expr 5 + 3)echo $result```在这个例子中,命令替换使用了expr命令来计算5 + 3的结果,并将结果赋给变量result。

然后,使用echo命令打印出了结果。

3.算术运算:除了使用$(( ))和$(进行计算,shell还提供了一些算术运算符来进行数值计算。

例如:```result=`expr 5 + 3`echo $result```在这个例子中,使用了expr命令和反引号(``)来执行数学计算。

结果与前两种方式相同。

4.高级数学函数:在shell脚本中,可以使用数学函数来执行更复杂的数值计算。

有一些内置的数学函数,如sqrt、sin、cos等,可以通过shell的数学库调用。

例如:```result=$(echo "sqrt(4)" , bc -l)echo $result```在这个例子中,先使用echo命令将数学表达式"sqrt(4)"输出给bc 命令,bc命令会执行计算并将结果输出。

然后,命令替换将结果赋给变量result,并使用echo命令打印出了结果。

总结:以上是四种常用的shell脚本中进行数值计算的方式。

表达式求值、命令替换和算术运算是最常见的方式,适合于简单的数学计算。

shell if语句案例

shell if语句案例

shell if语句案例摘要:1.Shell if 语句概述2.Shell if 语句案例一:判断文件是否存在3.Shell if 语句案例二:判断文件是否可读4.Shell if 语句案例三:判断目录是否存在5.Shell if 语句案例四:综合案例正文:【Shell if 语句概述】在Shell 脚本编程中,if 语句是一种条件判断语句,可以根据指定的条件执行相应的操作。

if 语句的基本语法结构如下:```if 条件; then操作elif 条件; then操作else操作fi```【Shell if 语句案例一:判断文件是否存在】在Shell 脚本中,我们可以使用if 语句判断一个文件是否存在。

下面是一个示例:```bash#!/bin/bashfile="example.txt"if [ -f "$file" ]; thenecho "文件存在"elseecho "文件不存在"fi```【Shell if 语句案例二:判断文件是否可读】我们还可以使用if 语句判断一个文件是否可读。

以下是一个示例:```bash#!/bin/bashfile="example.txt"if [ -r "$file" ]; thenecho "文件可读"elseecho "文件不可读"fi```【Shell if 语句案例三:判断目录是否存在】同样地,我们也可以使用if 语句判断一个目录是否存在。

shellsleep用法

shellsleep用法

shellsleep用法在Shell脚本中,`sleep`是一个常用的命令,用于暂停脚本的执行一段时间。

##1.语法`sleep`命令的语法如下:```shellsleep NUMBER[SUFFIX]...```其中,`NUMBER`表示要暂停的时间,可以是整数或小数,单位是秒。

可选的`SUFFIX`可以是以下几种单位:-`s`:秒(默认单位)-`m`:分钟-`h`:小时-`d`:天##2.示例下面是一些`sleep`命令的示例:###示例1:暂停脚本执行5秒钟```shellsleep 5```这将暂停脚本的执行5秒钟。

###示例2:暂停脚本执行10分钟```shellsleep 10m```这将暂停脚本的执行10分钟。

###示例3:暂停脚本执行1小时30分钟```shellsleep 1h30m```这将暂停脚本的执行1小时30分钟。

###示例4:暂停脚本执行1天```shellsleep 1d```这将暂停脚本的执行1天。

##3.高级用法###暂停到指定时间`sleep`命令可以与`date`命令结合使用,实现暂停脚本执行到指定的时间。

例如,假设你想要暂停脚本执行到下午3点:```shell#获取当前时间CURRENT_TIME=$(date +%s)#获取下午3点的时间TARGET_TIME=$(date -d '15:00' +%s)#计算需要暂停的时间SLEEP_TIME=$((TARGET_TIME-CURRENT_TIME))#执行暂停sleep $SLEEP_TIME```这将根据当前时间计算出需要暂停的时间,并将脚本执行暂停到下午3点。

###产生指定数量的延迟如果需要在脚本中产生一系列延迟,可以使用循环和`sleep`命令。

例如,以下示例将在脚本执行期间产生5秒的延迟,每次延迟1秒:```shell#循环5次for i in {1..5}; do#执行延迟sleep 1#输出延迟时间done```这将在脚本执行期间,每隔1秒输出一次延迟时间,总共输出5次。

shell编程题经典100例

shell编程题经典100例

shell编程题经典100例 1. 显示当前路径```shellpwd```2. 列出当前目录中的文件和目录```shellls```3. 创建一个新的目录```shellmkdir <目录名> ```4. 删除一个目录 ```shellrmdir <目录名> ```5. 删除一个文件 ```shellrm <文件名>```6. 复制一个文件```shellcp <源文件> <目标文件> ```7. 移动一个文件```shellmv <源文件> <目标文件> ```8. 重命名一个文件```shellmv <旧文件名> <新文件名> ```9. 创建一个符号链接```shellln -s <源文件> <符号链接> ```10. 显示一个文件的详细信息 ```shellls -l <文件名>```11. 显示一个目录的详细信息 ```shellls -ld <目录名>```12. 查找一个文件```shellfind <路径> -name <文件名> ```13. 搜索文本字符串```shellgrep <字符串> <文件>```14. 显示一个文件的指定行```shellhead -n <行数> <文件>```15. 显示一个文件的最后几行 ```shelltail -n <行数> <文件>```16. 比较两个文件```shelldiff <文件1> <文件2>```17. 合并两个文件```shellcat <文件1> <文件2> > <输出文件> ```18. 运行一个命令```shellcommand <参数>```19. 管道命令```shellcommand1 | command2```20. 重定向输出```shellcommand > <输出文件> ```21. 重定向输入```shellcommand < <输入文件> ```22. 使用环境变量```shellecho $PATH```23. 设置环境变量```shellPATH=/usr/bin:/bin export PATH```24. 创建一个脚本```shell#!/bin/bash# 脚本内容```25. 运行一个脚本 ```shell./<脚本名>```26. 调试一个脚本 ```shellbash -x <脚本名> ```27. 使用case语句 ```shellcase $1 in"start")# 执行启动命令;;"stop")# 执行停止命令;;esac```28. 使用if语句```shellif [ $1 -gt 10 ]; then# 执行条件为真的命令 else# 执行条件为假的命令 fi```29. 使用for循环```shellfor i in 1 2 3 4 5; do # 迭代执行命令done```30. 使用while循环```shellwhile [ $i -lt 10 ]; do # 循环执行命令i=$((i+1))done```31. 使用until循环```shelluntil [ $i -gt 10 ]; do # 循环执行命令i=$((i+1))done```32. 使用函数```shellfunction my_function() { # 函数体}my_function```33. 使用数组```shellarr=(1 2 3 4 5)echo ${arr[2]}```34. 使用字典```shelldeclare -A dictdict["name"]="John Doe" echo ${dict["name"]}```35. 使用正则表达式```shellif [[ $string =~ ^[[:alpha:]]+$ ]]; then # 匹配以字母开头的字符串fi```36. 使用管道符```shellls | grep "txt"```37. 使用换行符```shellecho -e "Line 1\nLine 2"```38. 使用引号```shellecho "This is a string with spaces"```39. 使用转义字符```shellecho "This is a string with a \n newline" ```40. 使用注释```shell# 这是一行注释```41. 使用条件?:```shellresult=$(if [ $condition ]; then echo "true"; else echo "false"; fi)```42. 使用切片```shellecho "${string:0:3}"```43. 使用join命令```shellecho $( IFS=","; echo "${array[]}" ) ```44. 使用read命令```shellread -p "Enter your name: " name```45. 使用变量赋值```shellvar=$(expr 1 + 2)```46. 使用算术运算```shell(( i++ ))```47. 使用逻辑运算符```shellif [[ $condition1 && $condition2 ]]; then # 条件 1 和条件 2 都为真fi48. 使用比较运算符```shellif [[ $var -gt 10 ]]; then # var 大于 10fi```49. 使用测试命令```shellif test -f <文件>; then# 文件存在```50. 使用getopts解析命令行参数 ```shellwhile getopts ":ab:" opt; do case $opt ina)flag_a=true;;b)arg_b=$OPTARG;; esac done```。

shell脚本练习题

shell脚本练习题

shell脚本例子集锦(习题总结)练习一:写一个脚本1.设定变量FILE的值为/etc/passwd2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`)Hello,root,your UID is 0.3.统计一个有多少个用户答案一:#!/bin/bashfile="/etc/passwd"LINES=`wc -l $file | cut -d" " -f1`for I in `seq 1 $LINES`;douserid=`head -$I $file | tail -1 |cut -d: -f3`username=`head -$I $file | tail -1 |cut -d: -f1`echo "hello $username,your UID is $userid"doneecho "there are $LINES users"答案二:#!/bin/bashfile=/etc/passwdlet num=0for I in `cat $file`;dousername=`echo "$I" | cut -d: -f1`userid=`echo "$I" | cut -d: -f3`echo "Hello,$username,your UID is $userid"num=$[$num+1]doneecho "there are $num users"练习二:写一个脚本1.切换工作目录至/var2.依次向/var目录中的每个文件或子目录问好,形如:(提示:for FILE in /var/*;或for FILE in `ls /var`;)Hello,log3.统计/var目录下共有多个文件,并显示出来答案:#!/bin/bashcd /varlet num=0for I in `ls /var/*`;doecho "hello $I"num=$[$num+1]doneecho "the number of files is $num"练习三:写一个脚本1.设定变量file的值为/etc/passwd2.使用循环读取文件/etc/passwd的第2,4,6,10,13,15行,并显示其内容3.把这些行保存至/tmp/mypasswd文件中答案:#!/bin/bashfile="/etc/passwd"for I in 2 4 6 10 13 15;doexec 3>/tmp/mypasswdline=`head -$I $file | tail -1`echo "$line"echo "$line" >&3exec 3>&-done练习四:写一个脚本传递两个整数给脚本,让脚本分别计算并显示这两个整数的和,差,积,商答案如下:vim test.sh#!/bin/bashecho "first number $1" (表示输出第一个数)echo "second number $2" (表示输出第二个数)echo "$(($1+$2))" (输出两数之和)echo"$[$1-$2]" (输出两数之差)echo"$[$1*$2]" (输出两数之积)echo"$[$1/$2]" (输出两数之商):wq(表示保存并退出vi编辑器)chmod +xtest.sh (给test.sh执行的权限)./test.sh 23 (传递两个参数并执行脚本作业一:写一个脚本:1.创建目录/tmp/scripts2.切换工作目录至此目录中3.复制/etc/pam.d目录至当前目录,并重命名为test4.将当前目录的test及其里面的文件和子目录的属主改为redhat5.将test及其子目录中的文件的其它用户的权限改为没有任何权限答案:#!/bin/bashmkdir -v /tmp/scriptscd /tmp/scriptscp -r /etc/pam.d ./testchown -R redhat ./testchmod -R o=--- ./test作业二:写一个脚本1.显示当前系统日期和时间,而后创建目录/tmp/lstest2.切换工作目录至/tmp/lstest3.创建目录a1d,b56e,6test4.创建空文件xy,x2y,7325.列出当前目录下以a,x或者6开头的文件或目录6.列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录答案:#!/bin/bashdatemkdir -pv /tmp/lstestcd /tmp/lstestmkdir a1d b56e 6testtouch xy x2y 732ls [ax6]*ls [[:alpha:]][[:digit:]]*作业三:写一个脚本添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加答案:#!/bin/bashfor I in `seq 1 10`;docut -d: -f1 /etc/passwd |grep "user$I" 2>>/tmp/etc.err || useradd user$Idone作业四:写一个脚本通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线如果在线,就显示“ip is up”如果不在线,就显示“ip is down”答案: #!/bin/bashfor I in `seq 151 254`;doping -c1 -w1 192.168.0.$I &>/dev/null && echo "192.168.0.$I is up" || echo "192.168.0.$I is down"done例题:shell1.sh 显示日期和时间。

linuxshell编程案例

linuxshell编程案例

linuxshell编程案例Linux Shell编程案例Shell编程是一种在Linux操作系统中使用Shell脚本语言编写脚本的技术。

通过Shell编程,我们可以自动化执行一系列的命令,提高工作效率。

下面,我将介绍一个实际的Shell编程案例,帮助大家更好地理解和应用Shell编程。

案例背景:假设我们是一家电商公司的运维工程师,每天需要备份公司的数据库,并将备份文件上传到远程服务器上。

为了简化这个繁琐的过程,我们可以使用Shell编程来实现自动备份和上传。

案例步骤:1. 创建Shell脚本文件首先,我们需要创建一个Shell脚本文件,比如命名为backup.sh。

可以使用任何文本编辑器来创建该文件。

2. 编写脚本内容在backup.sh文件中,我们需要编写一系列的命令来实现备份和上传的功能。

下面是一个简单的示例:```shell#!/bin/bash# 定义备份文件名和路径backup_file="db_backup_$(date +%Y%m%d).sql"backup_path="/path/to/backup"# 备份数据库mysqldump -u username -p password database >$backup_path/$backup_file# 上传备份文件到远程服务器scp $backup_path/$backup_file user@remote_server:/path/to/backup```在这个示例中,我们首先定义了备份文件的名称和路径。

然后,使用`mysqldump`命令备份数据库,并将备份文件保存到指定的路径中。

最后,使用`scp`命令将备份文件上传到远程服务器上。

3. 添加执行权限在终端中,使用`chmod +x backup.sh`命令为脚本文件添加执行权限。

4. 执行脚本在终端中,使用`./backup.sh`命令执行脚本。

shell脚本

shell脚本

shell脚本Shell什么是shell脚本实际上就是⼀些命令的集合shell脚本的创建和执⾏# cd /usr/local/sbin/# sh first.sh //执⾏脚本另外⼀种执⾏⽅法# ./first.sh# chmod +x first.sh //修改权限使⽤sh命令执⾏⼀个shell脚本时,可以加-x选项来查看这个脚本的执⾏过程,这样有利于我们调试这个脚本date⽤法date +%Y :表⽰以四位数字格式打印年份date +%y :表⽰以两位数字格式打印年份date +%m :表⽰⽉份date +%d :表⽰⽇期date +%H :表⽰⼩时date +%M :表⽰分钟date +%S :表⽰秒date +%w :表⽰星期。

结果显⽰0则表⽰周⽇“以四位数字格式打印年份-⽉份-⽇期⼩时:分钟:秒”//前⼀天的⽇期//前⼀⼩时//前⼀分钟Shell脚本中的变量定义变量的格式为:”变量名=变量的值”。

⽤来解决命令或路径修改。

在脚本中引⽤变量时需要加上符号¥。

本例中使⽤到了反引号。

它的作⽤是将引号中的字符串当成shell命令执⾏,返回命令的执⾏结果。

d和d1在脚本中作为变量出现。

查看该脚本的执⾏结果数学计算vi sum.sh//数学计算要⽤[]括起来,并且前⾯要加符号¥。

和⽤户交互# vi read.sh执⾏过程加上-x选项,再看看这个执⾏过程Shell脚本预设变量有时我们会⽤到类似/etc/init.d/iptables restart的命令,前⾯的/etc/init.d/iptables⽂件其实就是个shell脚本。

脚本后⾯为什么可以跟⼀个restart 字符串呢?这就涉及shell脚本的预设变量了。

Shell脚本在执⾏时,后⾯可以跟⼀个或者多个参数# vi option.sh执⾏结果¥1和¥2的值就是在执⾏时分别输⼊的1和2,¥1就是脚本的第⼀个参数,¥2是第⼆个参数。

⼀个shell脚本的预设变量是没有限制的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

# vi xx.sh退出并保存# chmod +x xx.sh# ./xx.sh-2.调试脚本的方法# bash -x xx.sh就可以调试了.-1.配置secureCRT的设置(我用的是6.2.3 build313版本,汉化版)选项->会话选项(S)...->终端->仿真->终端(T)->把VT100改成Xterm->点中ANSI颜色(A)和使用颜色方案(U)复选框.这样就有颜色显示了.选项->会话选项(S)...->终端->外观->字符编码(H)->从Default变到UTF-8.这样就有中文显示了.1.写一个脚本,执行后,打印一行提示"Please input anumber:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值.直到用户输入"end"停止. # vi show_var.sh脚本内容:#!/bin/bashunset varwhile [ "$var" != "end" ]doecho -n "please input a number: "read varif [ "$var" = "end" ]thenbreakfiecho "var is $var"done命令保存后退出,并执行:# chmod +x show_var.sh# ./show_var.shplease input a number: 1var is 1please input a number: svar is splease input a number: end#2.写一个脚本,测试位置参数# vi param.sh脚本内容:#!/bin/bash#test shellecho $0echo $1echo $2echo $?echo $*echo $#命令保存后退出,并执行:# chmod +x param.sh# ./param.sh yema Bhanv edu network./param.sh //程序名称Yema //第一个参数Bhanv //第二个参数0 //程序执行结果yema Bhanv edu network //传递参数所组成的字符串4 //参数个数3.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件. # vi tar_gz_bz2.sh脚本内容:#!/bin/shcase ${1##*.tar.} inbz2)tar jxvf $1;;gz)tar zxvf $1;;*)echo "wrong file type"esac命令保存后退出,并执行:# chmod +x tar_gz_bz2.sh# ./tar_gz_bz2.sh# touch "helloA" > a.txt //写一个测试用的文件# tar czvf a.tar.gz a.txt //把a.txt压缩成tar.gz文件# rm -rf a.txt //删除a.txt来测试脚本# ls a.*a.tar.gz# ./tar_gz_bz2.sh a.tar.gz# ls a.*a.tar.gz a.txt //验证了正确性# touch "helloB" > b.txt //写一个测试用的文件# tar cjvf b.tar.bz2 b.txt //把b.txt压缩成tar.bz2文件# rm -rf b.txt //删除b.txt来测试脚本# ls b.*b.tar.bz2# ./tar_gz_bz2.sh b.tar.bz2# ls b.*b.tar.bz2 b.txt //验证了正确性# rm -rf a.txt a.tar.gz //删除测试用的文件# rm -rf b.txt b.tar.bz2 //删除测试用的文件4.小棍子显示# vi showstick.sh#!/bin/bashi=0while [ $i -lt 10 ]dofor j in '-' '\\' '|' '/'doecho -ne "\033[1D$j"usleep 50000done((i++))done保存# chmod +x showstick.sh# ./showstick.sh看效果.5.显示类似wget 的进度# vi showwget.sh#!/bin/bashi=0while [ $i -lt 10 ]dofor j in '-' '\\' '|' '/'doecho -ne "\033[1D$j"usleep 50000done((i++))done保存# chmod +x showwget.sh# ./showwget.sh看效果.6.定义loop的变量1 2 3 4 5是变量列表# vi forlist.sh#!/bin/bash#for with listfor loop in 1 2 3 4 5doecho ${loop}done保存# chmod +x forlist.sh# ./forlist.sh看效果.7.读取文件中的每串字符,去掉了回车或者空格,输出每行就显示一个字符串. 编写文件var.txt# vi var.txt1 223456保存# vi listfile.sh#!/bin/bashfor loop in `cat var.txt`doecho ${loop}done保存# chmod +x listfile.sh# ./listfile.sh看效果.8.编写一个脚本自动生成一个C类IP地址段IP地址段网络部分由用户指定# vi ipaddr.sh#!/bin/bashfor ip in `seq 1 254`doecho ${1}.${ip}done保存# chmod +x ipaddr.sh# ./ipaddr.sh 192.168.1看效果.9.编写一个脚本自动生成一个C类IP地址段IP地址段网络部分由用户指定,主机结束部分由用户指定# vi ipaddr2.sh#!/bin/bashfor ip4 in `seq 1 ${2}`doecho ${1}.${ip4}done保存# chmod +x ipaddr2.sh# ./ipaddr2.sh 192.168.1 100看效果.10.编写一个脚本自动生成一个C类IP地址段IP地址段网络部分由用户指定,主机结束部分由用户指定# vi ipaddr3.sh#!/bin/bashfor ip3 in `seq 1 5`dofor ip4 in `seq 1 ${2}`doecho ${1}.${ip3}.${ip4}donedone保存# chmod +x ipaddr3.sh# ./ipaddr3.sh 192.168 2 100看效果.11.编写一个脚本测试while的性能# vi menu-while.sh#!/bin/bashwhile [ "1" == "1" ]doclearecho "-------menu-----"echo "1) Show Time"echo "2) CPU load"echo "3) Memory free"echo "0) Exit"echo "---------------"echo -n "Enter you chose [0-3]:"read Chosecase ${Chose} in0) exit ;;1) date +%T;;2) uptime | awk -F '[,]' '{print $1}';;3) free -m | awk '$1=="Mem:"{print $4}';;*) echo "This is not between 0-3." ;;esacecho -n "Do you contine [y/n]:"read contineif [ "${contine}" == "n" -o "${contine}" == "N" ] thenexitfidone保存# chmod +x menu-while.sh# ./menu-while.sh看效果.12.echo颜色显示# vi showcolor.sh#!/bin/bashecho -e "\033[40;35mHell,world! \033[0m"echo "Hello,world"保存# chmod +x showcolor.sh# ./showcolor.sh看效果.13.sort排序# vi showsort.sh#!/bin/bashsort -k3 -n -r -t: /etc/passwd保存# chmod +x showsort.sh# ./showsort.sh看效果.14.wc统计字数# vi showwc.sh#!/bin/bashwc /etc/passwd保存# chmod +x showwc.sh# ./showwc.sh看效果.15.diff判断文件的差异# vi a.txtHello World保存# vi b.txtHello You保存# vi showdiff.sh#!/bin/bashdiff a.txt b.txt保存# chmod +x showdiff.sh# ./showdiff.sh看效果.15.diff判断文件的差异# vi showawk.sh#!/bin/bashawk -F: '{print $1,$3}' /etc/passwd保存# chmod +x showawk.sh# ./showawk.sh看效果.16.test判断文件的差异# vi showtest.sh#!/bin/bash#中间是a与操作,则都为0才得0#中间是o或操作,则有一真则真0test -e /etc/passwd -a -e /etc/shadowecho $?test -e /etc/passwd -o -e /etc/groupsecho $?保存# chmod +x showtest.sh# ./showtest.sh看效果.17.输入判断# vi input.sh#!/bin/bash#input testecho -n "Enter your name:"read name#did the user just hit returnif [ "${name}" == "" ]thenecho "You did not enter any information"elseecho "Your name: ${name}"fi保存# chmod +x input.sh# ./input.sh看效果.18.文件拷贝# vi filecopy.sh#!/bin/bash#file copy# 2>/dev/null 丢掉错误提示if cp /etc/passwd passwd.bak 2>/dev/null thenecho "Good Copy!"elseecho "`basename $0`: error,could not copy" fi保存# chmod +x filecopy.sh# ./filecopy.sh看效果.19.case选择效果# vi showcase.sh#!/bin/bash#case selectecho -n "enter a number from 1 to 5:"read NUMcase $NUM in1) echo "you select 1" ;;2) echo "you select 2" ;;3) echo "you select 3" ;;4) echo "you select 4" ;;5) echo "you select 5" ;;*) echo "basename $This is not between 1 and 5"esac保存# chmod +x showcase.sh# ./showcase.sh看效果.20.case选择效果学生的考试成绩是0-100分,在85以上的要提示you are the best!,在70-84显示you get a good mark! ,在60-74的显示come on!,60分以下显示You must study hard!# vi showpoint.sh#!/bin/bashecho -n "please input your mark:"read markcase $mark in# 100、90-99、85-89100|9[0-9]|8[5-9]) echo "you are the best!";;# 80-84、70-798[0-4]|7[0-9]) echo "you get a good mark!";;# 70-74、60-697[0-4]|6[0-9]) echo "come on!";;# 00-59[0-5][0-9]) echo "You must study hard!";;esac保存# chmod +x showpoint.sh# ./showpoint.sh看效果.21.用echo显示颜色# vi showcolors.sh#!/bin/bashT='gYw' # The test textechoecho "default 40m 41m 42m 43m 44m 45m 46m 47m"## FGs 为前景(foreground), BG 为背景(background)for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' '1;32m' '33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' ' 36m' '1;36m' ' 37m''1;37m'doFG=$(echo $FGs|tr -d ' ')echo -en " $FGs \033[$FG $T "for BG in 40m 41m 42m 43m 44m 45m 46m 47m;doecho -en " \033[$FG\033[$BG $T \033[0m"doneechodoneecho保存# chmod +x showcolors.sh# ./showcolors.sh看效果.22.改变终端窗口的名称.这里使用了一个名为help的函数,该函数在脚本中使用了两次: # vi xtitlebar.sh#!/bin/bash# vim: set sw=4 ts=4 et:help(){cat << HELPxtitlebar -- change the name of an xterm, gnome-terminal or kdekonsoleUSAGE: xtitlebar [-h] "string_for_titelbar"OPTIONS: -h help textEXAMPLE: xtitlebar "cvs"HELPexit 0}# in case of error or if -h is given we call the function help:[ -z "$1" ] && help[ "$1" = "-h" ] && help# send the escape sequence to change the xterm titelbar:echo -e "\033[40;35m$1\033[0m"保存# chmod +x xtitlebar.sh# ./xtitlebar.sh看效果.23.shift用法# vi showshift.sh#!/bin/bashuntil [ $# -eq 0 ]doecho "第一个参数为: $1 参数个数为: $#"shiftdone保存# chmod +x showshift.sh# ./showshift.sh 1 2 3 4第一个参数为: 1 参数个数为: 4第一个参数为: 2 参数个数为: 3第一个参数为: 3 参数个数为: 2第一个参数为: 4 参数个数为: 1看效果.来源于网络,回归于网络.我的邮箱:happy.every.day@ QQ:48399956快乐!2010年9月30日对我有用[0] 丢个板砖[0] 引用举报管理TOP 回复次数:3merryboy等级:#1楼得分:0回复于:2010-09-30 16:22:0324.shift用法2 # vi showshift2.sh#!/bin/bashif [ $# -eq 0 ]thenecho "Usage:x_shift2.sh 参数"exit 1fisum=0until [ $# -eq 0 ]dosum=`expr $sum + $1`shiftdoneecho "sum is: $sum"保存# chmod +x showshift2.sh# ./showshift2.sh 10 20 15sum is: 45看效果.25.函数定义,调用# vi showfunction.sh#!/bin/bashmessage(){echo "message"}let i=1while [ $i -le 3 ]domessagelet i=$i+1done保存# chmod +x showfunction.sh# ./showfunction.sh看效果.26.函数定义,调用,参数传递,这里主要实现数的乘方计算.# vi showfunction2.sh#!/bin/bashpower(){x=$1y=$2count=1result=1while [ $count -le $y ]doresult=`expr $result \* $x`count=`expr $count + 1`donereturn $result}echo "Enter two numbers"read num1 num2power $num1 $num2answer=$?echo "$num1 to $num2 is $answer"保存# chmod +x showfunction2.sh# ./showfunction2.shEnter two numbers2 32 to3 is 8看效果.27.函数定义,调用,参数传递,这里主要实现数的乘方计算,使用递归调用.# vi showfunction3.sh#!/bin/bashpower(){x=$1y=$2if [ $y -eq 1 ]thenreturn $xelsey=`expr $y - 1`power $x $yresult=`expr $? \* $x`return $resultfi}echo "Enter two numbers"read num1 num2power $num1 $num2answer=$?echo "$num1 to $num2 is $answer"保存# chmod +x showfunction3.sh# ./showfunction3.shEnter two numbers3 23 to 2 is 9看效果.如果你输入4 5看看结果是什么Enter two numbers4 54 to5 is 0为什么是0,不是1024,我估计是计算溢出了.28.局部变量全局变量的测试.默认情况下,所有函数的变量都是全局变量.你可以用typeset去声明一个局部变量# vi showfunction4.sh#!/bin/basheasy(){typeset aa=`expr 30 `b=`expr 30 `echo "easy a is " $aecho "easy b is " $b}a=10b=20easy $a $becho "global a is " $aecho "global b is " $b保存# chmod +x showfunction4.sh# ./showfunction4.sheasy a is 30easy b is 30global a is 10global b is 30看效果.29.如果要在脚本中多次使用函数,可以把它放在一个函数目录中,像一个普通文件一样,使用的时候把它放在脚本开始的地方模式:. functionfile...具体例子# vi power.sh#!/bin/bashpower(){x=$1y=$2if [ $y -eq 1 ]thenreturn $xelsey=`expr $y - 1`power $x $yresult=`expr $? \* $x`return $resultfi}保存# vi showfunction5.sh#!/bin/bash. power.shecho "Enter two numbers"read num1 num2power $num1 $num2answer=$?echo "$num1 to $num2 is $answer"保存# chmod +x power.sh# chmod +x showfunction5.sh# ./showfunction5.shEnter two numbers2 32 to3 is 8看效果.30. 函数使用# vi showfunction6.sh#!/bin/bash# file name "showfunction6.sh" function nihao() {echo -n "nice to meet you ! "}function mingzi() {echo "小桥流水人家"}function out(){echo "即将退出..."echo "3秒后退出!"sleep 1echo -n "."sleep 1echo -n "."sleep 1echo "."exit}nihaomingziout保存# chmod +x showfunction6.sh# ./showfunction6.sh看效果.31.实现对输入参数的分析,但是下面的使用case表达式的例子无疑是一个不错的方法. # vi param.sh#!/bin/shhelp(){cat << HELPThis is a generic command line parser demo.USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2HELPexit 0}while [ -n "$1" ]; docase $1 in-h) help;shift 1;; # function help is called-f) opt_f=1;shift 1;; # variable opt_f is set-l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2--) shift;break;; # end of options-*) echo "error: no such option $1. -h for help";exit 1;;*) break;;esacdoneecho "opt_f is $opt_f"echo "opt_l is $opt_l"echo "first arg is $1"echo "2nd arg is $2"你可以这样运行该脚本:# chmod +x param.sh# ./param.sh -l hello -f -- -somefile1 somefile2返回结果如下:opt_f is 1opt_l is hellofirst arg is -somefile12nd arg is somefile2这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数.根据unix系统的惯例,首先输入的应该是包含减号的参数.32. DONE OK PASSED FAILED WARNING的shell颜色控制显示(这个是参考/u3/93926/showart_1875228.html文档,自己摸索学会的)# vi colorbase.sh#!/bin/shBOOTUP=color# 第一设置BOOTUP 变量,默认就是colorRES_COL=60# 第二设置设置在屏幕的第几列输出后面的"[ xxx ]" ,默认是第60列MOVE_TO_COL="echo -en \\033[${RES_COL}G"# MOVE_TO_COL 是用于打印"OK" 或者"FAILED" ,或者"PASSED" ,或者"WARNING"之前的部分,不含"["SETCOLOR_SUCCESS="echo -en \\033[1;32m"# SETCOLOR_SUCCESS 设置后面的字体都为绿色SETCOLOR_FAILURE="echo -en \\033[1;31m"# SETCOLOR_FAILURE 设置后面将要输出的字体都为红色SETCOLOR_W ARNING="echo -en \\033[1;33m"# SETCOLOR_W ARNING 设置后面将要输出的字体都为黄色SETCOLOR_NORMAL="echo -en \\033[0;39m"# SETCOLOR_NORMAL 设置后面输出的字体都为白色(默认)echo_success() {# 下面是echo_success 部分[ "$BOOTUP" = "color" ] && $MOVE_TO_COL# 首先是打印"[" 之前的空格echo -n "["# 然后打印"["[ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS# 设置字体为红色echo -n $" OK "# 打印OK[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL # 返回字体为白色echo -n "]"# 打印"]"echo -ne "\r"# 换行.return 0# 返回0,其他一律返回1}echo_done() {# 下面是echo_success 部分[ "$BOOTUP" = "color" ] && $MOVE_TO_COL# 首先是打印"[" 之前的空格echo -n "["# 然后打印"["[ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS # 设置字体为红色echo -n $" DONE "# 打印DONE[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL # 返回字体为白色echo -n "]"# 打印"]"echo -ne "\r"# 换行.return 0# 返回0,其他一律返回1}echo_failure() {[ "$BOOTUP" = "color" ] && $MOVE_TO_COLecho -n "["[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE echo -n $" FAILED "[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]"echo -ne "\r"return 1}echo_passed() {[ "$BOOTUP" = "color" ] && $MOVE_TO_COLecho -n "["[ "$BOOTUP" = "color" ] && $SETCOLOR_W ARNING echo -n $" PASSED "[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]"echo -ne "\r"return 1}echo_warning() {[ "$BOOTUP" = "color" ] && $MOVE_TO_COLecho -n "["[ "$BOOTUP" = "color" ] && $SETCOLOR_W ARNING echo -n $" WARNING "[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]"echo -ne "\r"return 1}保存# vi testsuccess.sh#!/bin/sh. colorbase.shecho_successecho "I win."echo_doneecho "I win."echo_failureecho "I think I will win."echo_passedecho "I passed."echo_warningecho "I think I will have no warning."保存# chmod +x colorbase.sh# chmod +x testsuccess.sh# ./testsuccess.shI win. [ OK ]I win. [ DONE ]I think I will win. [ FAILED ]I passed. [ PASSED ]I think I will have no warning. [ WARNING ]看效果.33.如何计算一个日期是星期几# vi whichdate.sh#!/bin/bashgetdayofweek(){# Function dayofweek# Sample input:20020703# Extract the month, day, and yearyear=`echo $1|cut -c1-4`month=`echo $1|cut -c5-6`day=`echo $1|cut -c7-8`b=`cal $month $year|wc -l `cal $month $year |awk '{for(i=1;i<=NF;i++){if($i=='$day'){if(NR=='"$b"'-1){print i-1}else{print 7-NF+i-1}}}}'}getdayofweek $1保存# chmod +x whichdate.sh# ./whichdate.sh 20100930434. 自动让脚本调用其他脚本并输入相关的选择项,如果你没有安装expect的话,请执行# yum install exepct安装就可以了.# vi showfunction7.sh#!/bin/bashecho "Enter one numbers"read num1echo "The number is $num1"保存# vi input.exp#!/usr/bin/expect -fspawn ./showfunction7.shexpect "Enter one numbers";send "2\r";interact;保存# vi autoinput.sh#!/bin/bash./input.exp# chmod +x showfunction7.sh# chmod +x input.exp# chmod +x autoinput.sh# ./autoinput.shspawn ./showfunction7.shEnter one numbers2The number is 2看效果.35. 自动让脚本调用其他脚本并输入相关的选择项,多次调用输入# vi showfunction8.sh#!/bin/bashecho "Enter one numbers"read num1echo "The number is $num1"保存# vi input1.exp#!/usr/bin/expect -fspawn ./showfunction8.shexpect "Enter one numbers";send "2\r";interact;spawn ./showfunction8.shexpect "Enter one numbers";send "3\r";interact;保存# vi autoinput1.sh#!/bin/bash./input1.exp# chmod +x showfunction8.sh# chmod +x input1.exp# chmod +x autoinput1.sh# ./autoinput1.shspawn ./showfunction8.shEnter one numbers2The number is 2spawn ./showfunction8.shEnter one numbers3The number is 3看效果.来源于网络,回归于网络.我的邮箱:happy.every.day@ QQ:48399956快乐!2010年9月30日对我有用[0] 丢个板砖[0] 引用举报管理TOP 精华推荐:借人气宣传一下自己开发的语言Dao merryboy等级:#2楼得分:0回复于:2010-09-30 16:22:12FAQ,参考信息:1.位置参数$1, $2, $3等等...位置参数,从命令行传递给脚本,或者是传递给函数.或者赋职给一个变量.此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制.$0$0表示当前执行的进程名,script 本身的名字,或者在正则表达式中表示整行输出$#命令行或者是位置参数的个数.$*所有的位置参数,被作为一个单词.注意:"$*"必须被""引用.$@与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的单词.注意:"$@"必须被""引用.其他的特殊参数$-传递给脚本的falg(使用set 命令).显示shell使用的当前选项,与set命令功能相同注意:这起初是ksh 的特征,后来被引进到Bash 中,但不幸的是,在Bash 中它看上去也不能可靠的工作.使用它的一个可能的方法就是让这个脚本进行自我测试(查看是否是交互的).$!在后台运行的最后的工作的PID(进程ID).$_保存之前执行的命令的最后一个参数.$?命令,函数或者脚本本身的退出状态用于检查上一个命令,函数或者脚本执行是否正确.(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错.)$$脚本自身的进程ID.这个变量经常用来构造一个"unique"的临时文件名.这通常比调用mktemp 来得简单.注意事项:[1] 当前运行的脚本的PID 为$$.[2] "argument"和"parameter"这两个单词经常不加区分的使用.在这整本书中,这两个单词的意思完全相同.(在翻译的时候就未加区分,统统翻译成参数)退出和返回退出状态(exit status)函数返回一个被称为退出状态的值. 退出状态可以由return 来指定statement, 否则函数的退出状态是函数最后一个执行命令的退出状态(0 表示成功,非0 表示出错代码). 退出状态(exit status)可以在脚本中由$? 引用. 这个机制使脚本函数也可以像C 函数一样有一个" 返回值".return终止一个函数.return 命令[1]可选地带一个整数参数,这个整数作为函数的"返回值"返回给调用此函数的脚本,并且这个值也被赋给变量$?.while true可以写为while :一、用户登陆进入系统后的系统环境变量$HOME 使用者自己的目录$PA TH 执行命令时所搜寻的目录$TZ 时区$MAILCHECK 每隔多少秒检查是否有新的信件$PS1 在命令列时的提示号$PS2 当命令尚未打完时,Shell 要求再输入时的提示号$MANPA TH man 指令的搜寻路径二、特殊变量$0 这个程序的执行名字$n 这个程序的第n个参数值,n=1..9$* 这个程序的所有参数$# 这个程序的参数个数$$ 这个程序的PID$! 执行上一个指令的PID$? 执行上一个指令的返回值三、shell中的变元* 任意字符串? 一个任意字符[abc] a, b, c三者中之一[a-n] 从a到n的任一字符四、几个特殊字符表示\b 退回\c 打印一行时没有换行符这个我们经常会用到\f 换页\r 回车\t 制表\v 垂直制表五、判断文件的属性格式:-操作符filename-e 文件存在返回1, 否则返回0-r 文件可读返回1,否则返回0-w 文件可写返回1,否则返回0-x 文件可执行返回1,否则返回0-o 文件属于用户本人返回1, 否则返回0-z 文件长度为0返回1, 否则返回0.-f 文件为普通文件返回1, 否则返回0-d 文件为目录文件时返回1, 否则返回0六、测试字符串字符串1 = 字符串2 当两个字串相等时为真字符串1 != 字符串2 当两个字串不等时为真-n 字符串当字符串的长度大于0时为真-z 字符串当字符串的长度为0时为真字符串当串字符串为非空时为真七、测试两个整数关系数字1 -eq 数字2 两数相等为真数字1 -ne 数字2 两数不等为真数字1 -gt 数字2 数字1大于数字2为真数字1 -ge 数字2 数字1大于等于数字2为真数字1 -lt 数字2 数字1小于数字2为真数字1 -le 数字2 数字1小于等于数字2为真八、逻辑测试-a 与-o 或! 非shell中的特殊字符有1、$ 美元符2、\ 反斜杠3、` 反引号4、" 双引号5、,*,?,[,]下面我一一举列说明一、$符号1、echo $? 显示的是上一条指令退出状态2、echo "$?" 效果同上3、echo '$?' 显示的是$?4、echo \$? 显示的是$?5、echo "\$?" 显示的是$?大家可能已经看出$符号在双引号中具有特殊意义双引号对$符号不起作用而单引号可以将特殊字符的的特殊意义屏蔽掉,使其能显示为字符本身,反斜杠也可以将特殊字符的特殊含义屏蔽掉,使特殊字符失去特殊含义.反斜杠的作用是将特殊符号字符的特殊含义屏蔽掉,使其还是原字符A=1234echo \$A 显示为$A 如果不加\将显示为1234echo \` 显示为`echo \" 显示为双引号echo \\ 显示为\三、` 反引号反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到将系统命令的执行结果赋给一个变量A=`date`echo $A 显示的不是date而是当时的时间串比如有一文件A的内容如下ABCDEFG1234456abcdefgB=`cat A|grep 234` #检索文件A中含有字符串234的行echo $B 将显示为1234456echo "$B" 将显示为什么?echo "\$B" 将显示为什么?读者自己试试四、"双引号在系统中有些特殊字符,为避免引用这些特殊字符往往用双引号或单引号将这些特殊字符引起来,使其不具有特殊含义.但有一部分特殊字符在引号中还是具有特殊含义,用双引号引起来是不起作用的.本文中所列的前四个特殊字符在双引号中还是特殊字符.为了使其不具有特殊含义一是用单引号引进来二是用\反斜线使其失去作用.比如我们想原样输出这些特殊字符echo """echo "$"echo "\"echo "`"以上不是你所期望的结果,因为双引号对它们不起作用,你只能这样才能输出这些特殊字符的原形echo '"'echo '$'echo '\'echo '`'或echo "\""echo "\$"echo "\\"echo "\`"将分别显示为" $ \ `五、其它特殊字符大家注意到,除了前四个特殊字符外,我将其它的特殊字符都放在一块,这是因为前四个特殊字符在双引号中还是具有特殊含义,所以单独拿出来讲,除此以外的特殊字符如果你要输出这些特殊字符的原形,你就可以用双引号或单引号引起来使其失去特殊含义.,*,?,[,]对shell有特殊含义但你可以用双引号引起来输入这些原形一、if条件语句格式:if 条件表达式then #当条件为真时执行以下语句命令列表else #为假时执行以下语句命令列表fiif 语句也可以嵌套使用if条件表达式1thenif 条件表达式2then命令列表elseif 条件表达式3then命令列表else命令列表fifielse命令列表fi你可以进行多层嵌套一个if语句一定要跟一个fi 表示该层条件结束否则会造成语法错误结合前面讲的举例如下: 这里先讲一个条件语句中用到的命令test 表示测试test后面的条件是否为真if test -f "$1"thenlpr $1elseif test -d "$1"thencd $1lpr $1elseecho "$1不是文件或目录"fifi以上的例子还可以改成如下所示if test -f "$1"thenlpr $1elif test -d "$1" #elif 同else ifthen(cd$1;lpr $1)elseecho "$1不是文件或目录"fi以上的例子不知您是否看懂是什么意思吗?假如我们现在将这个例子保存为prfilechmod +x prfile执行刚才的程序./prfile aaa这个例子是检查你的输入的参数是否是一个文件如果是就打印如果是一个目录先转目录再打印如果即不是文件也不是目录给出提示二、多重条件测试语句case格式:case 字串in模式) 命令列表;;模式) 命令列表;;....esac多重条件语句是以case开始以esac结束中间可以有多个条件列表功能是测试字串和和里面的模式有没有匹配的,有就执行里面的命令列表模式也可以是*号表示任意字串,每个模式里面的最后要心;;双引号结束,否则会发生语法错误.现举例如下:case $1 in*.c)cc $1;;*.txt)lpr $1;;*)echo "未知的类型"esac假如将以上内容保存在文件abc中chmod +x abc执行./abc a.c将会对文件a.c进行编译执行./abc readme.txt 将会把文件通过打印机假如我将以上内容改一下,你是否会知道它的执行结果?case $1 in*)cc $1;;*.txt)lpr $1;;*.c)echo"未知的类型"esac一. while 循环while 命令格式while 条件表do命令表done执行过程Shell首先执行条件表,如果条件表的最后一条语句的退出状态为零,则执行盾环体内的命令表,执行完后,再检查条件表,如果退出状态为零将继续执行,如此循环往复直到条件表的最后一条语句的退出状态非零.退出状态为零就是条件为真True.举例说明假如shell文件的内容如下:Sum=0i=0while true #true是系统的关键词表示真doi=`expr $i + 1`Sum=`expr $Sum + $i`if [ $i = "100" ]thenbreak;fidoneecho $i $Sum最后这个程序显示的是100 5050这个程序的运算就是将1到100加起来下面将这个程序再改动一下Sum=0i=0while [ $i != "100" ]doi=`expr $i + 1`Sum=`expr $Sum + $i`doneecho $i $Sum改动后的程序运算结果和上面是一样但程序比上面的要简练在这个循环中还可以以until做为测试条件它正好与while测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子.Sum=0i=0until [ $i = "100" ]doi=`expr $i + 1`Sum=`expr $Sum + $i`doneecho $i $Sum当i不等于100时循环就是当条件为假时循环,否则就退出,而第一个例子是当i不等于100时循环,也就是测试条件为真时循环.二.for 循环命令格式:for 变量in 名字列表do命令列表done这里的名字列表是一个由空格分隔的字符串列表,shell在执行for循环时每次依次从名字表中取出一个字符串赋给循环变量作为变量的值.在写for语句时,也可以省略in 名字列表部分,这表示用当前的位置参数来代替这时的名字列表.面举个例子,比如在你的电脑中有两个目录,一个是aa,一个是bb在这两个目录中有5个相同的文件,但其中一个目录中的一个或多个文件刚刚修改过,现在我忘记刚才改的是那几个文件了,那么我靠已知的序码查找.程序如下:for File in a1 a2 a3 a4 a5dodiff aa/$File bb/$Filedone下面再举一个不带名字列表的例子forFiledoecho $Filwdone文件内容保存在a.sh中并可执行我们在执行这个shell程序时命令行如下:a.sh a1 a2 a3 a4 a5执行结果如下:a1a2a3a4a5大家从这个例子中可以看到命令行的参数被逐一读入一次三.循环控制语句break命令不执行当前循环体内break下面的语句从当前循环退出. continue命令是程序在本循体内忽略下面的语句,从循环头开始执行.。

相关文档
最新文档