一、shell脚本编程
Shell和shell脚本的区别
shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。Shell本身是一个用C语言编写的程序,他是用户使用Linux的桥梁。
shell即是一种命令语言,优势一种程序设计语言(就是我们所说的shell脚本)。作为命令语言,它互动德解释和执行用户输入的命令;作为程序命令语言它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。
(1)bash中的算术运算
操作符:+, -, *, /, %(取余),
+=, -=,*=, /=, %=
declare
-i:整型变量
-x:环境变量,类似于export
let varName='算数表达式'
varName=$[算术表达式]
varName=$((算术表达式))
varName=`expr $num1 + $num2`
示例:
(1)
# num1=5
# num2=6
# let sum="$num1*$num2"
# echo $sum
30
# sum=$[num2 - num1]
# echo $sum
1
# sum=`expr $num1 + $num2`
# echo $sum
11
# num1=11
# num2=5
# sum=$((num1/num2))
# echo $sum
2
注意:如果计算结果中存在小数,将会被圆整;
# num1=11
# num2=2
# sum=$[num1%num2]
# echo $sum
1
#a=40
#a=$[a+=2]
#echo $a
42
自加并赋值给自身
# a=$[a-=2]
# echo $a
40
自减并赋值给自身
#a=40
# a=$[a*=2]
# echo $a
80
乘等并赋值给自身
.....
(2)计算100以内所有整数之和;
#!/bin/bash
#
declare -i sum=0
for i in {1..100}; do
let sum=$[$sum+$i]
done
echo "The sum is: $sum."
(3)分别计算100以内所有偶数之和和奇数之和;
#!/bin/bash
#
declare -i oddSum=0, evenSum=0
for i in `seq 1 2 100`; do
oddSum=$[$oddSum+$i]
done
for j in `seq 2 2 100`; do
evenSum=$[$evenSum+$j]
done
echo "The even Sum is: $evenSum, the odd sum is: $oddSum"
(2)变量的类型 :
本地变量:只对当前shell进程有效,对其子shell及其他shell都无效;
定义变量:[set]Var_Name="Value"
引用变量:${Var_Name}
撤销变量:unset Var_Name
局部变量:仅对局部代码生效;
local Var_Name="Value"
环境变量:对当前shell进程及其子进程有效;
export Var_Name="Value"
位置参数变量:
$0:脚本自身
(4)#!/bin/bash
#
echo "The sum is: $[$1+$2]"
echo $0
# ./opt.sh 10 11
The sum is: 21
./opt.sh
$1:脚本的第一个参数
$2:脚本的第二个参数
....
(5)
#!/bin/bash
#
echo "The sum is: $[$1+$2]"
#chmod +x opt.sh
#./opt.sh 10 11
The sum is: 21
特殊变量:
$#:位置参数的个数;
# ./opt.sh 10 11 9 8
The sum is: 21
4
$*,$@:引用所有的位置参数
(6)
#!/bin/bash
#
echo "The sum is: $[$1+$2]"
echo $*
echo $@
# ./opt.sh 10 11 9 8
The sum is: 21
10 11 9 8
10 11 9 8
$?:上一条命令的执行状态
状态用数字表示:
0:表示成功
1-255:失败
给变量以默认值
varName=${varName:-value}
如果varName不空,则其值不变;否则,VarName会使用value做为其值;
read:用户交互脚本;
-p:提示符
-t [n]:超时时间
(7)
#!/bin/bash
#
read -t 5 -p "Enter a number: " num
num=${num:-0}
echo $num
# ./num1.sh
Enter a number: 0 #上面-t指定的超时时间为5秒钟,如果执行脚本之后等5秒钟(或直接回车),就会把设定的默认值显示出来;
(8)通过键盘给定一个文件的路径,来判断文件内容的类型:
vim judge.sh
#!/bin/bash
#
read -p "Enter a file path: " fileName
file $fileName
bash judge.sh
Enter a file path: /etc/issue
/etc/issue: ASCII text
二、Bash编程之条件判断:
条件判断的常用测试类型:
整数测试
字符测试
文件测试
命令状态返回值:
$?
0:真
1-255:假
逻辑运算:
与运算:
真 && 真 = 真
真 && 假 = 假
假 && 真 = 假
假 && 假 = 假
或运算:
真 || 真 = 真
真 || 假 = 真
假 || 真 = 真
假 || 假 = 假
非运算:
!真 = 假
!假 = 真
Bash中条件判断中if的使用;
单分支:
if 条件;then
分支1
fi
双分支:
if 条件;then
分支1
else
分支2
fi
多分支:
if 条件1;then
分支1;
elif 条件2;then
分支2;then
elif 条件3;then
分支3;
.....
else
分支n;
fi
示例:
(9)让用户指定一个文件,判定;如果文件有空白行,就显示空白行数,否则,就说明文件无空白行;
#!/bin/bash
#
read–p “Enter a file path: ” filename
if grep “^$”$fileName &> /dev/null; then
linesCount=`grep “^$” $fileName | wc -l`
echo “$fileName has $linesCount space lines.”
else
echo “$fileName hava no space line.”
fi
(10)
显示如下菜单:
cpu)show cpu info;
mem)show memory info;
quit)quit
Enter your options: CPU Cpu Cpu
如果用户选择cpu,则显示文件/proc/cpuinfo的信息;
无果用户选择mem,则显示文件/proc/meminfo的信息;
如果用户选择quit,则退出,并且退出吗为5;
如果用户键入其他字符,则显示位置选项,请重新执行脚本;退出码为6;
vim showinfo.sh
#!/bin/bash
#
returnValue=0
cat /dev/null; then
userID=`id –u $userName`
echo “$userName: $userID”
else
echo “$userName not exist.”
fi
(15)让用户通过键盘输入一个用户名,如果用户不存在就退出;如果其UID等于其GID,就说他是“good guy” 否则,就说他是个“bad guy”;
#!/bin/bash
#
read -t 10 -p "Enter a username: " userName
if ! id $userName &> /dev/null; then
echo "$userName not exist."
exit 6
fi
if [ `id -u $userName` -eq `id -g $userName` ]; then
echo "Good guy"
else
echo "Bad guy"
fi
(16)添加10个用户stu1-stu10;但要先判断用户是否存在;
如果存在,就用红色显示其已经存在;
否则,就添加此用户,并绿色显示;
最后显示一共添加了几个用户;
vim user.sh
#!/bin/bash
#
declare -i userCount=0
for i in {1..10}; do
if id stu$i &> /dev/null; then
echo -e "\033[31mstu$i\033[0m exists."
else
useradd stu$i && echo -e "add \033[32mstu$i\033[0m finished."
let userCount++
fi
done
echo "Add $userCount users."
# bash user.sh
add stu1 finished.
add stu2 finished.
add stu3 finished.
add stu4 finished.
add stu5 finished.
add stu6 finished.
add stu7 finished.
add stu8 finished.
add stu9 finished.
add stu10 finished.
Add 10 users.
2、字符测试
双目:
>:大于
/dev/null || exit 5
downloader=`which wget`
[ -x $downloader ] || exit 6
$downloader $url
#bash download.sh
(18)
分别复制/var/log下的文件至/tmp/logs/目录中;
复制目录时,才使用cp -r
复制文件时,才使用cp
复制链接文件,使用cp -d
如果是其他文件,使用cp -a
vim cplog.sh
#!/bin/bash
#
targetDir='/tmp/logs'
[ -e $targetDir ] || mkdir $targetDir
for fileName in /var/log/*; do
if [ -d $fileName ]; then
copyCommand='cp -r'
elif [ -f $fileName ]; then
copyCommand='cp'
elif [ -h $fileName ]; then
copyCommand='cp -d'
else
copyCommand='cp -a'
fi
$copyCommand $fileName $targetDir
done
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com