echo -e "\003[背景颜色;文字颜色;显示方式m字符串\003[0m"
echo -e "\033[40;31;5mSomething string\033[0m"

覆盖和追加模式不要应用于系统文件
cat >> tmp.txt << EOF
> xxxx
> xxx
> EOF

cp /etc/passwd{,.bak}

一、小知识

1.1. 测试脚本及echo
shell 输出带颜色内容
shell教程
一篇教会你写90%的shell脚本

  • 简单示例1

    #!/bin/bash
    # -----------------------------------
    # Filename: hello.sh
    # Version:   1.1
    # Date: 2017/06/01
    # Author: wang
    # Email: wang@gmail.com
    # Website: www.magedu.com
    # Description: This is test example
    # Copyright: anyu967
    # License: GPL
    # -----------------------------------
    
    # -e,转义;    
    # -n,不换行;
    # 变量名前不加$,不能有空格
    echo "Hello World"
    your_name="anyue967"
    
    bash -x file.sh      # 单步检测脚本
    bash -n file.sh      # 检查语法错误
    
  • 简单示例2

    # 定义: arrName=(value1 value2 ... n)
    array_name=(value0 value1 value2)
    array_name[0]=value0	  # 引用数组
    echo "数组元素: ${array_name[@]}"
    echo "数组元素: ${array_name[*]}"
    echo "数组元素个数为: ${#array_name[*]}"
    
    # read
    #!/bin/bash
    read -p "input a val:" a
    read -p "input a val:" b
    c=$(($a+$b))         # $((exp))
    c=$[$a+$b]           # $[exp]
    let c=$a+$b          # let exp
    c=expr $a + $b       # expr 算数表达式
    echo "result=${r}"
    
    var="http://www.runoob.com/linux/linux-shell-variable.html"
    s1=${var#*/}   # /www.runoob.com/linux/linux-shell-variable.html    表示从左边删除到第一个指定的字符
    s2=${var##*/}  # linux-shell-variable.html                          表示从左边删除到最后一个指定的字符
    s3=${var%%.*}  # http://www   %表示从右边删除到第一个指定的字符; %%表示从右边删除到最后一个指定的字符
    

1.2. 变量

符号 说明
(var=value) 单独使用()会产生一个子shell
`cmd` 或 $(cmd) 子shell中执行
(( expression )) 算数:整数扩展、运算符、重定义变量值、算数运算比较
[[ expression ]] 支持数学运算,支持逻辑测试:&& ||
${var} 引用变量(引用变量时, 变量名前要加$, 建议变量名外加{}, 一种习惯)
$[ operation ] 支持数学运算 $[ $var1 * ($var2 - $var3) ]
$?exit code 退出状态,惯例成功状态码为0,异常结束是一个正整数
test condition 关键字 test condition,文件 整数 字符串
[ expression ] 支持文件、整数、字符串比较:== !=;逻辑测试使用:-a -o !
$0 $# $* $@ $$ $? 文件名参数个数"$1 $2 ... $n""$1" "$2" "$3"当前shell的PID;上个命令的退出状态,或函数的返回值
myarry(var1 var2 var3 var4) 数组:${myarry[i]}
command shell的内建命令
shift 位置参数可以用shift命令左移,不带参数相当于shift 1

二、流程控制

选择

  • 示例1

    #!/bin/bash
    a=10
    b=20
    
    if [[ $a -lt 100 && $b -gt 100 ]]; then
      echo "返回 true"
    else
      echo "返回 false"
    fi
    if [[ $a -lt 100 || $b -gt 100 ]]; then
      echo "返回 true"
    else
      echo "返回 false"
    fi
    
    #!/bin/bash
    ratio = $(df -h |grep /dev/sda3 |awk '{print $5}' |cut -d "%" -f1)
    if [ "$ratio" -ge 80 ]; then
      echo "钉钉报警!" 
    fi
    
  • 示例2

    #!/bin/bash
    ntpdate asia.pool.ntp.org &>/dev/null
    date = $(date +%Y%m%d)
    size = $(du -sh /var/lib/mysql)
    if [ -d /tmp/dbbak ]; then
      echo "Date: $date!" >/tmp/dbbak/dbinfo.txt
      echo "Date: $size!" >>/tmp/dbbak/dbinfo.txt
      cd /tmp/dbbak
      tar -czf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
      rm -rf /tmp/dbbak/dbinfo.txt
    else
      mkdir /tmp/dbbak
      echo "Date: $date!" >/tmp/dbbak/dbinfo.txt
      echo "Date: $size!" >>/tmp/dbbak/dbinfo.txt
    fi
    
    #!/bin/bash
    port = `nmap -sT 192.168.137.129 |grep tcp |grep http |awk '{print $2}'`
    if [ "$port" == "open"]; then
      echo "$(date) httpd is ok!" >>/tmp/autostart-acc.log
      else
        /etc/init.d/httpd start &>/dev/null
        echo "$(date) restart ok!" >>/tmp/autostart-acc.log
    fi
    

循环

  • for-do-done

    # for-do-done
    #!/bin/bash
    user=$(cat /etc/passwd |grep "/bin/bash" |grep -v "root" |cut -d ":" -f1)
    for i in $user
    do 
      userdel -r $i
    done
    
    
  • while-do-done

    # while-do-done
    #!/bin/bash
    while [ $i -le 100 ]
    do
      s = $(( $s + $i ))
      i = $(( $i + $1 ))
    done
    echo "The sum is: $s"
    
  • case-in-esac

    #!/bin/bash
    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
    esac
    

函数

  • 示例
    funWithReturn(){
       echo "这个函数会对输入的两个数字进行相加运算..."
       echo "输入第一个数字: "
       read aNum
       echo "输入第二个数字: "
       read anotherNum
       echo "两个数字分别为 $aNum 和 $anotherNum !"
       return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo "输入的两个数字之和为 $? !"
    

三、例子

执行方式:

<<'comment'
....
comment

:'
comment1
comment2
'

# 内建命令不需要产生子进程 内建命令对当前shell生效
bash demo.sh        # 在子进程中执行命令,不对当前产生影响
./demo.sh           # 同上,但需要执行权限

source demo.sh      # 不产生子进程,执行完成对当前产生影响
. demo.sh           # 同上

# /etc/profile ==》 ~/.bash_profile ==> ~/.bashrc ==> /etc/bashrc

# /home/xy/bak/1.sh 
# /home/xy    source ./bak/1.sh
echo "${BASH_SOURCE[0]}"                   # ./bak/1.sh 取当前执行的 shell 文件所在的路径及文件名
echo "${BASH_SOURCE}"                      # ./bak/1.sh
echo "$(dirname "${BASH_SOURCE[0]}")"      # ./bak
DIR="$(cd "$(dirname ${BASH_SOURCE[0]})" && pwd)"   # /home/xy/bak
echo $DIR
posted on 2023-04-22 18:20  anyu967  阅读(15)  评论(0)    收藏  举报