zoukankan      html  css  js  c++  java
  • shell script 编程入门

    参考 《linux shell scripting cookbook》

    控制台输出

    结构化输出

    #!/bin/bash
    #Filename: printf.sh
    printf "%-5s %-10s %-4s
    " No Name Mark
    printf "%-5s %-10s %-4.2f
    " 1 Sarath 80.3456
    printf "%-5s %-10s %-4.2f
    " 2 James 90.9989
    printf "%-5s %-10s %-4.2f
    " 3 Jeff 77.564
    
    

    结果:

    No    Name       Mark
    1     Sarath     80.35
    2     James      91.00
    3     Jeff       77.56
    
    

    输出彩色文字

    echo -e "e[1;33m This is red text e[0m"
    
    

    e[1;31m 是设置颜色为红色 e[0m 是重置颜色 , 这样就不会影响后面的输出

    前景色:

    reset = 0, black = 30, red = 31,
    green = 32, yellow = 33, blue = 34, magenta = 35, cyan = 36, and white = 37

    背景色:

    reset = 0, black = 40, red = 41, green = 42, yellow = 43, blue = 44,
    magenta = 45, cyan = 46, and white=47

    字符替换

    cat c1.sh

    eqeqeqweqe eqeweqwewqe eqwewqeqweq   wqeqweqwewqe 
    eqwewqe;wqewqewqewqqdfewfr;erqrqrqwrwq;
    

    空格或者; 替换为换行符

    cat c1.sh | tr ' |;' '
    '
    
    eqeqeqweqe
    eqeweqwewqe
    eqwewqeqweq
    
    
    wqeqweqwewqe
    
    eqwewqe
    wqewqewqewqqdfewfr
    erqrqrqwrwq
    

    字符串的长度

    root@kali:~# content='hello world'
    root@kali:~# echo ${#content}
    11
    
    

    识别当前的shell

    root@kali:~# echo $SHELL
    /bin/bash
    root@kali:~# echo $0
    bash
    
    

    检测当前脚本执行用户是不是超级用户

    #!/bin/bash
    if [ $UID -ne 0 ]; then
     echo Non root user. Please run as root.
    else
     echo Root user
    fi
    
    root@kali:~/shell# ./c1.sh
    Root user
    
    kali@kali:/root/shell$ ./c1.sh 
    Non root user. Please run as root.
    

    文件操作

    0: stdin (standard input)
    1: stdout (standard output)
    2: stderr (standard error)
    

    正常的输出重定向到文件

    root@kali:~# echo aa > stdout.txt 
    root@kali:~# cat stdout.txt 
    aa
    
    

    异常的输出重定向到文件
    这种写不进去

    root@kali:~# ls + > stderr.txt 
    ls: cannot access '+': No such file or directory
    root@kali:~# cat stderr.txt 
    root@kali:~# 
    

    这样可以

    root@kali:~# ls + 2> stderr.txt 
    root@kali:~# cat stderr.txt 
    ls: cannot access '+': No such file or directory
    

    也可以

    root@kali:~# ls + &>> stderr.txt 
    root@kali:~# cat stderr.txt 
    ls: cannot access '+': No such file or directory
    ls: cannot access '+': No such file or directory
    
    

    输入重定向

    root@kali:~/shell# cat domains.txt 
    www.baidu.com
    root@kali:~/shell# exec 3< domains.txt 
    root@kali:~/shell# cat <&3 
    www.baidu.com
    root@kali:~/shell# 
    

    输出重定向

    root@kali:~/shell# exec 4> output.txt 
    root@kali:~/shell# 
    root@kali:~/shell# cat output.txt 
    root@kali:~/shell# echo haha >&4 
    root@kali:~/shell# cat output.txt 
    haha
    root@kali:~/shell# 
    
    

    数组

    root@kali:~/shell# array_var=(a b c d e f)
    root@kali:~/shell# 
    root@kali:~/shell# echo ${array_var[*]}
    a b c d e f
    root@kali:~/shell# echo ${array_var[2]}
    c
    root@kali:~/shell# echo ${#array_var[*]}
    6
    root@kali:~/shell# echo ${array_var[@]}
    a b c d e f
    root@kali:~/shell# 
    
    

    别名

    del 替换 rm 防止误操作

    alias rm='echo "rm is disabled, use del instead."'
    alias del='/bin/rm'
    

    如果要在其他窗口生效,添加到~/.bashrc

    编写高质量的 shell 脚本

    cat 输出

    root@kali:~/shell# cat in.txt 
    iinnniniii
    root@kali:~/shell# ls -l |cat - in.txt
    total 12
    -rwxr-xr-x 1 root root 110 Oct 17 11:34 c1.sh
    -rw-r--r-- 1 root root  11 Oct 17 15:59 in.txt
    -rw-r--r-- 1 root root  28 Oct 17 15:55 out.txt
    iinnniniii
    
    

    find 正则查找

    root@kali:~/shell# find . -regex ".*(.txt|.sh)$" 
    ./c1.sh
    ./in.txt
    ./out.txt
    
    

    文件的类型:

    时间类型,单位(天)
    Access time (-atime): 访问时间
    Modification time (-mtime): 修改时间(内容)
    Change time (-ctime): 修改时间(元数据,权限什么的)
    单位(分钟)
    -amin (access time)
    -mmin (modification time)
    -cmin (change time)

    查找类型为f,最近访问在7天之前的

    find . -type f -atime +7
    

    文件大小

    b: 512 byte blocks
    c: Bytes
    w: Two-byte words
    k: Kilobyte (1024 bytes)
    M: Megabyte (1024 kilobytes)
    G: Gigabyte (1024 megabytes)

    find . -type f -atime +7 -size +10M
    

    查找并删除

    find . -name out.txt -delete
    

    xargs 改变输出的排版

    root@kali:~/shell# cat in.txt 
    iinnniniii
    
    sds
    
    
    dsds
    
    
    dsd
    dsds
    
    ds
    
    
    dsd
    
    1 2
    3 4 5 678 99 0 0 -fg  gd gdfg dfh 
    
    
    dsfdsgdsg  ghgf g f
    
    
    root@kali:~/shell# cat in.txt | xargs 
    iinnniniii sds dsds dsd dsds ds dsd 1 2 3 4 5 678 99 0 0 -fg gd gdfg dfh dsfdsgdsg ghgf g f
    
    root@kali:~/shell# cat in.txt | xargs -n 3
    iinnniniii sds dsds
    dsd dsds ds
    dsd 1 2
    3 4 5
    678 99 0
    0 -fg gd
    gdfg dfh dsfdsgdsg
    ghgf g f
    
    
    root@kali:~/shell# echo "splitXsplitXsplitXsplit" | xargs -d X
    split split split split
    

    前面的输出作为后面的输入

    find . -type f -name "*.txt"  -print | xargs rm -f
    

    tr 转换

    大小写

    root@kali:~/shell# echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
    hello who is this
    
    

    替换和删除

    root@kali:~/shell# echo "HELLO WHO IS THIS 123" | tr 'A-Za-z'   ' '
                      123
    root@kali:~/shell# echo "HELLO WHO IS THIS 123" | tr -d 'A-Za-z' 
        123
    root@kali:~/shell# echo "HELLO WHO IS THIS 123" | tr -d 'A-Za-z ' 
    123
    
    

    互补性删除(下面就是删除非 0-9 的字符 )

    root@kali:~/shell# echo "HELLO WHO IS THIS 123" | tr -d -c '0-9
    '
    123
    
    

    压缩空格

    root@kali:~/shell# echo "HELLO   WHO IS  THIS   123" | tr -d ' '
    HELLOWHOISTHIS123
    root@kali:~/shell# 
    root@kali:~/shell# 
    root@kali:~/shell# echo "HELLO   WHO IS  THIS   123" | tr -s ' '
    HELLO WHO IS THIS 123
    
    

    累加

    root@kali:~/shell# cat sum.txt 
    1
    2
    3
    4
    5
    
    root@kali:~/shell# cat sum.txt | echo $[ $(tr '
    ' '+' ) 0 ]
    15
    
    

    文件加密解密

    base64 sum.txt > sum.txt.b64
    
    root@kali:~/shell# cat sum.txt.b64 
    MQoyCjMKNAo1Cgo=
    
    root@kali:~/shell# base64 -d sum.txt.b64 
    1
    2
    3
    4
    5
    
    

    文件操作

    排序

    root@kali:~/shell# cat a.txt 
    apple
    orange
    gold
    silver
    steel
    iron
    
    
    root@kali:~/shell# sort a.txt 
    apple
    gold
    iron
    orange
    silver
    steel
    

    找到公共的内容
    首先要把内容排序

    root@kali:~/shell# source a.txt -o  a.txt 
    root@kali:~/shell# sort b.txt -o  b.txt 
    
    root@kali:~/shell# comm a.txt b.txt 
    		
    apple
    	    carrot
    	    cookies
    		            gold
    iron
    		            orange
    silver
    steel
    

    只显示公共部分

    root@kali:~/shell# comm a.txt b.txt -1 -2
    
    gold
    orange
    
    

    不显示公共部分

    root@kali:~/shell# comm a.txt b.txt -3
    apple
    	    carrot
    	    cookies
    iron
    silver
    steel
    
    

    联合执行指令

    • 结束所有的Windows进程
    root@kali:~# ps -aux |grep windows |awk '{print $2}' | xargs kill -9 
    
  • 相关阅读:
    英语语法
    elk笔记2.0
    zabbix4.0-centos6 报错坑,是因为有3.0的包
    jenkins 用户授权
    python随记
    jenkins
    zabbix3.0、4.0 agent安装配置
    常用
    document.createElement()方法
    581. Shortest Unsorted Continuous Subarray(LeetCode)
  • 原文地址:https://www.cnblogs.com/lanqie/p/11661845.html
Copyright © 2011-2022 走看看