zoukankan      html  css  js  c++  java
  • Linux Shell入门

    一、shell之环境变量

    shell是一门解释性语言,与C, Java 不同,变量的使用,不需要提前进行定义。shell的变量分为:局部变量环境变量。局部变量只在shell脚本中使用,而环境变量可以在创建他们的shell及其派生出的子进程中使用。

    shell中有一些系统变量,可以直接引用,如:

    $0:  当前程序的名称

    $n: 当前程序的第n个参数

    $*: 当前程序的所有参数

    $#: 当前程序的参数个数

    $?: 命令或程序执行完后的状态,一般返回0代表执行成功

    $UID: 当前用户的ID

    $PWD: 当前所在的目录

    echo 颜色

    二、 shell 编程基本语法

    1. if else

    逻辑运算符:

    -f 判断文件是否存在:    if [ -f /path/filename ]; then

    -d 判断目录是否存在:   if [ -d /path/filename ]; then

    -eq 等于,用于整数比较

    -z 判断是否为空字符串

    1 #!/bin/bash
    2 if (($1 > $2));then
    3     echo "Greater"
    4 else
    5     echo "Smaller"
    6 fi
    简单例子
    1 #!/bin/bash
    2 DIR=/root/DTV/TestDirectory 
    3 if [ -d $DIR ]; then
    4     echo -e "33[32m This $DIR exist33[0m"   #####033[32mtest033[0m   代表给test加颜色
    5 else
    6     echo -e "33[32m---------------33[1m"    #####033[32m    033[0m   代表从本行开始下面全部加颜色                         
    7     echo "$DIR will be created"
    8     mkdir -p $DIR
    9 fi
    判断目录是否存在,不存在则创建目录
     1 #!/bin/bash                                          
     2 BACKUP=/root/backup/`date +%Y-%m-%d`   ##将date返回的日期格式化成year-month-day 
     3 #第一步,验证用户是否是root
     4 if [[ $UID -eq 0 ]]; then
     5     echo "yes, it's root"
     6 else
     7     echo "please use root to login"
     8 fi
     9 #第二步,检查当日目录是否存在,否则创建 
    10 if [ ! -d $BACKUP ]; then
    11     echo -e "33[32m backup directory of this day not exist,will creat33[0m"
    12     mkdir -p $BACKUP
    13 else
    14     echo "backup directroy is existed"
    15 fi
    16 cp /var/log/auth.log $BACKUP/auth.log.`date +%H-%M-%S`
    17 要求: 每日以root用户执行备份/var/log/auth.log到/root/backup/下面,并命名带上时间戳
    备份文件,每日以root用户执行备份/var/log/auth.log到/root/backup/下面,并命名带上时间戳
     1 #!/bin/bash
     2 PACKAGENAME=httpd-2.4.46.tar.gz
     3 PARENTSDIR=/tmp
     4 SONDIR=${PACKAGENAME:0:12}
     5 DIR=$PARENTSDIR/$SONDIR
     6 function checkDir()
     7 {
     8     if [ ! -d $PARENTSDIR/$1 ]; then
     9         echo "33[32m Dir isn't exist,will create33[0m"
    10         mkdir -p $PARENTSDIR/$SONDIR
    11     else
    12         echo "33[32m Dir is existed33[0m"
    13     fi
    14 }
    15 
    16 checkDir $SONDIR
    17 
    18 wget http://mirrors.cnnic.cn/apache/httpd/$PACKAGENAME -P $DIR && cd $DIR && tar -xvf $PACKAGENAME && cd ${PACKAGENAME:0:12}&& ./configure --prefix=$DIR/
    19 
    20 if [ $? -eq 0 ]; then
    21     make && make install
    22     echo "33[32m Successfully 33[0m"
    23 else
    24     echo "33[32m Failed 33[0m"
    25 fi
    从网上下载软件,并安装

    2. 字符串操作

    1 root@test:~# a=a1b2c3
    2 root@test:~# echo ${a:0:4}        ######0表示从左边第一个字符开始,4代表字符的总个数
    3 a1b2
    字符串截取

    3. 循环

      for 循环

    1 #!/bin/bash
    2 j=0
    3 for((i=1;i<100;i++))
    4 do
    5     j=`expr $j + $i`
    6 done
    7 echo $j
    求和
     1 #!/bin/bash
     2 FILES=$*
     3 if [ -z $* ]; then
     4     echo -e "33[32musage: {$0 Director|filesname}33[0m"
     5     exit
     6 fi 
     7 for i in `echo 192.168.0.2 127.0.0.1 10.0.0.1`
     8 do
     9     scp -p $FILES $i:/tmp/
    10 done
    11 root@test:~/shell_program# bash test.sh
    12 usage: {test.sh Director|filesname}
    13 root@test:~/shell_program# bash test.sh 1 2 3
    14 test.sh: line 4: [: too many arguments
    15 1                                                                                             100%    0     0.0KB/s   00:00
    16 2                                                                                             100%    0     0.0KB/s   00:00
    17 3                                                                                             100%    0     0.0KB/s   00:00
    18 1                                                                                             100%    0     0.0KB/s   00:00
    19 2                                                                                             100%    0     0.0KB/s   00:00
    20 3                                                                                             100%    0     0.0KB/s   00:00
    21 1                                                                                             100%    0     0.0KB/s   00:00
    22 2                                                                                             100%    0     0.0KB/s   00:00
    23 3                                                                                             100%    0     0.0KB/s   00:00
    批量向远程机拷贝文件

      while循环

    1 #!/bin/bash                                                                                                                     
    2 while read line
    3 do
    4     echo $line
    5 done < /var/log/auth.log
    读取文件

      case 循环

     1 #!/bin/bash
     2 
     3 case $1 in
     4         apache)
     5         echo -e "33[32m Installing apache server33[0m"
     6         apt-get -y install apache2
     7 #       tar -xvf apache.tar.gz;cd httpd; ./configure &&make &&make install
     8         ;;  
     9 
    10         mysql)
    11         echo -e "33[32m Installing mysql server33[0m"
    12         apt-get -y install mysql-server 
    13         ;;  
    14 
    15         php)
    16 #       apt-get install ....
    17         ;;  
    18 
    19         *)  
    20         echo -e "33[32m Usage {$0 apache|mysql|php}33[0m"
    21         ;;  
    22 esac
    View Code

    4. select 选择

     1 root@test:~/shell_program# select OS in "Centos" "Ubuntu" "Redhat";do echo "Selected System is $OS";done;
     2 1) Centos
     3 2) Ubuntu
     4 3) Redhat
     5 #? 1
     6 Selected System is Centos
     7 #? 3
     8 Selected System is Redhat
     9 #? 2
    10 Selected System is Ubuntu
    11 #? 
    View Code
     1 #!/bin/bash                                                                                                                     
     2 select SW in "apache安装" "mysql安装" "php安装"
     3 do
     4     case $SW in
     5         apache安装) 
     6         echo -e "33[32m Installing apache server33[0m"
     7         apt-get -y install apache2
     8 #       tar -xvf apache.tar.gz;cd httpd; ./configure &&make &&make install
     9         ;;  
    10 
    11         mysql安装) 
    12         echo -e "33[32m Installing mysql server33[0m"
    13         apt-get -y install mysql-server 
    14         ;;  
    15 
    16         php安装) 
    17         echo -e "33[32m Installing php server33[0m"
    18 #       apt-get install ....
    19         ;;  
    20 
    21         *)  
    22         echo -e "33[32m Please input {1|2|3}33[0m"
    23         ;;  
    24     esac
    25 done
    用了select的case语句

    5. shell之数组

    定义:ARRAY=(test1 test2 test3)

    引用: ${ARRAY[0]} 

    数组所有参数: ${ARRAY[@]}, 将显示所有内容,test1,test2,test3

    数组参数个数: ${#ARRAY[@]}, 将显示3

    替换数组内某个参数后返回新数组:${ARRAY[@]/test1/test4}

    直接删除数组内某个参数:unset ARRAY[2]; 直接在原数删除test3

    三、Linux之sed

    1. 文本替换

    1. 预修改,文件内容先不动
    sed 's/oldString/newString/g' test.txt
    2. 直接在文件里修改 sed
    -i 's/oldString/newString/g' test.txt

    2. 每一行的行首、行尾添加

    1. 在每一行的行首添加"testeString "   ^代表行首
    sed 's/^/&testString /g' test.log   
    2. 在每一行的行尾添加" testString"    $代表行尾
    sed 's/$/& testString /g' test.log  
    3. 在第2行的行首添加“testString ”    2s代表第2行
    sed '2s/^/&testString /g' test.log

    3.  在特定字符串前、后添加

    1. 在特定字符串testString前添加 “######”
    sed '/testString/#######&' test.log    
    2. 在特定字符串testString前一行添加 “######”
    sed '/testString/i #######' test.log    
    3. 在特定字符串testString后添加 “######”
    sed '/testString/&#######' test.log    
    4. 在特定字符串testString后一行添加 “######”
    sed '/testString/a #######' test.log

    4. 打印

    1. 打印包含testString的行
    sed -n '/testString/p' test.log  
    2. 打印第1行
    sed -n '1p' test.log
    3. 打印1-5行
    sed -n '1,5p' test.log
    4. 打印第1行和第5行
    sed -n '1p;5p' test.log
    5. 打印第1行和最后1行
    sed -n '1p;$p' test.log

    四、Linux之grep

    注: grep -E= egrep

    正则:

    1. 打印以testString开始的行, ^代表开始
    grep "^testString" test.log 
    2. 打印以testString结束的行, $代表结尾
    grep "testString$" test.log
    3. 打印包含数字0-5的行
    grep "[0-5]" test.log  4. 打印包含字母a-f的行
    grep "[a-f]" test.log   
    5. 打印以字母a-f开头的行
    grep "^[a-f]" test.log 

    正则表达举例:

    正则匹配ip
    root@test:~/shell_program# cat test.log 
    10.0.192.10
    a.0.182.0
    10.0.192.100
    123.192.100.1234
    10.0.199.
    12123.192.100.1234
    
    正确答案:
    root@test:~/shell_program# cat test.log | grep -E "^(([0-9]{1,3}.){3}[0-9]{1,3})$" 
    10.0.192.10
    10.0.192.100

    解释:
     1 root@test:~# cat test.log | grep -E "[0-9]"    ##包含0-9
     2 10.0.192.10
     3 a.0.182.0
     4 10.0.192.100
     5 123.192.100.1234
     6 10.0.199.
     7 12123.192.100.1234
     8 root@test:~# cat test.log | grep -E "[0-9]{1,3}"    ##包含1-3个0-9,比如1  10  192
     9 10.0.192.10
    10 a.0.182.0
    11 10.0.192.100
    12 123.192.100.1234
    13 10.0.199.
    14 12123.192.100.1234
    15 root@test:~# cat test.log | grep -E "[0-9]{1,3}."    ##包含1-3个0-9后,接着是一个.   注:正则里面.的表达:   .
    16 10.0.192.10
    17 a.0.182.0
    18 10.0.192.100
    19 123.192.100.1234
    20 10.0.199.
    21 12123.192.100.1234
    22 root@test:~# cat test.log | grep -E "([0-9]{1,3}.){3}"    ##对于1. 或者10. 或者 192.  这样的匹配需要3次
    23 10.0.192.10
    24 10.0.192.100
    25 123.192.100.1234
    26 10.0.199.
    27 12123.192.100.1234
    28 root@test:~# cat test.log | grep -E "([0-9]{1,3}.){3}[0-9]{1,3}"    ##在10.0.192之后,还需要有1-3个0-9
    29 10.0.192.10
    30 10.0.192.100
    31 123.192.100.1234
    32 12123.192.100.1234
    33 root@test:~# cat test.log | grep -E "^(([0-9]{1,3}.){3}[0-9]{1,3})$"    ##以上一步过滤出的表达, 精确匹配,以此种模式开始,并结束。
    34 10.0.192.10
    35 10.0.192.100
    View Code

    五、Linux之awk

    1. 指定分隔符为  “.”
    awk -F. '{print $2}'
    2. awk 倒数第一列
    awk '{print $(NF-1)}'
    3. awk分割后,同时print附加其他信息
    awk '{print "test" $2}'
    4. 如果第2列数字大于14,就打印第1,2,最后1列
    awk '$2>=14 {print $1 $2 $NF}'

    六、Linux之find

    举例:  find /var/log/ -maxdepth 2 -type f -size +100M  -exec cp {} /tmp ;

    找到/var/log及其下一级目录下,大于100M的文件,拷贝到/tmp下

    只查找当前目录        find . -maxdepth 1
    最多查找到下一级目录   find . -maxdepth 2
    查找文件            find . -type f 
    查找目录            find . -type d
    30天之前的          find . -mtime +30
    2天以内的            find . -mtime -2
    大于200M的          find . -size +200M
    找到*.log后删除       find . -type f -name *.log -exec rm {} ;
                        find . -type f -name *.log |xargs rm {} ; 

     七、脚本中有错误行,跳出

    set -eu

    end

  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/reatual/p/14219009.html
Copyright © 2011-2022 走看看