赞
踩
Shell 是一个用 C 语言编写的应用程序,提供了一个界面,用户通过这个界面访问操作系统内核的服务。 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。扩展名为 .sh(sh代表shell),扩展名并不影响脚本执行
业界所说的 shell 通常都是指 shell 脚本,但shell 和 shell script 是两个不同的概念。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
使用一个定义过的变量,只要在变量名前面加美元符号$即可
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
- 只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变(否则报错)
- 删除变量:使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。
授权:chmod 755 xxx.sh 运行:bash xxx.sh或sh xxx.sh或./xxx.sh
# 输出1...10的平方
#!/bin/bash
for n in 1 2 3 4 5 6 7 8 9 10
do
echo -n $(($n*$n))
echo -n " "
done
#输出1...100中能被5整除的数
#!/bin/bash
for i in {1..100}
do
if [ $(($i%5)) -eq 0 ]
then echo $i
fi
done
#输入一个整型数 a,计算 1+2+...+a 之和并将其输出
#!/bin/bash
read -p "请输入一个整型数:" a
sum=0
i=1
while [ $i -le $a ]
do
sum=$(($sum + $i))
i=$(($i+1))
done
echo "a的阶和为:" $sum
#显示下面序列的前10个数字:0,1,1,2,3,5,8,13,...
#->斐波那契数
#!/bin/bash
a=0
b=1
echo –n $a,$b
for ((i=0;i<8;i++))
do
c=$((a+b))
a=$b
b=$c
echo –n,$c
done
#写一个shell脚本来得到当前的日期,时间,用户名和当前工作目录
#!/bin/bash
echo "当前的日期/时间: `date`"
echo "用户名: $LOGNAME"
echo "当前工作目录: `pwd`"
#进行两个数字的相加,如果没有输入参数就输出错误信息和一行使用说明
#!/bin/bash
if[ $# -ne 2 ]
then
echo "Usage - $0 x y"
echo "无输入参数"
exit 1
fi
echo "sum of $1 and $2 is `expr $1 + $2`"
echo "sum = $1 + $2 = `expr $1 + $2`"
#编写一个shell脚本,求两个数的和
#!/bin/bash
x = $1
y = $2
let "z = $x + $y"
echo $1 + $2 = $z
#输入分数score,如果大于等于60分并且小于80分,输出"成绩良好";如果大于等于80分,输出"成绩优秀";如果小于60分,输出"成绩不及格" #!/bin/bash while true do echo "请输入分数(0-100):" read score if [ $score = "q" ] then exit fi if [ $score -ge 60 -a $score -lt 80 ] then echo "成绩良好" elif [ $score -ge 80 ] then echo "成绩优秀" else echo "成绩不及格" fi done
#编写脚本/root/bin/backup.sh,可实现每日将/etc/目录 备份到/root/etcYYYY-mm-dd中
#!/bin/bash
date=$(date +%F)
cp -a /etc/ /root/etc$date
#输入一个人的出生日期,计算此人今年多少岁今天距此人今年生日还有多少天 #!/bin/bash read -p "请输入出生日期(YY-MM-DD):" birth this_year=`date +%Y` birth_year=$(date --date="$birth" +%Y) echo "今年 $(($this_year-$birth_year)) 岁" now_birth=$this_year-$(date --date="$birth" +%m-%d) now_birth_s=$(date --date="$now_birth" +%s) this_year_s=$(date +%s) date_s=$(($now_birth_s-$this_year_s)) date_day=$(($date_s/60/60/24)) if [ $date_s -lt 0 ] then echo "今年生日已过" else echo "距今年生日还有 ${date_day} 天" fi
#编写一个shell脚本,用于判别其后用参数方式指定的一系列文件是否存在
#! /bin/bash
while test -n “$1”
do
if test -e $1
then echo $1 exist
else echo $1 not exist
fi
# shift
done
#编写一个shell脚本,判断所给参数是否为一个目录
#! /bin/bash
test –d $1 && echo “$1 is a directory” && exit 0
echo “$1 is not a directory”
exit 1
#创建一个shell 脚本,它从用户那里接收10个数,并显示已输入的最大的数
#! /bin/bash
COUNT=1;
read MAX;
while [ $COUNT -lt 10 ];
do read VALUE;
if [ $VALUE -gt $MAX ];
then MAX=$VALUE;
fi;
COUNT=`expr $COUNT + 1`;
done;
echo $MAX
#写个shell脚本来把字符串反过来显示;例如:给定abcde 输出edcba
#!/bin/bash
echo "enter a string "
read str
len=${#str}
echo $str|rev
#打印一个给定的数字的反序,如输入10572,输出27501,如果没有输入数据,应该抛出错误和使用脚本说明 #算法步骤: #1.输入的数字为n #2.赋值 rev=0, sd=0 (反向和单个数字设置为0) #3.n % 10, 将得到最左边的数字 #4.反向数字可以用这个方法生成 rev * 10 + sd #5.对输入数字进行右位移操作(除以10) #6.如果n > 0, 进入第三步,否则进行第七步 #7.输出rev 现在,创建一个名为`numbers.sh`文件,并添加以下代码。 #!/bin/bash if [ $# -ne 1 ] then echo "Usage: $0 number" echo " I will find reverse of given number" echo " For eg. $0 0123, I will print 3210" exit 1 fi n=$1 rev=0 sd=0 while [ $n -gt 0 ] do sd=`expr $n % 10` rev=`expr $rev \* 10 + $sd` n=`expr $n / 10` done echo "Reverse number is $rev"
#利用while循环完成输出循环10次内容
#!/bin/bash
loop=0
while test $loop -ne 10 ]
do
loop=$(($loop+1))
echo "currnet value of loop is:$loop"
done
#编写一个Shell脚本,打印任何数的乘法表。例如,如果你执行此脚本,它应请求一个数,并显示它的表。其示例输出如下: #2 #2*1=2 #2*2=4 #2*3=6 #2*4=8 #2*5=10 #2*6=12 #2*7=14 #!/bin/bash echo "enter a number " read num k=1 while test %k -le 10 do sum=$((${sum}*${k})) k=$((${k}+1)) echo "${num} * ${k} = ${sum} done
#使用进程调度启动,指定1小时后(或在2013年11月28日晚上20点30分)将/usr/mysql/目录里的文件备份并压缩为mysql_data.tar.gz,并放到/home/temp目录里(当前/home/temp目录并不存在)
#!/bin/bash
at now + 60 mimutes
mkdir /home/temp;
tar -czf /home/temp/mysql_data.tar.gz /user/mysql
#设计一个shell程序,实现"在每月的第1天和第15天的18点30分对/etc目录下的内容进行压缩并备份"的功能。备份的文件存放在/root/bak目录里,命名格式为:yymmddetc。其中yy为年,mm为月,dd为日。shell程序fileback存放在/usr/bin目录下。最后再写出添加定时任务、运行任务定时器crontab的命令序列。 首先,编写shell程序fileback: #! /bin/bash DIRNAME=ls /root | grep bak if [ -z "$DIRNAME" ] ; then mkdir /root/bak cd /root/bak fi YY=date +%y MM=date +%m DD=date +%d BACKETC=$YY$MM$DDetc.tar.gz tar -zcvf $BACKETC /etc echo "fileback finished!" 之后再编写任务定时器: echo "30 18 1,15 /bin/bash /usr/bin/fileback" >> /root/etcbakcron crontab /root/etcbakcron 或使用crontab -e 命令后,再添加定时任务,如下所示: 30 18 1,15 /bin/bash /usr/bin/fileback
#编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本, CPU型号,内存大小,硬盘大小。
#!/bin/bash
BEGINCOLOR="\e[1;35m"
ENDCOLOR="\e[0m"
echo -e "My hostname is ${BEGINCOLOR}`hostname`$ENDCOLOR"
echo -e "IP address is ${BEGINCOLOR}`ifconfig ens33 |grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -n1`$ENDCOLOR"
echo -e "OS version is ${BEGINCOLOR}`cat/etc/redhat-release`$ENDCOLOR"
echo -e "Kernel version is ${BEGINCOLOR}`uname -r`$ENDCOLOR"
echo -e "CPU type is ${BEGINCOLOR}`lscpu|grep "Model name" |cut -d:-f2 |tr -s " "`$ENDCOLOR"
echo -e "Memtotol is ${BEGINCOLOR}`cat /proc/meminfo |head -n1 |grep -Eo '[0-9]+.*'`$ENDCOLOR"
echo -e "Disk space is ${BEGINCOLOR}`lsblk |grep 'sda\>'|grep -Eo '[0-9]+[[:upper:]]'`$ENDCOLOR"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。