shell脚本大全(to del)

1 条件判断
数字比较:
   -eq 等于;-ne 不等于;-gt 大于;-lt 小于;-ge 大于等于;-le 小于等于;
字符串比较
  不相等 "$A" !="$B" 相等"$A" =="$B"

2 各种循环
 while true循环:
  while :
  do
    内容
  done
 
 while循环
  while [ $i -le 100 ]
  do
    let i+=2
  done

 for循环,可以遍历指定数组;
  a=(1 2 3 4 6 7 8 9 10 11 12 13)
  for i in "${!a[@]}";
  do
    echo "${a[$i]}"
  done

3 时间相关操作
3.1 获取当前时间
  $(date +"%Y-%m-%d %H:%M:%S")

计算某个程序的耗时;代码如下:

  startTime_s=`date +%s`
  operateXXX
  endTime_s=`date +%s`
  sumTime=$[ $endTime_s - $startTime_s ]
  echo "time cost : $sumTime s"

  如何将耗时以s统计的,换成以分钟,小时统计的呢?
    可以直接使用[],如下,不过这种方式都是int数除法,比如4/3 = 1;
      echo "cost : $sumTime s = $[sumTime/60] m = $[sumTime/3600] h"
    如果需要小数,可以使用bc工具,用scale控制保留几位小数;
      time_m=`echo "scale=2; $sumTime/60 " | bc`
      time_h=`echo "scale=2; $sumTime/3600 " | bc`
      echo "time cost : $sumTime s = $time_m m = $time_h h ----"

    也可不使用time_m,直接加到命令中,如下;
      echo "time cost : $sumTime s = `echo "scale=2; $sumTime/60 " | bc` m = `echo "scale=2; $sumTime/3600 " | bc` h"

3.2 指令修改系统时间

  date 查看目前系统时间;

  更新时间如下:

    date -s 20201103 

    date -s 18:32:23


4 $?返回上一条指令结果;
  function add(){
    return `expr $1 + $2`
  }
  add 23 50 #此处返回73
  if [ $? -eq 73 ]
  then
    echo "yyy $?"
  else
    echo "nnn $?"
  fi
注:结果输出为yyy 0;因为18行返回的是16行的结果;

5 获得键盘输入
read -p "are you ok?(y/n)" to_continue
if [ -z $to_continue ] #结果为空
then
   exit -1
else
  if [ $to_continue != 'y' ] #结果不等于y
  then
    echo "exit"
     exit -1
  fi
fi

6 获取文件中每一行数据,并输出
  cat 文件名 | while read line
  do
    echo $line
  done

7 远程拷贝,不需要二次输入密码,使用nohup,并且不在控制台显示信息;
a nohup sshpass -p "密码" scp -r 要拷贝的文件 目标路径 > scp_log 2>&1 &
b nohup sshpass -p "密码" scp -r 要拷贝的文件 目标路径 &

说明:
  sshapass -p 设定密码scp,无需每次输入密码;
  a比b的优势是a直接将结果输入到scp_log中,b默认输出到nohup文件,并在控制台显示;
  nohup 操作 & 意思执行操作,忽略所有挂断信号;

8 带颜色的字体输出

  字体颜色
    #30:黑 ;#31:红 ;#32:绿 ;#33:黄 ;#34:蓝色 ;#35:紫色 ;#36:深绿 ;#37:白色

  背景颜色
    #40:黑 ;#41:深红 ;#42:绿 ;#43:黄色 ;#44:蓝色 ;#45:紫色 ;#46:深绿 ;#47:白色

  echo -e "e[47;35m你好e[0m"白底紫字

9 输出结果到屏幕(控制台)同时写入文件
  假设run.sh有输出,则
    sh run.sh | sed "w log"
  结果写入log;

10 shell中引号的区别:单引号,双引号,反引号(一般是键盘ESC下边那个)

上代码:

name=tim
echo '1 $name has $800'
echo "2 $name has $800"
echo '3 $name has $800'
echo "4 $name has $800"

echo '5 ls ./'
echo "6 ls ./"
echo `ls ./`

输出:

1 $name has $800
2 tim has 00
3 $name has $800
4 tim has $800
5 ls ./
6 ls ./
文件列表
说明:
  1 单引号将所有内容当做字符,一视同仁,忽略所有的命令和特殊字符;双引号可以包含特殊字符并解析,并且需要输出特殊字符,需要加;反引号内部是一个命令,会先执行命令,然后返回结果;
  2 输出说明:
    1是单引号,所以直接输出结果;2是双引号,所以对$name进行解析;3是单引号,同1;4想输出$字符,加转义字符;5,6直接输出;7 执行ls操作,返回文件列表;

11 用户账户管理

  a 建用户:
    adduser peter //新建peter用户
    passwd peter //给peter用户设置密码,修改密码

  b 永久性删除用户账号
    userdel peter

  c 给用户改变权限

    vim /etc/passwd文件

      root:x:0:0:root:/root:/bin/bash
      peter:x:0:0::/home/peter:/bin/bash#将x后边的改成都改成0即可,权限和root就一致了,注:此操作不可取,乃是黑客常用手段;

  d 某些系统会对密码有要求,例如,密码必须有多少个数字,多少个小写字母之类的规则;

          在/etc/pam.d/system-auth中设置;
          该行内容如下:
            password    requisite     pam_pwquality.so minlen=9 try_first_pass local_users_only retry=3 authtok_type= enforce_for_root ocredit=0 lcredit=-1 ucredit=    0 dcredit=0 [badwords=first2012++]
    说明:
            minlen=8 最小密码长度为8位
               ucredit=-2 最少有2个大写字母
               lcredit=-4 最少4个小写字符
                 dcredit=-1 最少1个数字
                 ocredit=-1 最少1个符号
                 remember=5 密码最近5次的不能重用
       按需要进行设计即可;
 
  e vim /etc/login.defs,内存有登录信息,密码有效期等信息;

12 crontab

  作用:相当于时钟,可以定时完成某个操作;
  命令:
    crontab -u root -e r l 
      -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI;也可以直接打开/etc/crontab编辑;
      -r : 删除目前的时程表,注:是全部删除,慎用;
      -l : 列出目前的时程表

  内部格式:

    * * * * * 操作
    - - - - -
    | | | | |
    | | | | +----- 星期中星期几 (0 - 7) (星期天 为0)
    | | | +---------- 月份 (1 - 12)
    | | +--------------- 一个月中的第几天 (1 - 31)
    | +-------------------- 小时 (0 - 23)
    +------------------------- 分钟 (0 - 59)
    举例:
      0 */2 * * * oper 意思是每两个小时oper一下
      */2 * * * * oper 每两分钟oper一下
      50 7 * * * oper 每天7:50oper
      50 22 * * * oper 每天22:50
      0 0 1,15 * * oper 每月1号和15号
      1 * * * * oper 每小时的第一分
      00 03 * * 1-5 oper 每周一至周五3点钟,
      30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令

  注:一般root账户,可以设置user,如果是非root账户,无需在crontab -e中设置账户,默认就是当前账户;crontab失效原因一般是:路径和权限错误,特别是sh文件,里边需 加上bin/bash等信息;

  crond 是linux执行周期性任务的守护进程,命令如下:

    service crond start //启动服务

    service crond stop //关闭服务  

    service crond restart //重启服务

    service crond reload //重新载入配置

    service crond status //查看crontab服务状态:

  注:crond一般是打开的,这时候执意要你crontab -e,就会自动的更新,无需重启等操作;

14 字符串操作

  字符串拼接:

    str1=“”

    str1=$str1"xxxx "

15 查看端口是否被占用

  ss -lntpd 展示所有端口;

  ss -lntpd | grep :22 寻找端口号22被什么程序占用;

16 patch 命令

用于修补文件,包括修改,更新文件;

17 sort 对ip排序:

命令说明:

”-t” : 表示以那个字符做分割
“-k” :和-t结合使用,表示取那一段为关键字进行排序,后面跟数据,1…n,表示取第几段,也可以是范围如1,3,表示将第1段到第3段作为一个整体来排序
“-n” :以数字进行排序
“-r” :倒序

# 按升序排序
sort -t'.' -k1,1n -k2,2n -k3,3n -k4,4n ip.txt

# 按降序排序
sort -t'.' -k1,1nr -k2,2nr -k3,3nr -k4,4nr ip.txt

18 常见shell指令

    ls/ll/ls -lht
    du -sh/du -sh *
    df -h
    gdb --args
    find . -name "*.cpp"|xargs cat|wc -l 统计代码行数;
    find ./file/ -size +2M 查找file文件夹下文件尺寸大于2M的文件;

欢迎拍砖

 
原文地址:https://www.cnblogs.com/hanlaomo/p/12785694.html