设为首页 收藏本站
查看: 946|回复: 0

Shell编程之算数、条件测试read详解二(待续...)

[复制链接]

尚未签到

发表于 2018-8-28 09:26:15 | 显示全部楼层 |阅读模式
  一、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做为其值;
DSC0000.png

  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
DSC0001.png

  (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

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557568-1-1.html 上篇帖子: shell脚本----语法初探之1 下篇帖子: shell编程:自动格式化硬盘并挂载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表