Linux之Shell脚步实码在线-案例学习

Shell简介

Shell 是一个用 C 语言编写的应用程序,提供了一个界面,用户通过这个界面访问操作系统内核的服务。 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。扩展名为 .sh(sh代表shell),扩展名并不影响脚本执行
业界所说的 shell 通常都是指 shell 脚本,但shell 和 shell script 是两个不同的概念。

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

使用一个定义过的变量,只要在变量名前面加美元符号$即可
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

运行shell时,会同时存在三种变量类型:
  1. 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量:所有的程序都能访问环境变量,必要的时候shell脚本也可以定义环境变量。
  3. shell变量:由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量
  • 只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变(否则报错)
  • 删除变量:使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。
Shell实例

授权: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 “$1do
  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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值