经典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是打印最后一个列。
30个关于Shell脚本的经典案例(下)
初次使用你要注意这几点:
脚本位置参数会与optstring中的单个字母逐个匹配,如果匹配到就赋值给name,否则赋值name为问号;
optstring中单个字母是一个选项,如果字母后面加冒号,表示该选项后面带参数,参数值并会赋冒号,表示屏蔽系统错误(test.sh: illegal option -- h);
允许把选项放一起,例如-ab
下面写一个打印文件指定行的简单例子,引导你思路:
#!/bin/bash
while getopts :f:n: option; do
case $option in
f)
FILE=$OPTARG
[ ! -f $FILE ] && echo "$FILE File not exist!" && exit
\"(yes/no)\" {send \"yes\r\"; exp_continue} \"password:\" {send \"$PASS\r\"; exp_continue} \"$USER@*\" {send \"df -h\r exit\r\"; exp_continue} }" 方法3:将expect脚本独立出来
linux操作系统之shell编程实例
当然,我可以为您提供一些Linux操作系统下的Shell编程实例。
Shell编程是一种使用命令行界面来执行任务和自动化工作的方式。
下面是一些常见的Shell编程示例:1.目录备份脚本:2.bash复制代码#!/bin/bash# 源目录和目标备份目录source_dir="/path/to/source"backup_dir="/path/to/backup"# 备份文件名backup_file="backup_$(date +%Y%m%d_%H%M%S).tar.gz"# 创建目标备份目录(如果不存在)mkdir -p "$backup_dir"# 执行备份命令tar -czvf "$backup_dir/$backup_file""$source_dir"这个脚本将指定的源目录备份为一个压缩的tar文件,并将其保存到指定的备份目录中。
您可以将/path/to/source替换为要备份的实际目录,将/path/to/backup替换为保存备份文件的目标目录。
1.文件计数脚本:2.bash复制代码#!/bin/bash# 目标目录target_dir="/path/to/target"# 计数文件数和目录数file_count=$(find "$target_dir" -type f | wc -l)dir_count=$(find "$target_dir" -type d | wc -l)# 打印结果echo"文件数: $file_count"echo"目录数: $dir_count"这个脚本将计算指定目录中的文件数和目录数,并将结果打印出来。
您可以将/path/to/target替换为要计算的实际目录。
shell编程经典例题大全
shell编程经典例题大全
Shell编程是一种在Unix或类Unix操作系统上进行脚本编程
的方法。
它可以通过命令行界面执行各种操作,包括文件操作、系
统管理和自动化任务等。
下面我将列举一些经典的Shell编程例题,以供参考:
1. 编写一个脚本,统计指定目录下所有文件的行数。
2. 创建一个脚本,实现自动备份指定目录的文件到另一个目录。
3. 编写一个脚本,监控系统内存使用情况,并在内存占用超过
一定阈值时发送警报。
4. 创建一个脚本,批量修改指定目录下的文件扩展名。
5. 编写一个脚本,实现定时清理指定目录下的过期文件。
6. 创建一个脚本,监控指定服务的运行状态,并在异常情况下
自动重启服务。
7. 编写一个脚本,实现日志文件的定时切割和压缩。
8. 创建一个脚本,批量修改指定目录下文件的权限和所有者。
9. 编写一个脚本,实现定时执行系统维护任务,如磁盘清理、日志轮转等。
10. 创建一个脚本,实现对指定目录下文件的关键词搜索并生成报告。
以上是一些常见的Shell编程例题,涵盖了文件操作、系统管理、定时任务等多个方面。
通过解决这些例题,可以帮助提高对Shell脚本编程的理解和实践能力。
希望这些例题对你有所帮助。
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脚本⼀.打印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。
shell编程100例及代码注释——持续更新
shell编程100例及代码注释——持续更新1、编写hello world脚本#!/bin/bashecho"Hello World!"2、通过位置变量创建 Linux 系统账户及密码#!/bin/bashuseradd "$1"echo"$2" | passwd‐‐stdin "$1"#$1 是传给脚本的第⼀个参数,$2 是传给脚本的第⼆个参数# 命名为test.sh,保存退出,调⽤:# bash Test.sh yln 123# 创建了名为yln,密码为123的账户3、备份⽇志# 每周 5 使⽤ tar 命令备份/var/log 下的所有⽇志⽂件# 编写备份脚本,备份后的⽂件名包含⽇期标签,防⽌后⾯的备份将前⾯的备份数据覆盖#!/bin/bash# vim /root/logbak.shtar -czf log-`date +%Y%m%d`.tar.gz /var/log# date使⽤反引号括起来,反引号表⽰引号内部的字符作为命令执⾏,+%Y%m%d限定了date的格式是年⽉⽇,反引号在键盘<tab>键上⾯# 脚本调⽤:# crontab ‐e是指系统在某个时间执⾏的特定的命令或程序,后⾯的五个数字位是任务执⾏设置,分别代表分钟,⼩时,⽇,⽉,星期⼏调⽤logbak.shcrontab ‐e 0003 * * 5 /root/logbak.sh4、⼀键部署 LNMP(RPM 包版本)# LNMP是Linux + nginx + mysql + PHP,# 编译安装需要输⼊⼤量的命令,如果是配置⽣产环境需要耗费⼤量的时间。
# 搭建好LNMP环境之后就⽆需⼀个⼀个的输⼊命令,⽆需值守,编译安装优化编译参数,# 提⾼性能,解决不必要的软件间依赖,特别针对配置⾃动优化。
# ⼀键部署 LNMP(RPM 包版本)# 使⽤ yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败# 本脚本使⽤于 centos7.2 或 RHEL7.2#!/bin/bashyum‐y install httpd # httpd(⽹页伺服器)实际上是Apache,它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
shell指令及其常见使用实例
shell指令及其常见使用实例Shell指令是一种在操作系统的命令行界面下使用的命令,它用于执行各种任务,如文件操作、进程管理、网络通信等。
下面是一些常见的Shell指令及其使用实例:1. ls,用于列出当前目录下的文件和文件夹。
示例,ls.2. cd,用于切换当前工作目录。
示例,cd /path/to/directory.3. pwd,用于显示当前工作目录的路径。
示例,pwd.4. mkdir,用于创建新的目录。
示例,mkdir new_directory.5. rm,用于删除文件或目录。
示例,rm file.txt 或 rm -r directory/。
6. cp,用于复制文件或目录。
示例,cp file.txt new_file.txt 或 cp -r directory/ new_directory/。
7. mv,用于移动文件或目录,也可用于文件/目录重命名。
示例,mv file.txt new_directory/ 或 mv file.txt new_name.txt.8. cat,用于查看文件的内容。
示例,cat file.txt.9. grep,用于在文件中搜索指定的模式。
示例,grep "pattern" file.txt.10. echo,用于在终端输出文本。
示例,echo "Hello, World!"11. chmod,用于修改文件或目录的权限。
示例,chmod 755 file.txt.12. ps,用于显示当前运行的进程。
示例,ps aux.13. kill,用于终止指定进程。
示例,kill PID.14. ssh,用于远程登录到其他计算机。
示例,ssh username@hostname.15. ping,用于测试网络连接。
示例,ping .这些只是Shell指令的一小部分,常见的使用实例也只是其中的一些示例。
Shell指令非常丰富和灵活,可以根据具体需求进行组合和扩展,以实现更复杂的操作。
shell编程case案例
shell编程case案例例1:判断输入的数字是奇数还是偶数。
```shell。
#!/bin/bash。
echo "请输入一个数字:"。
read num。
#判断输入的数字是奇数还是偶数。
case $((num % 2)) in。
0) echo "输入的数字是偶数" ;;。
1) echo "输入的数字是奇数" ;;。
esac。
```。
例2:根据用户输入的选项执行不同的操作。
```shell。
#!/bin/bash。
#显示菜单。
echo "请选择一个操作:"。
echo "1. 显示系统信息"。
echo "2. 显示用户信息"。
echo "3. 显示磁盘使用情况"。
echo "4. 退出"。
#循环读取用户输入的选项,根据选项执行不同的操作。
while true。
do。
read option。
case $option in。
1) echo "系统信息:"; uname -a ;;。
2) echo "用户信息:"; whoami ;;。
3) echo "磁盘使用情况:"; df -h ;;。
4) echo "退出" ;exit ;;。
*) echo "请选择1-4的数字" ;;。
esac。
done。
```。
例3:统计指定目录下文件的个数和目录的个数。
```shell。
#!/bin/bash。
echo "请输入目录路径:"。
read path。
#判断输入的路径是否存在。
if [ ! -d "$path" ]; then。
echo "输入的路径不存在"。
exit。
fi。
#统计文件和目录的个数。
filecount=0。
18个LinuxShell脚本经典案例课件PPT模板
05
1-11案例10:一键部署LNMP网站平台案例10: 一键部署LNMP网站平台
06
1-12案例11:监控MySQL主从状态是否异常案 例11:监控MySQL主从状态是否异常
第1章18个生产环境linuxshell脚 本案例
01
1-13案例12:MySQL数据库备份(分库分表) 案例12:MySQL数据库备份(分库分表)
06
1-18案例17:DOS攻击防范案例17:DOS攻击 防范
第1章18个生产环境 linuxshell脚本案例
1-19案例18:目录文件变化监 控与实时文件同步案例18:目录 文件变化监控与实时文件同步
1-20小结小结
感谢聆听
02
1-14案例13:Nginx访问日志分析案例13: Nginx访问日志分析
03
1-15案例14:Nginx访问日志自动按天切割案 例14:Nginx访问日志自动按天切割
04
1-16案例15:自动发布Java项目(Tomcat)案 例15:自动发布Java项目(Tomcat)
05
1-17案例16:自动发布PHP项目案例16:自动 发布PHP项目
03
1-3案例2:Linux系统发送告警邮件案例2: Linux系统发送告警邮件
04
1-4案例3:批量创建100个用户并设置随机密码 案例3:批量创建100个用户并设置随机密码
05
1-5案例4:一键查看服务器资源利用率案例4: 一键查看服务器资源利用率
06
1-6案例5:找出占用CPU、内存过高的进程案 例5:找出占用CPU、内存过高的进程
18个linuxshell脚本 经典案例
演讲人
2 0 2 x - 11 - 11
shell编程实例
shell编程实例Shell编程是一种适用于Unix和Linux操作系统的脚本语言,通过编写一系列的Shell脚本,可以实现自动化任务、文件处理、系统管理等多种功能。
本文将通过几个实际的Shell编程实例,向读者展示如何使用Shell脚本来完成一些常见的任务。
实例一:文件备份假设我们需要定期备份一个指定目录下的文件到另一个目录中。
首先,我们可以使用以下Shell脚本来实现文件备份的任务:```shell#!/bin/bash# 指定源目录和目标目录source_dir="/path/to/source"target_dir="/path/to/target"# 根据日期生成备份文件名backup_filename="backup_$(date +%Y%m%d).tar.gz"# 创建目标目录(如果不存在)mkdir -p "$target_dir"# 执行文件备份tar -zcf "$target_dir/$backup_filename" "$source_dir"```该脚本首先指定了源目录和目标目录的路径,然后使用`$(date +%Y%m%d)`来生成当前日期的备份文件名。
接着,使用`mkdir -p`命令创建目标目录(如果不存在),最后使用`tar`命令打包源目录并将备份文件保存到目标目录中。
实例二:文件搜索和替换假设我们需要在一个文件夹下的所有文件中,查找并替换特定的字符串。
我们可以使用以下Shell脚本来实现文件搜索和替换的任务:```shell#!/bin/bash# 指定文件夹路径和要查找的字符串及替换字符串folder="/path/to/folder"search_string="old_string"replace_string="new_string"# 搜索并替换文件内容grep -rl "$search_string" "$folder" | xargs sed -i"s/$search_string/$replace_string/g"```该脚本首先指定了文件夹路径、要查找的字符串以及替换字符串。
shell脚本案例
shell脚本案例Shell脚本是将一系列的命令写入脚本文件中,让其运行时具备特定的功能。
Shell脚本的一大优势是可以实现一步操作多项任务,在繁重的日常任务管理与网络管理领域中都有着广泛的应用。
本文将着重介绍几个常见的Shell脚本案例,让读者了解有关Shell脚本的实际操作方法。
第一个脚本是批量更改文件所有者及所有组的脚本,代码如下: #!/bin/bashfiles=`ls -A`user=usernamegroup=groupnamefor file in $files; dochown $user:$group $filedone这个脚本首先列出当前工作目录下的文件,并将所有者及所有组设置为指定的两个用户,最后应用chown命令将文件的所有者和所有组都更改为给定的用户及组。
第二个脚本是用来实现文件/文件夹的备份的脚本,代码如下: #! /bin/bashsrcdir=/srcdirbackdir=/backdirmkdir -p $backdircp -R $srcdir/* $backdir这个脚本将指定的源文件夹srcdir的所有内容复制到一个备份文件夹backdir中,确保原文件的完整性。
第三个脚本是用来批量修改文件权限的,代码如下:#! /bin/bashfiles=`ls -A`for file in $files; dochmod -R 755 $filedone这个脚本将当前工作目录下的所有文件/文件夹的可读写权限设置为755,755权限可让所有者及同一组用户可以具有执行及读写权限,而其他用户只有可以读取权限。
以上三个案例展示了Shell脚本的强大功能,能够帮助用户快速完成一系列的工作,避免执行重复的操作,非常适合用作日常任务的自动化管理。
Shell脚本操作简单,编写起来也比较简单,学习它也并不困难,只要用户掌握一定的shell基础知识就可以编写出非常强大的脚本文件。
此外,Shell脚本还可以通过cron计划任务实现定时执行操作,能够有效的节省用户的时间。
shell编程实例
shell编程实例Shell编程是一种脚本语言,广泛应用于Unix和Linux系统中。
通过编写Shell脚本,我们可以实现自动化的任务,并提高工作效率。
本文将介绍一些常见的Shell编程实例,帮助读者更好地理解和运用Shell 脚本。
1. 实例一:文件备份在Linux系统中,我们经常需要备份重要文件以防意外丢失。
下面是一个简单的Shell脚本示例,用于备份指定目录下的所有文件。
```shell#!/bin/bash# 定义备份目录和源目录backup_dir="/home/backup"source_dir="/home/data"# 创建备份目录mkdir -p $backup_dir# 备份源目录下的所有文件cp -r $source_dir/* $backup_dir# 输出备份完成信息echo "文件备份完成!"```以上脚本将源目录`/home/data`下的所有文件备份到目录`/home/backup`中。
备份完成后,脚本会输出"文件备份完成!"的提示信息。
2. 实例二:文件批量重命名有时候我们需要对大量文件进行批量重命名,比如将一个目录下的所有图片文件的扩展名从`.jpeg`改为`.jpg`。
下面是一个实现此功能的Shell脚本示例。
```shell#!/bin/bash# 定义源目录source_dir="/home/photos"# 进入源目录cd $source_dir# 重命名扩展名为.jpg的文件for file in *.jpegdomv "$file" "${file%.jpeg}.jpg"done# 输出重命名完成信息echo "文件重命名完成!"```以上脚本将目录`/home/photos`下所有扩展名为`.jpeg`的文件重命名为`.jpg`。
shell指令及其常见使用实例 -回复
shell指令及其常见使用实例-回复标题:深入理解与实践Shell指令及其常见使用实例Shell是Linux和Unix系统中的命令行解释器,它允许用户通过输入各种指令来与操作系统进行交互。
这些指令可以帮助我们执行各种任务,从文件管理到系统监控,甚至是编程。
以下是一些常见的Shell指令及其使用实例。
1. `ls`:列出目录内容这是最基本的命令之一,用于显示当前目录下的文件和子目录列表。
使用实例:ls这将列出当前目录下的所有文件和子目录。
2. `cd`:改变目录这个命令用于切换到指定的目录。
使用实例:cd /home/user/documents这将切换到/home/user/documents目录。
3. `mkdir`:创建新目录这个命令用于在当前目录下创建一个新的目录。
使用实例:mkdir new_directory这将在当前目录下创建一个名为new_directory的新目录。
4. `rm`:删除文件或目录这个命令用于删除指定的文件或目录。
使用实例:rm file.txt这将删除名为file.txt的文件。
5. `cp`:复制文件或目录这个命令用于复制文件或目录。
使用实例:cp file.txt /home/user/documents/这将复制file.txt文件到/home/user/documents/目录。
6. `mv`:移动或重命名文件或目录这个命令用于移动或重命名文件或目录。
使用实例:mv file.txt new_file.txt这将把file.txt重命名为new_file.txt。
7. `echo`:输出字符串或变量值这个命令用于在屏幕上显示指定的文本或变量值。
使用实例:echo "Hello, World!"这将在屏幕上显示"Hello, World!"。
8. `cat`:查看文件内容这个命令用于查看文件的内容。
使用实例:cat file.txt这将显示file.txt文件的内容。
shell指令常见的使用案例
Shell指令常见的使用案例1. 简介Shell是一种命令行解释器,主要用于在操作系统上执行用户命令。
通过Shell指令,我们可以控制计算机进行各种操作。
本文将详细介绍Shell指令的常见使用案例,包括文件操作、系统管理、进程控制、管道和重定向、文本处理等方面。
2. 文件操作文件操作是Shell指令最常见的使用场景之一。
下面是一些常用的文件操作指令案例:2.1 创建目录使用mkdir指令可以创建一个新的目录。
例如,要在当前目录下创建一个名为“test”的目录,可以执行以下指令:mkdir test2.2 切换目录使用cd指令可以切换当前工作目录。
例如,要进入“test”目录,可以执行以下指令:cd test2.3 列出文件使用ls指令可以列出当前目录下的文件和子目录。
例如,要列出当前目录下的所有文件和子目录,可以执行以下指令:ls2.4 复制文件使用cp指令可以复制文件。
例如,要将一个名为“file1”的文件复制到“test”目录下,可以执行以下指令:cp file1 test/2.5 删除文件使用rm指令可以删除文件。
例如,要删除一个名为“file1”的文件,可以执行以下指令:rm file13. 系统管理Shell指令还可以用于系统管理任务,如用户管理、权限管理等。
下面是一些常用的系统管理指令案例:3.1 添加用户使用useradd指令可以添加一个新用户。
例如,要添加一个名为“user1”的用户,可以执行以下指令:useradd user13.2 删除用户使用userdel指令可以删除一个用户。
例如,要删除一个名为“user1”的用户,可以执行以下指令:userdel user13.3 修改文件权限使用chmod指令可以修改文件的权限。
例如,要将一个名为“file1”的文件设置为所有者可读、写和执行,其他用户只有读权限,可以执行以下指令:chmod u=rwx,g=r,o=r file13.4 查看系统信息使用uname指令可以查看系统的一些基本信息。
Shell脚本例子集合
Shell脚本例子集合本文由L3_wings贡献doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
# 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 a number:";,要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值.直到用户输入";end";停止.# vi show_var.sh脚本内容:#!/bin/shunset varwhile [ "$var" != "end" ]do echo -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: 1 var is 1 please input a number: s var is s please 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/bash i=0 while [ $i -lt 10 ] do for j in '-' '\\' '|' '/' do echo -ne ";\033[1D$j"; usleep 50000 done ((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.txt 1 22保存# 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 Chose case ${Chose} in0) exit ;;1) date +;;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]:"readcontineif [ "${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/bash wc /etc/passwd保存 # chmod +x showwc.sh # ./showwc.sh 看效果.15.diff 判断文件的差异 # vi a.txt Hello World保存# vi b.txt Hello You保存 # vi showdiff.sh #!/bin/bash diff a.txt b.txt 保存 # chmod +x showdiff.sh # ./showdiff.sh15.diff 判断文件的差异# vi showawk.sh#!/bin/bashawk -F: '{print $1,$3}' /etc/passwd保存 # chmod +x showawk.sh # ./showawk.sh 看效果.16.test 判断文件的差异# vishowtest.sh#!/bin/bash#中间是 a 与操作,则都为 0 才得 0 #中间是 o 或操作,则有一真则真 0test -e /etc/passwd -a -e /etc/shadow echo $?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 nameif [ "${name}" == "" ]thenecho "You did not enter any information"else echo "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/nullthenecho "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 in100、90-99、85-89 100|9[0-9]|8[5-9]) echo "you are the best!";;80-84、70-79 8[0-4]|7[0-9]) echo "you get a good mark!";;70-74、60-69 7[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/bash T='gYw' # The test text echoecho ";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; do echo -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 << HELP xtitlebar -- change the name of an xterm, gnome-terminal or kde konsoleUSAGE: xtitlebar [-h] ";string_for_titelbar"; OPTIONS: -h help text EXAMPLE: xtitlebar ";cvs";HELP exit 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 看效果.shift 用法 2# vi showshift2.sh#!/bin/bashif [ $# -eq 0 ] thenecho ";Usage:x_shift2.sh 参数";exit 1 fisum=0until [ $# -eq 0 ]dosum=`expr $sum + $1`shiftdoneecho ";sum is: $sum";保存 # chmod +x showshift2.sh # ./showshift2.sh 10 20 15 sum 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.sh26.函数定义,调用,参数传递,这里主要实现数的乘方计算.# 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.sh Enter two numbers 23 2 to 3 is 827.函数定义,调用,参数传递,这里主要实现数的乘方计算,使用递归调用.# 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.sh Enter two numbers 32 3 to 2 is 9 看效果. 如果你输入 4 5 看看结果是什么 Enter two numbers 45 4 to 5 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.sh easy a is 30 easy b is 30 global a is 10 global 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.sh Enter two numbers 23 2 to 3 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}nihao mingzi out保存# chmod +x showfunction6.sh # ./showfunction6.sh .31.实现对输入参数的分析,但是下面的使用case 表达式的例子无疑是一个不错的方法.# vi param.sh#!/bin/shhelp(){cat << HELP This is a generic command line parser demo. USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2 HELP exit 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 1 opt_l is hello first arg is -somefile1 2nd arg is somefile2 这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case 表达式进行比较,如果匹配则设置一个变量并且移除该参数.根据unix 系统的惯例,首先输入的应该是包含减号的参数.32. DONE OK PASSED FAILED WARNING 的 shell 颜色控制显示# vi colorbase.sh#!/bin/shBOOTUP=color # 第一设置BOOTUP 变量,默认就是color RES_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_WARNING=";echo -en \\033[1;33m";# SETCOLOR_WARNING 设置后面将要输出的字体都为黄色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_FAILUREecho -n $"; FAILED "; [ ";$BOOTUP"; = ";color"; ] && $SETCOLOR_NORMALecho -n ";]";echo -ne ";\r"; return 1 }echo_passed() { [ ";$BOOTUP"; = ";color"; ] &&$MOVE_TO_COLecho -n ";["; [ ";$BOOTUP"; = ";color"; ] && $SETCOLOR_WARNINGecho -n $"; PASSED "; [ ";$BOOTUP"; = ";color"; ] && $SETCOLOR_NORMALecho -n ";]";echo -ne ";\r"; return 1 }echo_warning(){[ ";$BOOTUP"; = ";color"; ] && $MOVE_TO_COLecho -n ";["; [ ";$BOOTUP"; = ";color"; ] && $SETCOLOR_WARNINGecho -n $"; WARNING "; [ ";$BOOTUP"; = ";color"; ] && $SETCOLOR_NORMALecho -n ";]";echo -ne ";\r";return 1}保存 # vi testsuccess.sh #!/bin/sh . colorbase.sh echo_success echo ";I win."; echo_done echo ";I win."; echo_failure echo ";I think I will win."; echo_passed echo ";I passed."; echo_warning echo ";I think I will have no warning.";保存# chmod +x colorbase.sh # chmod +x testsuccess.sh # ./testsuccess.sh I 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 year year=`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 20100930 4 34. 自动让脚本调用其他脚本并输入相关的选择项,如果你没有安装expect 的话,请执行# yum install exepct 安装就可以了. # vi showfunction7.sh #!/bin/bash echo ";Enter one numbers"; read num1echo ";The number is $num1"; 保存# vi input.exp #!/usr/bin/expect -f spawn ./showfunction7.sh expect ";Enter one numbers";; send ";2\r";; interact;保存 # vi autoinput.sh #!/bin/bash ./input.exp# chmod +x showfunction7.sh # chmod +x input.exp # chmod +xautoinput.sh # ./autoinput.sh spawn ./showfunction7.sh Enter one numbers 2 The number is 2 看效果.35. 自动让脚本调用其他脚本并输入相关的选择项,多次调用输入 # vi showfunction8.sh #!/bin/bash echo ";Enter one numbers"; read num1 echo ";The number is $num1"; 保存 # vi input1.exp#!/usr/bin/expect -f spawn ./showfunction8.sh expect ";Enter one numbers";; send ";2\r";; interact; spawn ./showfunction8.sh expect ";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.sh spawn ./showfunction8.sh Enter one numbers 2 The number is 2 spawn ./showfunction8.sh Enter one numbers 3 The number is 3 看效果.来源于网络,回归于网络. 我的邮箱:happy.every.day@/doc/9a2276731.html, QQ:48399956 快乐! 2010 年 9 月 30 日对我有用[0] 丢个板砖[0] 引用举报管理 TOP 精华推荐:借人气宣传一下自己开发的语言 Dao merryboy等级: #2 楼得分:0 回复于:2010-09-30 16:22:12 FAQ,参考信息: 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 使用者自己的目录$PATH 执行命令时所搜寻的目录 $TZ 时区 $MAILCHECK 每隔多少秒检查是否有新的信件 $PS1 在命令列时的提示号 $PS2 当命令尚未打完时,Shell 要求再输入时的提示号 $MANPATH 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=1234 echo \$A 显示为$A 如果不加\将显示为1234 echo \` 显示为` echo \"; 显示为双引号 echo \\ 显示为\ 三、` 反引号反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用 shell 编程时经常用的到将系统命令的执行结果赋给一个变量 A=`date` echo $A 显示的不是 date 而是当时的时间串比如有一文件 A 的内容如下 ABCDEFG 1234456 abcdefg B=`cat A|grep 234` # 检索文件 A 中含有字符串 234 的行 echo $B 将显示为 1234456 echo ";$B"; 将显示为什么? echo ";\$B"; 将显示为什么?读者自己试试四、";双引号在系统中有些特殊字符,为避免引用这些特殊字符往往用双引号或单引号将这些特殊字符引起来,使其不具有特殊含义. 但有一部分特殊字符在引号中还是具有特殊含义,用双引号引起来是不起作用的.本文中所列的前四个特殊字符在双引号中还是特殊字符.为了使其不具有特殊含义一是用单引号引进来二是用\反斜线使其失去作用. 比如我们想原样输出这些特殊字符echo ";";"; echo ";$"; echo ";\"; echo ";`"; 以上不是你所期望的结果,因为双引号对它们不起作用,你只能这样才能输出这些特殊字符的原形 echo '";' echo '$' echo '\' echo '`' 或 echo ";\";"; echo ";\$"; echo ";\\"; echo ";\`"; 将分别显示为 "; $ \ ` 五、其它特殊字符大家注意到,除了前四个特殊字符外,我将其它的特殊字符都放在一块,这是因为前四个特殊字符在双引号中还是具有特殊含义,所以单独拿出来讲,除此以外的特殊字符如果你要输出这些特殊字符的原形,你就可以用双引号或单引号引起来使其失去特殊含义. ,*,?,[,]对shell 有特殊含义但你可以用双引号引起来输入这些原形一、if 条件语句格式: if 条件表达式 then #当条件为真时执行以下语句命令列表 else #为假时执行以下语句命令列表 fi if 语句也可以嵌套使用 if 条件表达式 1 then if 条件表达式 2 then 命令列表 else if 条件表达式 3 then 命令列表 else 命令列表 fi fi else 命令列表 fi 你可以进行多层嵌套一个 if 语句一定要跟一个 fi 表示该层条件结束否则会造成语法错误结合前面讲的举例如下: 这里先讲一个条件语句中用到的命令test 表示测试 test 后面的条件是否为真 if test -f ";$1"; then lpr $1 else if test -d ";$1"; then cd $1 lpr $1 else echo ";$1 不是文件或目录"; fi fi以上的例子还可以改成如下所示 if test -f ";$1"; then lpr $1 elif test -d ";$1"; #elif 同 else if then (cd $1;lpr $1) else echo ";$1 不是文件或目录"; fi 以上的例子不知您是否看懂是什么意思吗?假如我们现在将这个例子保存为prfile chmod +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=0 i=0 while true #true 是系统的关键词表示真 do i=`expr $i + 1` Sum=`expr $Sum + $i` if [ $i = ";100"; ] then break; fi done echo $i $Sum 最后这个程序显示的是 100 5050 这个程序的运算就是将 1 到 100 加起来下面将这个程序再改动一下 Sum=0 i=0 while [ $i != ";100"; ] doi=`expr $i + 1` Sum=`expr $Sum + $i` done echo $i $Sum 改动后的程序运算结果和上面是一样但程序比上面的要简练在这个循环中还可以以 until 做为测试条件它正好与 while 测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子. Sum=0 i=0 until [ $i = ";100"; ] do i=`expr $i + 1` Sum=`expr $Sum + $i` done echo $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 a5 do diff aa/$File bb/$File done 下面再举一个不带名字列表的例子 for File do echo $Filw done 文件内容保存在 a.sh 中并可执行我们在执行这个shell 程序时命令行如下: a.sh a1 a2 a3 a4 a5执行结果如下: a1 a2 a3 a4 a5 大家从这个例子中可以看到命令行的参数被逐一读入一次三.循环控制语句 break 命令不执行当前循环体内 break 下面的语句从当前循环退出. continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
C) echo "your selection is Copy" ;;
D) echo "your selection is Delete" ;;
B) echo "your selection is Backup" ;;
Q) echo "Exit ..." break ;;
*) echo "invalid selection,please try again"
echo "Not enough parameters" exit 0 fi if [ $1 -eq $2 ]; then echo "$1 equals $2"
elif [ $1 -lt $2 ]; then echo "$1 less than $2"
elif [ $1 -gt $2 ]; then echo "$1 greater than $2"
#break
done
# !/bin/bash
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/Thizlinux/RPMS/*.rpm
for rpmpackage in $*;
do
if [ -r "$rpmpackage" ];
then
echo "=============== $rpmpackage =============="
/bin/rpm -qip $rpmpackage
else
echo "ERROR: cannot read file $rpmpackage"
则循环刚才的过程,否则退出。
#!/bin/bash
# favourite OS.
samli
2004.4.19
echo "What is your favourite OS?"
select var in "Linux" "UNIX" "Windows" "Other"; do
echo "You have selected $var."
# #answer="no" # #e cho "***********************************************************************" #e cho "Please press "Enter" key to continue"
#read #while [ $answer = "no" ] #do # echo # echo "1.Are you a boy ? (yes/no)" # read answer #done # #answer="no" # #until [ $answer = "yes" ] #do # echo # echo "2.Are you foolish ? (yes/no)" # read answer #done # #answer="no" # #until [ $answer = "yes" ] #do # echo # echo "3.Do you love me ? (yes/no)" # read answer #done # #e cho "***********************************************************************" #e cho #e cho "Now ! I know you are a foolish girl and you love me."
#! /bin/sh sum=0 for i in $* do
sum=`expr $sum + $i` done echo $sum abc=123 echo $abc
###定义函数 example1() { abc=456 } ###调用函数 example1 echo $abc abc=234234 example1 echo $abc ###定义函数,使用参数 example2() { echo $1 echo $2 } ###调用函数,向它传递参数 example2 abc bbb example2 dksdfsdfsfaa bbb #!/bin/bash echo "please input a file name:" read file_name if [ -d $file_name ] then echo "$file_name is a directory" elif [ -f $file_name ] then echo "$file_name is a regular file" elif [ -c $file_name -o -b $file_name ] then echo "$file_name is a device file" else echo "$file_name is an unkonwn file" fi #! /bin/sh read first second third echo "the first parameter is $first" echo "the second parameter is $second" echo "the third parameter is $third" #! /bin/sh if [ $# -ne 2 ]; then
read op
case $op in
C)
echo "your selection is Copy"
;;
D)
echo "your selection is Delete"
;;
B)
samli
2004.4.19
echo "your selection is Backup" ;; *)
echo "invalid selection" esac #! /bin/sh while true do
tar jxvf $1
;; gz)
tar zxvf
$1
;; *)
echo "wrong file type"esac6.写一个脚本以方便用户查询 rpm 的
相关信息。这个脚本首先提示用户选择查询依据,比如文件名,包名,全部等。然后提示用户
选择查询信息,比如包名,包里所包含的所有文件,包的信息等。然后询问是否继续查询,是
if [ "$var" = "end" ]
then
break
fi
echo "var is $var"