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

shell运算方法

[复制链接]

尚未签到

发表于 2018-8-23 10:04:26 | 显示全部楼层 |阅读模式
  例一:运算符的写法
  a=1
  let a++
  let 'a+=2'
  b=`expr $a + 3`         #注意=号两边不要有空格,还有+号两边要有空格
  c=$((a+5))
  d=$[a+7]
  echo $a
  echo $b
  echo $c
  echo $d
  +
  -
  *
  /
  %
  **
  -------------------------------------------------------------------------
  --常用的bash内部命令
  echo     exit      continue      break
  例二:循环  (使用sh $0)
  echo 'aaaaa'
  sleep 3
  sh $0  --这一句是代表再重新执行上面的代码
  exit 10 --这个定义退出整个脚本,但是在这个脚本里永远也到不了这一步
  ---------------------------------------------
  for 循环语句
  for  var    in  1 2 3 4 5
  do
  command
  done
  for (( var=1 ; var < 6 ; var++ ))
  do
  command
  done
  for (( var=5; var >0 ; var--))
  do
  command
  done
  ---------------------------------------------------------------------
  例三: for循环举例
  for  i   in 1 2 3 4 5
  do
  echo -ne &quot;$i\n&quot;--如果不使用-n参数,默认会一个数字打印一行,-e参数代表后面如果使用\n(换行),\t(制表符)等这种字符时会生效,所以这句和echo $i效果一样
  done
  for i  in `seq 100`  --产生1到100的序列
  do
  echo -n $i
  done
  for i in {50..100}
  do
  echo -n $i
  done
  echo
  for i in $(seq 100)  --也是产生1到100的序列,这是另一种写法
  do
  echo -n $i
  done
  for  i  in  /etc/* --也可以把一个目录下面所有文件和目录循环赋值给变量i,常用于批量改名或改权限
  do
  echo $i
  done
  for i in /etc/*
  do
  [ -f $i ] && echo $i --加一个判断,只要里面的文件
  done
  思考:
  要把/etc/下所有的文件包括子目录下的文件也找出来,并echo出来
  for i in `find /etc/ -type f`
  do
  echo $i
  done
  find /etc/ -type f | while read i   --把前面find的结果通过管道read给i变量
  do
  echo $i
  done
  批量加10个用户,以student1到student10命名,并统一加一个新组,组名为class,统一改密码为123(统一把密码改成就是自己的用户名,使用passwd命令和EOF结合?)

  groupadd>  for i in `seq 10`
  do

  useradd -G>  echo 123 | passwd --stdin &quot;student$i&quot; > /dev/null  2>&1
  done
  ----------------

  groupadd>  for i in `seq 10`
  do

  useradd -G>  passwd &quot;student$i&quot; &1
  student$i
  student$i
  EOF  --注意这几行要顶格写
  done
  批量删除刚才建立的10个用户(包括把用户的家目录和邮件目录给删除干净)
  for i in `seq 10`
  do
  userdel -r &quot;student$i&quot;
  done

  groupdel>  计算1到100的奇数之和
  total=0
  for (( i=1 ;i > /tmp/downip || echo &quot;$ip&quot; >> /tmp/upip
  done
  echo &quot;能ping通的ip有:&quot;
  cat /tmp/upip
  echo &quot;#################&quot;
  echo &quot;不能ping通的ip有:&quot;
  cat /tmp/downip
  read输入一个目录,找出目录下为死链接的文件(同步也要判断子目录下的所有文件又如何写?)
  read -p &quot;输入一个目录:&quot; dir
  for i in $dir/*
  do
  [ -h $i -a ! -e $i ] && echo &quot;$i是死链接&quot;
  done
  ------------------------
  read -p &quot;输入一个目录:&quot; dir
  for i in  `find $dir -type l`
  do
  [ ! -e $i ] && echo &quot;$i是死链接&quot;
  done
  用read输入一个目录,使用脚本判断目录里每个文件的权限(是否可读,是否可写,是否可执行)
  #!/bin/bash
  read -p &quot;输入一个目录:&quot; dir
  [ -d $dir ] && echo &quot;是一个目录,继续执行&quot; || echo &quot;不是一个目录,请重新运行脚本&quot;
  for i in `find $dir -type f`
  do
  [ -r $i ] && r=yes || r=no
  [ -w $i ] && w=yes || w=no
  [ -x $i ] && x=yes || x=no
  echo &quot;当前用户对$i的权限为:&quot;
  echo $r
  echo $w
  echo $x
  done
  用read输入一个用户,再用read输入一个目录,使用脚本判断目录里每个文件的权限(read输入的用户对其是否可读,是否可写,是否可执行)
  --提示:如何去用root用户去变成一个普通用户身份去执行脚本? man su 查看-c参数
  --第一个脚本
  [root@dns shell02]# cat example10.sh
  #!/bin/bash
  read -p &quot;输入你要判断的用户名:&quot; name
  id $name > /dev/null 2>&1
  if [ $? -eq 0 ];then
  echo &quot;用户名存在,继续执行&quot;
  else
  echo &quot;用户名不存在,请重新运行脚本,输入正确的用户名&quot;
  exit 1
  fi
  su - $name -c &quot;sh /tmp/example102.sh&quot;
  第二个脚本: --此脚本最后放到/tmp下,让所有用户可以执行
  [root@dns shell02]# cat example102.sh
  #!/bin/bash
  user=`id | cut -d&quot;(&quot; -f2 |cut -d &quot;)&quot; -f1`   --查找自己的用户名,可以用whoami替代
  read -p &quot;输入一个目录:&quot; dir
  if [ -d $dir ];then
  echo &quot;是一个目录,继续执行&quot;
  else
  echo &quot;不是一个目录或目录不存在,请重新运行脚本&quot;
  exit 1
  fi
  for i in `find $dir -type f`
  do
  [ -r $i ] && r=yes || r=no
  [ -w $i ] && w=yes || w=no
  [ -x $i ] && x=yes || x=no
  echo &quot;$user对$i的权限为:&quot;
  echo &quot;read=$r&quot;
  echo &quot;write=$w&quot;
  echo &quot;execute=$x&quot;
  done
  =================================
  until 循环 --直到满足条件就退出循环
  例十二:用until实现打印1到5
  a=1
  until [ $a -gt 5 ]    for ((a=1;a>5;a++))
  do
  echo $a
  let a++
  done
  练习:
  使用unitl去改写上面的批量加用户的脚本

  groupadd>  i=1
  until [ $i -gt 10 ]
  do

  useradd -G>  passwd &quot;student$i&quot; &1
  student$i
  student$i
  EOF
  let i++
  done
  =====================================================
  while  用于不定次数的循环,或死循环
  while  [条件]
  do
  command
  done
  死循环两种:
  while true
  do
  command
  done
  while :
  do
  command
  done
  写一个30秒就时间同步2.2.2.35一次的脚本
  while true
  do
  rdate -s 2.2.2.35
  sleep 30
  done
  --不定次数循环,当满足一定条件,就退出循环
  while true
  do
  rdate -s 2.2.2.35  > /dev/null 2>&1
  [ $? -ne 0 ] && echo &quot;rdate failed&quot; | mail root && exit 100
  sleep 30
  done
  写一个小闹钟的程序  (每秒都显示时间,当到了时间,就循环打印5个*,间隔一秒)
  while true
  do
  now=`date +%H:%M:%S`
  echo $now
  sleep 1
  clear
  if [ &quot;$1&quot; == &quot;$now&quot; ];then
  for (( i=0;i> /tmp/systemuser
  [ $uid -eq 65534 ] && echo &quot;$name&quot; >> /tmp/systemuser
  [ $uid -gt 500 -a $uid -ne 65534 ] &&  echo &quot;$name&quot; >> /tmp/nomaluser
  done
  写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数
  read -p &quot;输入一个你要删除空文件的目录:&quot; dir
  a=0
  for i in `find $dir -type f`
  do
  [ ! -s $i ] && rm -rf $i && let a++
  done
  echo &quot;删除的个数为:&quot; &quot;$a&quot;
  -----------------------------------
  --下面这种写法有问题,循环内部let a++确实加了值,但循环之后的a值还是为0
  a=0
  find $dir -size 0c | while read i
  do
  rm -rf $i && let a++
  done
  echo $a   --???????
  写一个倒计时脚本,要求显示离2012年1月1日的凌晨0点,还有多少时间
  #!/bin/bash
  while true
  do
  year=$[2011-`date +%Y`]
  month=$[12-`date +%m`]
  day=$[31-`date +%d`]
  hour=$[23-`date +%H`]
  minute=$[59-`date +%M`]
  second=$[60-`date +%S`]
  echo &quot;离2012年还有$year年:$month月:$day天:$hour时:$minute分:$second秒&quot;
  sleep 1
  done
  --上面的问题大概有几个:
  1.倒计时不用月,因为每月的天数不一样。只用天的话,用365去减也不准确,因为闰年是366天
  2,当分钟为0几分时,如08分  那么59-08,它不能减
  --正确写法如下:
  #!/bin/bash
  goal=`date +%s -d 20120101`
  while true
  do
  now=`date +%s`
  day=$[($goal-$now)/86400]
  hour=$[($goal-$now-$day*86400)/3600]
  minute=$[($goal-$now-$day*86400-$hour*3600)/60]
  second=$[$goal-$now-$day*86400-$hour*3600-$minute*60]
  echo &quot;离2012年还有$day天:$hour时:$minute分:$second秒&quot;
  sleep 1
  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.iyunv.com/thread-555416-1-1.html 上篇帖子: shell实例(关于内存) 下篇帖子: vmvm分配SAN shell
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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