精华内容
下载资源
问答
  • Linux shell

    2017-08-28 20:16:36
    Linux shell的概念:从程序员的角度来看, Shell本身是一种用C语言编写的程序, 从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户可以输入命令执行, 又可以利用 Shell脚本编程,完成更加复杂的操作 ...
    Linux shell的概念:从程序员的角度来看, Shell本身是一种用C语言编写的程序,
    从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户可以输入命令执行,
    又可以利用 Shell脚本编程,完成更加复杂的操作






    1. 查看目前使用的是那种shell


    用:env (该命令可以显示当前操作系统的环境变量)


    2.查看linux系统中有哪几种shell


    ls /bin/*sh (*sh代表以sh结尾的shell)


    3.修改shell


    4.shell命令补全功能:
    如:直接输入"mk"  再按两下tab键  就会出现开头两个字母为"mk"的命令




    输入:chsh -s 输入新的shell


    如:chsh -s /bin/csh等等


    5.查看历史命令:
    history
    具体查看几条:
    如:history 5(就是显示最近5条命令)追踪路由


    如:第5条是 pwd
    那么!5这条命令表示执行pwd命令


    小命令:(一些tcp/ip的知识 这些指令都是在windows下,linux下的ping指令可以网上搜索)
    追踪路由
    tracert  目标ip/域名


    测试两个ip是否畅通
    ping 目标ip


    在windows下查看ip情况的命令是
    ipconfig


    在linux/unix下查看ip情况的命令是
    ifconfig


    测试自己的网络ip:
    ping 127.0.0.1
    展开全文
  • Linux Shell编程参考大全

    万次阅读 多人点赞 2016-12-29 23:43:12
    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用。

      本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用。
      本文主要分为以下几个部分:

    一、Shell中的变量

      任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识。

    0、默认变量

      首先介绍几个shell中的默认变量。
      

    变量含义
    $0当前脚本名称
    $1脚本接收的第一个参数
    $2脚本接收的第二个参数
    $#脚本接收的所有参数个数
    $@脚本接收的所有参数
    $*脚本接收的所有参数
    $?前一行命令的执行状态

      示例如下:

    hadoop@client:~$ bash default_var.sh a b c d
    $0 ==>  default_var.sh
    $1 ==>  a
    $2 ==>  b
    $# ==>  4
    $@ ==>  a b c d
    $* ==>  a b c d
    $? ==>  0

    1、变量定义及赋值

    hadoop@client:~$ v1=hello
    hadoop@client:~$ echo $v1
    hello

      但是要注意的是,赋值处必须为一个整体,不能有空格。

    hadoop@client:~$ v2=hello world
    No command 'world' found, did you mean:
     Command 'tworld' from package 'tworld' (universe)
    world: command not found

      想要包含空格,需要用单引号或双引号包围,如

    hadoop@client:~$ v2="hello world"
    hadoop@client:~$ echo $v2
    hello world
    hadoop@client:~$ v3='hello world'
    hadoop@client:~$ echo $v3
    hello world

    2、单引号(')和双引号(")的区别

      上面的示例中看到hello world使用单引号或双引号包围再赋值给变量时,两者效果相同,但是其中的区别在哪里?

    hadoop@client:~$ a="hello"
    hadoop@client:~$ b="$a world"
    hadoop@client:~$ echo $b
    hello world
    hadoop@client:~$ c='$a world'
    hadoop@client:~$ echo $c
    $a world

      可以看到,单引号中的$a保持原样输出。而双引号中的$a会替换成其变量值。

    3、`符号

      这个符号在数字键1的左侧,与单引号很类似。但是其功能与单引号双引号都有不同。在该符号中的命令会被执行。

    hadoop@client:~$ d=`date`
    hadoop@client:~$ echo $d
    Wed Dec 28 06:31:13 PST 2016

      如果不想使用这个符号,可以用$()替换

    hadoop@client:~$ e=$(date)
    hadoop@client:~$ echo $e
    Wed Dec 28 06:31:48 PST 2016

    4、命令行交互read

      有时候我们希望在脚本运行时能根据用户的输入决定脚本后续执行逻辑,比如在安装插件的时候经常会让用户选择输入[N/Y]的时候。
      比如有一个脚本script_test.sh

    read -p "Please input [Y/N]: " yn
    
    if [ "$yn" == "N" -o "$yn" == "n" ]; then
      echo "NO"
    elif [ "$yn" == "Y" -o "$yn" == "y" ]; then
      echo "YES"
    fi

      在运行时根据用户的输入决定if分支的走向。运行结果如下

    hadoop@client:~$ sh script_test.sh
    Please input [Y/N]: y
    YES

      read命令的使用形式为

    read [-pt] variable
      参数p:后面可以接提示符
      参数t:后面可以接秒数

      例如,

    read -p "please input your name" -t 5 name

      表示将输入内容赋值给变量name,用户有5秒钟的输入时间。

    5、定义变量类型declare

      默认情况下,变量的赋值内容都是字符类型的。例如下面的代码,我们期望的是输出一个求和值,但是输出的是一个求和表达式。

    hadoop@client:~$ sum=100+300+500
    hadoop@client:~$ echo $sum
    100+300+500

      如果想要输出求和后的值,可以使用declare命令。

    hadoop@client:~$ declare -i sum=100+300+500
    hadoop@client:~$ echo $sum
    900

      declare命令的使用形式如下:

    declare [-aixr] variable
      参数a:将variable定义为数组
      参数i:将variable定义为整型(integer)
      参数x:将variable设置成环境变量,类似于export的作用
      参数r:variable为readonly类型,值不能被更改

    二、Shell中的集合类型

    1、数组(array)

    (1)数组定义和赋值

      数组中的元素用括号包围,各元素之间用空格隔开。例如

    hadoop@client:~$ array_name=(v0 v1 v2 v3)

     
      可以重新设置指定元素的内容,如下所示

    hadoop@client:~$ array_name[2]=v22
    hadoop@client:~$ echo ${array_name[2]}
    v22

      
    (2)数组元素访问

      输出该数组中所有元素:

    hadoop@client:~$ echo ${array_name[*]}
    v0 v1 v22 v3
    hadoop@client:~$ echo ${array_name[@]}
    v0 v1 v22 v3

      数组元素下标从0开始,想要访问指定位置的元素,使用[]指定下标值,如下所示

    hadoop@client:~$ echo ${array_name[0]}
    v0
    hadoop@client:~$ echo ${array_name[1]}
    v1
    hadoop@client:~$ echo ${array_name[3]}
    v3
    hadoop@client:~$ echo ${array_name[2]}
    v2
    hadoop@client:~$ echo ${array_name[4]}
    

     
    (3)获取数组长度

      获取数组长度使用如下命令

    hadoop@client:~$ echo ${#array_name[@]}
    4
    hadoop@client:~$ echo ${#array_name[*]}
    4

      获取数组中单个元素的长度使用如下命令

    hadoop@client:~$ echo ${#array_name[2]}
    3

    2、map

      map类型中存储的都是键值对。
      在Shell中定义map变量如下所示:

    declare -A m=(["a"]="1" ["b"]="2")

      输出所有的key

    hadoop@client:~$ echo ${!m[@]}
    a b

      输出所有的value

    hadoop@client:~$ echo ${m[@]}
    1 2

      输出指定key对应的value

    hadoop@client:~$ echo ${m["a"]}
    1
    hadoop@client:~$ echo ${m["c"]}
    

      添加元素

    hadoop@client:~$ m["c"]="3"
    hadoop@client:~$ echo ${m["c"]}
    3

      map中键值对的个数

    hadoop@client:~$ echo ${#m[@]}
    3

    三、Shell中的字符操作

      在任何语言中对字符串的操作都是非常频繁的。字符串的操作主要包括,字符串截取,字符串替换等。
      接下来的示例中,都以字符串http://blog.csdn.net/dabokele作为初始字符串。

    str="http://blog.csdn.net/dabokele"

    1、字符串删除

      删除前面的http://

    hadoop@client:~$ echo ${str#http://}
    blog.csdn.net/dabokele

      删除后面的dabokele

    hadoop@client:~$ echo ${str%/dabokele}
    http://blog.csdn.net

      #从前往后截取,%从后往前截取。

      示例中表示将符合的最短数据删除,如果使用两个#,或者两个%,则表示将符合的最长数据删除。

      如下所示,匹配最短时,会将https://csdn.ne删除,匹配最长时,会将全部字符删除。

    hadoop@client:~$ echo ${str#http://b*e}
    t/dabokele
    hadoop@client:~$ echo ${str##http://b*e}
    

    2、字符串截取

      可以从字符串的指定位置开始截取,同时可以指定截取的位数,如下所示:

    hadoop@client:~$ echo ${str:2}     // 从第二位开始截取到最末尾,第一个字符下标为0
    tp://blog.csdn.net/dabokele
    hadoop@client:~$ echo ${str:2:3}     // 从第二位开始顺序截取三个字符
    tp:
    hadoop@client:~$ echo ${str:(-6):3}     // 从倒数第六位开始,截取三个字符,最后一个字符下标为-1
    bok

    3、字符串替换

      将http替换成HTTP

    hadoop@client:~$ echo ${str/http/HTTP}
    HTTP://blog.csdn.net/dabokele
    • 使用一个斜杠(/)表示只替换第一个遇到的字符。
    • 使用两个斜杠(//)则表示替换全部符合的字符。
    • 使用#匹配以指定字符开头的字符串。
    • 使用%匹配以指定字符开头的字符串。
    hadoop@client:~$ echo ${str/e/E}
    http://blog.csdn.nEt/dabokele
    hadoop@client:~$ echo ${str//e/E}
    http://blog.csdn.nEt/dabokElE
    hadoop@client:~$ echo ${str/#h/H}     // 匹配开头的那个h
    Http://blog.csdn.net/dabokele
    hadoop@client:~$ echo ${str/e/E}
    http://blog.csdn.nEt/dabokele
    hadoop@client:~$ echo ${str/%e/E}     // 匹配最后那个E,前一个匹配中匹配的是net中的e
    http://blog.csdn.net/dabokelE

    4、字符串默认值

      假设以下这个场景,如果变量name没有赋过值,则给一个默认值default,否则使用指定的值。

    hadoop@client:~$ echo $name
    
    hadoop@client:~$ echo ${name-default}
    default
    hadoop@client:~$ name="ckm"
    hadoop@client:~$ echo ${name-default}
    ckm

      但是,如果已经将变量name设置成“”,则结果如下:

    hadoop@client:~$ name=""
    hadoop@client:~$ echo ${name-default}

      如果变量内容为“”或者变量未初始化则给默认值,可以在-前加个冒号,使用:-

    hadoop@client:~$ name=""
    hadoop@client:~$ echo ${name-default}
    
    hadoop@client:~$ echo ${name:-default}
    default

    5、字符串拼接

      字符串拼接如下所示

    hadoop@client:~$ echo "aaa""bbb"
    aaabbb
    hadoop@client:~$ echo "aaa"$str
    aaahttp://blog.csdn.net/dabokele
    hadoop@client:~$ echo "aaa$str"
    aaahttp://blog.csdn.net/dabokele

    6、字符串长度

      求字符串长度用#操作,如下所示

    hadoop@client:~$ echo ${#str}
    29

    7、字符串split成数组

      在以空格为分隔符分割字符串成数组时操作最简单。

    hadoop@client:~$ s="a b c d e"
    hadoop@client:~$ a=($s)
    hadoop@client:~$ echo ${a[*]}
    a b c d e
    hadoop@client:~$ echo ${a[2]}
    c

      所以,如果需要指定特定字符进行分割,而原字符串中又没有空格时,可以先将特定字符替换成空格,然后按照上述进行分割,如下所示,

    hadoop@client:~$ s="a,b,c,d,e"
    hadoop@client:~$ a=(${s//,/ })
    hadoop@client:~$ echo ${a[*]}
    a b c d e
    hadoop@client:~$ echo ${a[2]}
    c

      如果字符串中本身已有空格,并且期望的分隔符不是空格,按如下方法进行分割。首先将IFS变量替换成指定字符,分割后再将IFS更新为原字符。

    hadoop@client:~$ s="a b,c,d,e"
    hadoop@client:~$ old_ifs="$IFS"
    hadoop@client:~$ s="a b,c,d,e"
    hadoop@client:~$ OLD_IFS="$IFS"
    hadoop@client:~$ IFS=","
    hadoop@client:~$ a=($s)
    hadoop@client:~$ IFS="$OLD_IFS"
    hadoop@client:~$ echo ${a[*]}
    a b c d e
    hadoop@client:~$ echo ${a[0]}
    a b
    hadoop@client:~$ echo ${#a[*]}
    4

    8、字符串包含

      有时候需要判断字符串str1中是否包含字符串str2,使用=~操作符。
      

    str1="hello"
    str2="ell"
    if [[ $str1 =~ $str2 ]];then
     echo "$str1 contains $str2"
    fi

      查看运行结果
      

    hadoop@client~$ sh script_test.sh 
    hello contains ell

    四、Shell中的控制结构

    0、循环接收脚本参数shift

      测试脚本如下:

    echo '原始参数: ' $*
    shift
    echo 'shift后参数: ' $*
    shift 2
    echo 'shift 2后参数: ' $*

      查看脚本运行结果

    hadoop@client:~$ sh script_test.sh a b c d e f g
    原始参数:  a b c d e f g
    shift后参数:  b c d e f g     // 移除第一个参数a
    shift 2后参数:  d e f g     // 继续移除前两个参数b和c

    1、条件表达式

    (1)if … then
      判断表达式是经常用到的。整体结构如下所示,其中iffi是必须的,中间的elifelse是可选的。

    if [ 判断条件1 ]; then
      执行内容1
    elif [ 判断条件2 ]; then
      执行内容2
    else
      执行内容3
    fi

      
    a)算术运算符

      算术运算符的使用格式如下

    a=10
    b=20
    val=expr $a + $b

      常用的算术运算符包括

    运算符说明举例
    +加法expr $a + $b 结果为 30。
    -减法expr $a - $b 结果为 10。
    *乘法expr $a \* $b 结果为 200。
    /除法expr $b / $a 结果为 2。
    %取余expr $b % $a 结果为 0。
    =赋值a=$b将把变量 b 的值赋给 a。
    ==相等用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
    !=不相等用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

      
    b)关系运算符
      关系运算符的使用格式如下

    a=10
    b=20
    $a -eq $b

      常用的关系运算符包括

    运算符说明举例
    -eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 true。
    -ne检测两个数是否相等,不相等返回 true。[ $a -ne $b ] 返回 true。
    -gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
    -lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
    -ge检测左边的数是否大等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
    -le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

      
    c)布尔运算符
      常用的布尔运算符如下

    运算符说明举例
    !非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
    -o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
    -a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。

      
    d)字符串运算符
      常用的字符串运算符如下

    运算符说明举例
    =检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
    !=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
    -z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
    -n检测字符串长度是否为0,不为0返回 true。[ -n $a ] 返回 true。
    str检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

      
    e)文件测试运算符
      常用的文件测试运算符如下

    运算符说明举例
    -b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
    -c file检测文件是否是字符设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
    -d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
    -f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
    -g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
    -k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
    -p file检测文件是否是具名管道,如果是,则返回 true。[ -p $file ] 返回 false。
    -u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
    -r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
    -w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
    -x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
    -s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
    -e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。

      
    (2)case … esac
      case表达式的使用格式如下

    case $变量 in
      "内容1")
          程序1
      ;;
      "内容2")
          程序2
      ;;
      *)     #匹配其他所有情况
          程序3
      ;;
    esac

      看一个示例,如果第一个参数为hello,则打印hello world。如果第一个参数是bye,则打印bye bye。如果是另外的情况,则输出该参数。

    case $$1 in
      "hello")
          echo "hello world"
      ;;
      "bye")
          echo "bye bye"
      ;;
      "*")
          echo $1
      ;;
    esac

      运行结果

    hadoop@client:~$ sh script_test.sh hello
    hello world
    hadoop@client:~$ sh script_test.sh bye
    bye bye
    hadoop@client:~$ sh script_test.sh hehe
    hehe

    2、循环表达式

    (1)while do done, untile do done
      while循环的格式如下

    while [ condition ]
    do
      程序
    done

      与while循环相反的是until循环。

    while [ condition ]
    do
      程序
    done

      在while循环中,当条件满足使,就执行其中的程序。而until循环中,当条件不成立时就终止循环。

      下面举例用两种循环来实现当输入为yes时跳出循环。
      
    a) while循环示例如下

    while [ "$yn" != "yes" ]
    do
      read -p "Please input yes to stop: " yn
    done
    
    echo "Stop!"

      运行结果

    hadoop@client:~$ sh script_test.sh
    Please input yes to stop: no
    Please input yes to stop: no
    Please input yes to stop: yes
    Stop!

      
    b) until循环示例如下

    until [ "$yn" == "yes" ]
    do
      read -p "Please input yes to stop: " yn
    done
    
    echo "Stop!"

      运行结果如下

    hadoop@client:~$ sh script_test.sh
    Please input yes to stop: no
    Please input yes to stop: yes
    Stop!

      
    (2)for … do … done
      for循环的格式如下

    for var in con1 con2 con3 ...
    do
      程序
    done

      下面这个示例循环打印输入参数列表

    for arg in $*
    do
      echo $arg
    done

      运行结果如下

    hadoop@client:~$ sh script_test.sh a b c d e
    a
    b
    c
    d
    e

      
    (3)for … do … done的另一种形式
      for循环的另一种个数如下

    for ((初始值; 目标值; 步长))
    do
      程序
    done

      循环输出110中的奇数

    for ((i=1; i<=10; i=i+2))
    do
      echo $i
    done

      运行结果如下

    hadoop@client:~$ bash script_test.sh
    1
    3
    5
    7
    9

    五、Shell中的函数

      在Shell中也可以像其他编程语言那样,将代码块封装成函数。Shell中的函数,需要注意以下两点:
      

    1、函数定义

      由于Shell是从上往下执行的,所以在定义函数之前就调用该函数的话,会提示command not found,例如
      

    echo "Before :" `printFunc`
    
    function printFunc() {
      echo "print function !"
    }
    
    echo "After :" `printFunc`

      运行结果如下,前一个函数调用处提示command not found  

    hadoop@client:~$ sh script_test.sh 
    2_script_test.sh: line 3: printFunc: command not found
    Before :
    After : print function !

    2、函数参数与shell参数

      在Shell中定义的函数,是可以传递和接收参数的。在子函数中,$1表示接收的第一个参数…,这里需要注意与shell参数的区别。
      但是测试后发现$0表示的仍然是shell名称。如果想要显示当前函数名,可以使用$FUNCNAME参数,如下所示,  

    function printStr() {
      echo "printStr function print: $FUNCNAME"
      echo "printStr function print: $*"
    }
    
    echo "main print: $0"
    echo "main print: $*"
    
    printStr f1 f2 f3

      运行结果如下,

    [hadoop@client ~]$ sh script_test.sh m1 m2 m3
    shell name : script_test.sh
    shell params : m1 m2 m3
    function name : printStr
    function params : f1 f2 f3

    六、vi快捷操作

      下面操作中出现大写字母,比如G表示需要同时按住ShiftG键。n表示输入的数字。其他比如text则表示字符串。

    1、跳转

    按键说明
    gg跳转到第一行
    G跳转到最后一行
    ngg / nG跳转到最后一行
    Ctrl+f向下翻页
    Ctrl+b向上翻页
    h光标左移
    j光标下移
    k光标上移
    l光标右移
    w移到下一个单词的开头
    W移到下一个单词的开头,忽略标点
    b移到上一个单词的开头
    B移到上一个单词的开头,忽略标点
    e移到下一个单词的末尾
    E移到下一个单词的末尾,忽略标点
    nw/nW/nb/nB跳转n个单词
    L移到当前屏幕最后一行
    M移到当前屏幕中间行
    $到当前行最后一个字符
    ^到当前行第一个字符
    0到当前行第一个字符
    n
    (到句子开头
    )到句子结尾
    {到段落开头
    }到段落结尾

    2、查找和替换

    (1)查找

    按键说明
    /text向后查找text字符
    ?text向前查找text字符
    n跳转至下一个text字符
    N跳转至上一个text字符
    :set ic查找时忽略大小写
    :set noic查找时对大小写敏感

    (2)替换

    按键说明
    :s/oldtext/newtext/替换当前行第一个oldtext为newtext
    :s/oldtext/newtext/g替换当前行所有oldtext为newtext
    :m,ns/oldtext/newtext/在m行到n,用newtext替换第一个oldtext
    :1,$s/oldtext/newtext/在1行到最后一行,用newtext替换第一个oldtext
    :m,ns/oldtext/newtext/g在m行到n,用newtext替换oldtext
    :1,$s/oldtext/newtext/g在1行到最后一行,用newtext替换oldtext

      在最后输入一个(confirm),表示替换前弹出确认提示。按y则逐一替换当前光标处匹配的字符,n则跳过当前光标处字符,a替换全部匹配的字符。

    3、复制、删除、撤销、重复

    (1) 复制

    按键说明
    yy复制当前行
    nyy复制当前及向下n行
    p将复制内容黏贴到下一行
    P将复制内容黏贴到上一行

      另外,输入y+跳转中的操作,可以为复制指定方向。比如yw,从当前位置复制到下一个单词的开头。这样可以进行复制一个单词的操作。

    (2)删除

    按键说明
    dd删除当前行(按p可黏贴)
    ndd从当前行向下删除n行
    dG从当前行删除到最后一行
    dgg从当前行删除到第一行
    :n,md从第n行删除到第m行
    x删除当前字符
    nx删除当前向后n个字符
    X删除光标前的字符
    nx删除当前向前n个字符

      另外,输入d+跳转中的操作,可以为删除指定方向。比如dw,从当前位置删除至下一个单词的开头。

    (3)撤销

    按键说明
    u撤销上一次操作
    U撤销当前行所有操作
    .重复最后一次操作

    (4)重复

    按键说明
    .重复最后一次操作

    4、其他

    按键说明
    J将下一行连接到本行末尾
    nJ将下n行连接到本行末尾
    ~将当前字符切换大小写
    n~将当前向后n个字符切换大小写
    ~将当前字符切换大小写
    g~~切换当前行大小写
    u列编辑模式下,选中列转换成小写
    U列编辑模式下,选中列转换成大写
    guu当前行转换成小写
    gUU当前行转换成大写
    guw当前单词转换成小写
    gUw当前单词转换成大写

    5、列编辑

      按Ctrl + v,进入列编辑模式。
      
    (1)删除列
      进入列编辑模式,
      移动光标,选中需要删除的列,
      按d,则会删除选中内容。

    (2)插入列
      进入列编辑模式,
      移动光标选中需要插入内容的列。
      按shift + i,会在选中列的第一行输入想要插入的内容。
      连续按两次ESC,则会在选中的列处全部插入输入字符。

    展开全文
  • linux shell脚本编程 自动化脚本 awk sed grep find 文本分析 LinuxShell命令行及脚本编程实例详解 本文github window 下 从零开始——PowerShell应用入门(全例子入门讲解) 各种逗比脚本参考 参考代码1 参考...

    linux shell脚本编程 自动化脚本 awk sed grep find 文本分析 LinuxShell命令行及脚本编程实例详解

    本文github

    window 下 从零开始——PowerShell应用入门(全例子入门讲解)

    各种逗比脚本参考

    参考代码1

    参考代码2

    Linux-Shell脚本编程书籍代码

    把平时有用的手动操作做成脚本,这样可以便捷的使用

    awk 与 sed 学习,包括了知识点介绍,和一些习题练习

    三十分钟学会AWK

    三十分钟学会SED

    Shell脚本学习笔记

    LinuxShell命令行及脚本编程实例详解 推荐 百度下载

    LinuxShell命令行及脚本编程实例详解 推荐 CSDN下载

    脚本解释器

    sh

    即Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。

    bash

    Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell,比如你会经常在招聘运维工程师的文案中见到:熟悉Linux Bash编程,精通Shell编程。

    在CentOS里,/bin/sh是一个指向/bin/bash的符号链接:

    [root@centosraw ~]# ls -l /bin/*sh
    -rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
    -rwxr-xr-x. 1 root root 106216 Oct 17  2012 /bin/dash
    lrwxrwxrwx. 1 root root      4 Mar 22 10:22 /bin/sh -> bash
    

    但在Mac OS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节左右:

    iMac:~ wuxiao$ ls -l /bin/*sh
    -r-xr-xr-x  1 root  wheel  1371648  6 Nov 16:52 /bin/bash
    -rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/csh
    -r-xr-xr-x  1 root  wheel  2180736  6 Nov 16:52 /bin/ksh
    -r-xr-xr-x  1 root  wheel  1371712  6 Nov 16:52 /bin/sh
    -rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/tcsh
    -rwxr-xr-x  1 root  wheel  1103984  6 Nov 16:52 /bin/zsh
    

    高级编程语言

    理论上讲,只要一门语言提供了解释器(而不仅是编译器),这门语言就可以胜任脚本编程,常见的解释型语言都是可以用作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的脚本编程语言了,Python这些年也成了一些linux发行版的预置解释器。

    编译型语言,只要有解释器,也可以用作脚本编程,如C shell是内置的(/bin/csh),Java有第三方解释器Jshell,Ada有收费的解释器AdaScript。

    如何选择shell编程语言

    熟悉 vs 陌生

    如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。

    新增的学习成本很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就可以了。

    简单 vs 高级

    如果你觉得自己熟悉的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据之类的事情,学着使用sh,bash会是一个好主意。

    shell只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用Python、Perl这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱,比如说:

    • 它的函数只能返回字串,无法返回数组
    • 它不支持面向对象,你无法实现一些优雅的设计模式
    • 它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数),只要没执行到这一行,就不会报错

    环境兼容性

    如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。

    第一个shell脚本

    编写

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。

    输入一些代码,第一行一般是这样:

    #!/bin/bash
    #!/usr/bin/php
    

    “#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。

    运行

    运行Shell脚本有两种方法:

    作为可执行程序

    chmod +x test.sh
    ./test.sh
    

    注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。

    通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。

    这里的"系统",其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。

    参考资料

    LinuxShell命令行及脚本编程实例详解笔记

    LinuxShell命令行及脚本编程实例详解

    Linux 典藏大师系列丛书

    shell 脚本的构成:

    1. shell 关键字 if ...then else; for ...done; while do done
    2. shell 命令 export,echo,exit,pwd,return
    3. linux 命令 data rm mkdir cd 
    4. 文本处理功能 awk cut sed grep
    5. 函数 功能语句集合 /etc/init.d/functions
    6. 控制流语句 if...then...else
    

    bash 登录脚本 ~/.bash_profile 打开shell 会执行的脚本

    bash 退出脚本 ~/bash_logout 退出shell 会执行的脚本

    shell 变量

    username=wanyouwen
    
    或者
    
    username="wanyouwen"   注意等号=前后不能有空格
    
    赋值数字给变量
    
    var=2
    
    注意shell默认赋值是字符串赋值
    
    如 var=$var+1
    
    echo var
    
    >>> 1+1  看到是不是2
    如果想把算术表达式的值赋给一个变量,需要用let
    
    let var=2+3
    
    echo $var
    
    5
    
    
    # 使用(())
    cnt=0
    
    cnt=$(($cnt+1))
    
    将一个变量赋值给另外一个变量
    a=3
    b=$a
    echo $b
    
    将命令的结果赋值给变量
    var='pwd'  或者 var=$(pwd) 
    echo $var
    
    获取命令行输入 获取read命令得到的值
    
    $ echo -n "Enter var:"; read var
    Enter var: 1234
    $ echo var
    1234
    

    打印变量

    最简单的使用 echo
    
    echo $变量名
    
    var=10
    echo $var
    echo ${var}
    echo "value: $var"
    echo "value: ${var}"
    
    也可以使用 printf
    
    printf  "格式" $变量
    
    var = 111
    printf "%s\n" $var   类似于c语言的printf()函数
    
    %d  %i  带符号十进制格式打印
    %o      无符号八进制
    %u      无符号十进制
    %x      无符号小写十六进制
    %X      无符号大写十六进制
    %f      浮点数格式
    %e      双精度浮点数  <N>e<N>
    %E      双精度浮点数  <N>E<N>
    #c      以字符的格式
    %s      以字符串的格式
    %n      指定打印字符的个数
    %%      打印一个%
    
    转义字符
    \"      打印一个双引号 "
    \\ 
    \a      警告音
    \b      删除前一个字符
    \f      换页符
    \r      回车,回到本行开头
    \n      换行,到下一行开头
    \t      一个制表符
    \v      竖直制表符
    
    ### echo中 使用转移字符  需要 -e 选项使能转移字符
    $ echo -e "User name: $USER\tHome Directory: $HOME\n"
    >>> User name: ywy  Home Directory: /home/wyw
    
    ######字符串#####
    var=shell
    $printf "%s\n" $var
    shell
    $printf "%1s\n" $var   #指定参数长度小于实际长度,按实际长度打印
    shell
    $printf "%1.3s\n" $var #小数点后指示打印的字符串长度
    she
    $printf "%1.6s\n" $var #小数点后指示打印的字符串长度
    shell
    $printf "%3.6s\n" $var #小数点后指示打印的字符串长度
    shell
    $printf "%6.6s\n" $var #指定长度大于实际长度,左边补空格
     shell                
    $printf "%10.6s\n" $var #指定长度大于实际长度,左边补空格
         shell              #左边补了5个空格
    $printf "%10.2s\n" $var #指定长度大于实际长度,左边补空格
         sh                 #左边补了5个空格,同时只打印前2个字符
    
    
    ####小数######
    $varr=123.45678
    $printf "%5.1f\n" $varr #打印总长度5(包含小数点)保留小数点后1位数字
    1123.5
    $printf "%6.2f\n" $varr #
    1123.46
    $printf "%7.3f\n" $varr #
    123.457
    $printf "%9.3f\n" $varr #打印长度9,保留小数点后3位,只有7位长度,左侧空格
      123.457
    $printf "%10.3f\n" $varr #打印长度10,保留小数点后3位,只有7位长度,左侧空格
       123.457
    
    

    变量引用 双引号 “$变量名” 将变量整体化

    
    LIST="one two three"
    
    for var in $LIST   # 将变量的值分成3个参数传递给了for循环
    do
        echo "$var"
    done
    >>>
    one
    two
    three
        
    for var in "$LIST"   # 将变量的值作为一个整体传递给了for循环
    do
        echo "$var"
    done
    >>>
    one
    
    

    export 变量名=变量值 声明定义全局变量 多bash环境可用

    readonly 变量名=变量值 声明只读变量

    unset 变量名 删除 export 定义的全局变量,不能删除 readonly 只读变量

    检查变量是否存在 变量名? 不存在提示语 或 ${变量名:? 不存在提示语}

    JAVA_HOME=/usr/local/jdk
    export JAVA_HOME
    echo ${JAVA_HOME:? Error variable is not defined}
    >>> /usr/local/jdk
    
    unset JAVA_HOME
    echo ${JAVA_HOME:? Error variable is not defined}
    >>> -bash JAVA_HOME: Error variable is not defined
    
    
    还有一种更简单的检查变量是否存在的方法 使用 if语句来判断
    

    回调 历史命令

    #### 回调 历史命令
    history
    >>>
    会显示之前输入过的命令 
    id1 命令
    ...
    idn 命令
    
    !! 输入两个! 会执行就一条指令
    !+id号 会执行历史命令中对应id号的命令
    !+历史命令开头的字符  会执行历史命令中有已字符开头的命令
    

    shell中的扩展 展开 繁殖

    大括号扩展 波浪号扩展 参数和变量扩展 命令替换 算术扩展 进程替换 单词拆分 和 文件名扩展

    大括号扩展 前缀字符{字符1,字符2,…,字符n}后缀字符

    echo a{b,c,d}e
    >>> abe ace ade
    
    echo {a..z}  # 按字母表顺序显示 a~z字母
    >>> a b c d ... x y z
    
    echo {0..10} # 显示0~10的数字
    >>> 0 1 2 3 ... 9 10
    
    echo {6..-4} # 显示6~-4的数字
    >>> 6 5 4 3 ... 0 -1 -2 -3 -4
    
    echo {g..a} # 显示g~a的字母 反向
    >>> g f e d c b a
    
    echo {1..3}{a..c}
    >>> 1a 1b 1c 2a 2b 2c 3a 3b 3c
    
    ## 嵌套
    echo a{{b,c}1,{d,e}3,f}h
    ab1h ac1h ad3h ae3h afh
    
    ## 大括号扩展 繁殖命令
    在 当前目录下创建三个文件夹 son1 son2 son3
    mkdir ./{son1,son2,son3}
    
    ## bash 4.0 新功能 {起点..终点..步长}
    echo {0..10..2}
    >>> 0 2 4 6 8 10
    
    echo {10..3..-2}
    >>> 10 8 6 4 2
    
    echo {a..k..2}
    >>> a c e g i k
    
    echo {0001..11..5}   # 指定形式
    >>> 0001 0006 0011
    
    

    ~ 波浪号 指代用户主目录

    cd ~
    pwd
    >>> /home/wyw
    cd ~wyw
    pwd
    >>> /home/wyw
    
    ~+ 指代 shell变量 PWD的值
    echo ~+
    >>> /tmp
    echo $PWD
    >>> /tmp
    
    ~-  指代 shell变量 LODPWD 的值
    echo ~1
    >>> /home/wyw
    echo $LODPWD
    >>> /home/wyw
    
    

    文件名扩展

    * 匹配任意字符,包括空格,多个字符,单个字符
    ? 匹配任意单个字符
    [xyx] 匹配阔靠内的任意单个字符
    
    ls ./*.txt
    >>> 列出 当前目录下 所有以.txt结尾的文件
    
    ls ./[abc]*.cfg
    >>> 列出 当前目录下 以a或b或c开头,以.cfg结尾的文件
    
    ls ./image?.jpg
    >>> 显示所有 image1.jpg\image2.jpg\...\image9.jpg 文件
    
    ls ./image1[0-9]*.jpg
    >>>  列出 以 image10 \ image11 \...\image19开头,以.jpg结尾的文件
    

    命令别名

    alias 别名='完整命令'
    
    例如:
    alias ll='ls -l'
    
    是 cp\mv\rm等命令交互式地执行并解释执行了哪些操作
    alias cp='cp -iv'
    alias mv='mv -iv'
    alias rm='rm -iv'
    
    查看磁盘使用情况
    
    alias dus='df -h'
    查看所有定义的别名命令
    alias
    不带参数
    
    

    第三章 常用 shell 命令

    ls 列出文件名和目录

    
    ls
    ls -l
    -l 显示全部文件信息:
    第一个字符:-,普通文件 d,文件夹 s,套接字文件 l,链接文件
    后面9个字符: 文件权限,rwx 读r 写w 执行x 分别为 所有者、用户组、其他用户的权限
    
    ls -lh 文件大小显示为KB MB GB 单位
    
    ls -ls 安装文件大小顺序列出文件和文件夹
    
    ls -a 显示所有文件
    
    # 生成文件名变量
    prototxt_file_name=$(ls *.prototxt)
    #.prototxt文件数量
    count=$(grep -c ".prototxt" $prototxt_file_name | wc)
    
    

    cat 显示文件 more less head tail file

    cat 查看文件内容 连接文件 创建一个或多个文件 重定向输出到终端或文件
    
    # 查看文件内容   cat 正序显示   tat 倒序显示文件内容
    cat wyw.txt  / cat -n wyw.txt 显示行号  / cat -b wyw.txt 显示非空白行行号 
    
    cat -e  wyw.txt 会在每行末尾 多显示 $ 符号 (多行内容转换成一行时很有用)
    
    #使用命令行输入创建文件 并连接多个文件
    
    cat >test1
    >>> hello!
    cat >test2
    >>> world!
    cat test1 test2 > test3
    #显示 test3
    cat test3
    >>> 
    hello!
    world!
    
    
    # more 分屏显示文件内容
    more /etc/inittab  / more -10 /etc/inittab 指定一次显示的行号
    
    # less 查看文件速度快 可快速查找关键字
    less /etc/inittab 
    输入 /关键字  然后回车 向后搜索关键字 
         ?关键字  然后回车 向前搜索关键字 
         
    Ctrl+B 向回翻一个窗口的内容 Ctrl+F 向后翻一个窗口的内容 
    
    
    # 显示 文件 头 head  显示 文件尾 tail
    
    head /etc/inittab / head -10 /etc/inittab   显示开头前10行
    tail /etc/inittab / tail -20  /etc/inittab  显示末尾倒数20行
    
    
    # file 文件名 显示文件类型
    
    file /etc/inittab 
    >>> /etc/inittab: ASCII English text
    file -i /etc/inittab 
    

    wc 查看文件统计信息

    wc 文件名
    >>> 行数 单词数 字节数 文件名
    wc -l 文件名  只统计行数
    wc -w 文件名  只统计单词数
    wc -c 文件名  只统计字节数
    wc -L 文件名  统计文件中最长行的长度
    
    

    find 查找文件/目录

    # 查找文件
    
    find ./wanyouwen/*.txt  # 查找 ./wanyouwen 目录下的 txt文件
    find ./wanyouwen -type f -name "*.txt" 
    find ./wanyouwen -type f -perm 0777  查找权限是777的文件
    find ./wanyouwen -type f ! -perm 777  查找权限不是777的文件
    find ./wanyouwen -type f -perm /a+x  查找可执行文件
    
    find ./wanyouwen -type f empty  查找空文件
    
    # 查找文件夹
    find ./ -type d -name wanyouwn
    find ./wanyouwen -type d empty  查找空文件夹(目录)
    
    

    touch 创建文件 mkdir 创建文件夹 cp 复制文件/文件夹 ln -s 创建符号链接文件 mv移动/重命名文件/目录

    # 创建文件
    touch 文件1 文件2 文件3
    touch -c 已有的文件名 只更新 文件时间戳
    touch -m 已有的文件名 只更新 文件的修改时间
    
    # 创建文件夹
    mkdir 文件名1
    mkdir -p 文件名2/文件夹3  递归创建 带有父目录
    
    # 复制文件/文件夹
    cp 文件1 ./xxx/ 复制
    
    # 创建符号链接文件
    ln -s  原地址  目标地址  # 在目标地址创建一个 原地址的快捷链接
    
    # 移动/重命名文件/目录
    mv 原地址文件/目录 新地址文件/目录
    
    # 删除文件/目录
    rm 文件名
    rm -rf 文件夹
    rm *.txt
    rm *[0-9].txt
    

    管理文件或目录权限

    # 显示权限
    ls -l
    # 修改权限
    chmod 777 文件   r(4)  w(2) x(1)
    chmod a+r 文件
    chmod a+w 文件
    chmod a+x 文件
    chmod o+r 文件
    chmod o+w 文件
    chmod o+x 文件
    chmod u+r 文件
    chmod u+w 文件
    chmod u+x 文件
    chmod g+r 文件
    chmod g+w 文件
    chmod g+x 文件
    # 修改所有者 和 用户组
    chown
    chgrp
    # 设置(用户、组)权限位
    setuid
    setgid
    
    

    文本处理

    文本排序 sort

    
    $ cat tep.txt
    abc
    def
    ghi
    def
    $ sort tep.txt  # 将文件内容按字母顺序排序
    abc
    def
    def
    ghi
    $ sort -u tep.txt # 排序 并去除重复的行
    abc
    def
    ghi
    
    $ cat digit.txt
    10
    30
    20
    100
    $ sort -n digit.txt # 按数字大小排序
    10
    20
    30
    100
    $ sort -n -r digit.txt # 按数字大小 倒序 排序
    100
    30
    20
    10
    
    # 多列数字排序
    $ cat  dig.txt
    abc,30
    def,10
    ghi,20
    def,50
    $ sort   dig.txt # 默认按每行的第一列进行排序
    abc,30
    def,10
    def,50
    ghi,20
    
    $ sort -t ',' -k2n,2 dig.txt # 按第二列 数字大小顺序排序 -t 指定分隔符 -k 指定列数
    def,10
    ghi,20
    abc,30
    def,50
    
    $ sort -t ',' -k2nr,2 dig.txt # 按第二列 数字大小倒序排序 -t 指定分隔符 -k 指定列数 r倒序
    def,50
    abc,30
    ghi,20
    def,10
    
    

    文本去重 uniq (unique) 独一无二

    $ cat  tep.txt
    aaa
    aaa
    bbb
    ccc
    ccc
    $ uniq tep.txt  # 去除重复行
    aaa
    bbb
    ccc
    $ uniq -c  tep.txt  # 记录每行出现次数
    2 aaa
    1 bbb
    2 ccc
    $ uniq -d  tep.txt  # 只显示有重复的行,只显示一次
    aaa
    ccc
    $ uniq -D  tep.txt  # 只显示有重复的行,显示所有
    aaa
    aaa
    ccc
    ccc
    $ uniq -u  tep.txt  # 只显示不重复的行
    bbb
    
    $ uniq -w 3 tep.txt  # 限定每行的前3个字符来比较每行是否重复
    $ uniq -f 1 tep.txt  # 跳过每行前1个字符来比较每行是否重复
    

    替换或删除字符 tr

    # 大小写转换
    $ echo linuxShell | tr [:lower:] [:upper:]
    LINUXSHELL
    $  echo linuxShell | tr a-z A-Z  # 功能同上 
    LINUXSHELL
    
    # 替换空格
    $ echo "Hello world" | tr -s [:space:] '\t'
    Hello   world   # 空格 换成 制表符  -s 多个连续的空格算一个
    
    # 删除 字符 -d 选项
    $ echo "Hello world" | tr -d a-z # 删除全部小写字母
    $ echo "Hello world 12345" | tr -d [:digit:] # 删除全部数字
    $ echo "Hello world 12345" | tr -cd [:digit:] # 删除全部数字以外的字符
    

    字符串查找 grep 常用

    grep  关键字 目标文件/目标文件夹/字符串
    grep -r 关键字 目标文件夹   # 递归查找  或者 grep -R 关键字 目标文件夹
    grep -c 关键字 目标文件/目标文件夹/字符串  # 查找出现的次数
    grep -n 关键字 目标文件/目标文件夹/字符串  # 显示行号和对应出现的位置
    
    

    文件比较 diff

    diff 文件1  文件2   # 比较两个文件的差异
    diff -yw 文件1  文件2   # 并排显示两个文件的差异
    

    其他常用命令

    hostname  # 查看主机名
    hostname 新主机名  # 临时修改主机名,下次重启恢复原主机名
    
    who/w   # 列出系统登录用户
    who -b  # 显示系统启动时间
    who -l  # 显示系统登录进程时间
    who -m  # 只显示与当前用户相关的信息
    
    uptime   # 查看系统运行时间
    
    uname    # 查看系统信息,内核名
    uname -r # 内核版本信息
    uname -p # 系统硬件CPU类型
    uname -i # 硬件平台信息
    uname -n # 打印主机名
    uname -a # 显示上述所有信息
    
    #### 获取日期信息 data 
    
    year = $(data +%Y)
    >>> 2019
    year = $(data +%y)
    >>> 19
    mouth = $(data +%m)
    >>> 08
    mouth = $(data +%d)
    >>> 10
    
    $(data +%H)   小时
      
    $(data +%M)  分钟
    
    $(data +%S)  秒
    
    week = 'data +%a' # 星期几
    
    

    第四章 shell命令进阶

    文档处理 和 归档 paste合并文件 dd备份和拷贝文件

    ### paste 合并多个文件的相应行到同一行
    $ cat t.txt
    >>>
    1
    2
    3
    
    $ cat d.txt
    >>>
    a
    b
    c
    
    $ paste t.txt d.txt
    >>>
    1 a
    2 b
    3 c
    
    $ paste -d'|' t.txt d.txt # 指定合并时的分隔符
    1|a
    2|b
    3|c
    
    $ paste -d':,' t.txt d.txt y.txt # 合并多个文件时指定多个分隔符
    
    
    ### 文档复制 dd
    # dd if=输入文件的路径(默认标准输入) of=输出文件的路径(默认标准输出)
    
    # 实例:
    dd if=/dev/sda of=/dev/sdb   #将磁盘/dev/sda 数据复制到 磁盘/dev/sdb
    dd if=/dev/dvd of=dvd.iso    #将磁盘/dev/dvd 数据复制变为一个iso文件
    dd if=/dev/zero of=/dev/sda2 #擦除/dev/sda2分区的数据(格式化)
    
    ### 压缩和归档文件 gzip bzip2
    ### 解压缩文件    gunzip bunzip2
    ### 打包/解包文件  tar -czvf xxx(打包)  tar -xzvf xxx (解包)
    

    监测和管理磁盘

    ### 挂载mount 和 卸载umount 存储介质 到 文件系统某节点
    
    ### df 报告文件系统磁盘空间利用率
    df -a  # 显示所有文件系统信息
    df -h  # 以GB MB 单位来显示文件大小 和 使用率等信息
    df -t  # 显示文件系统类型
    df -m  # 以为块大小单位显示文件系统信息
    
    ### du 评估文件空间利用率
    du -h
    du -sh
    du -h --time # 显示大小和修改时间
    
    

    后台执行命令 cron 大管家 at大将军执行者 &任务发布者

    ###  cron 大管家 
    cron 是定时执行计划任务的守护进程,cron进程会从/etc/init.d 中自动启动。
    cron进程会在目录 /var/spool/cron/crontabs/ 下搜索定时计划任务文件,并将这些定时计划任务载入内存。
    cron进程还会读取 /etc/crontab 以及 /etc/cron.d 下的内容
    cron进程会每分钟唤醒一次,审查所有存储的定时任务,是否按规定执行(大管家)
    
    crontab -l
    >>>60 6 * * 0  /home/xxx/backup  
    # 每周日(0)的6点30分 指向该任务;前5个字段分别为 分钟 小时 日期 月份 星期; * 号表示任意,小时为24小时制。
    
    ###  at大将军执行者 在指定时间执行命令
    
    at noon 在中午12点前 midnight 凌晨12点 teatime下午4点 ...
    
    ### &将任务放在后台执行   指令 &
    
    ### nohup  运行一个对挂起免疫的命令 
    
    

    第二篇 shell 脚本编程

    5. shell 编程基础

    #!/bin/bash  # 第一行,指示行,指定解释器,若没有,则默认使用 /bin/sh作为解释器
    
    ### 单行注释
    # xxxxx代码
    
    ### 多行注释 1
    :<<!
    xxx 代码
    xxxx
    xxxxx
    !
    
    ### 多行注释2
    <<COMMENT
    代码1
    代码2
    ...
    COMMENT
    
    ### 给脚本执行权限
    chmod 777 xxx.sh
    
    ### 将脚本路径当如系统环境变量中可不加路径直接执行
    export PATH=$PATH:/home/wanyouwen/shscrips
    xxx.sh
    
    
    ### 变量进阶
    # 定义变量
    变量名=xxxx
    # 使用变量
    $变量名 或者 ${变量名}
    
    #  字符串修改
    FILENAME=linux_bash.txt
    
    echo ${FILENAME%.*}   # 移除文件名后缀保留文件名 %.*
    >>> linux_bash        
    
    echo ${FILENAME##*.}  # 移除文件名,保留后缀 ##*.
    >>> txt
    
    FILENAMEPATH=home/wanyouwen/linux_bash.txt
    
    echo ${FILENAME%/*}   # 移除文件名保留目录路径 %/*
    >>> home/wanyouwen/
    echo ${FILENAME##*/}   # 移除目录路径保留文件名 ##*/
    >>> linux_bash.txt
    
    ### 字符串长度
    
    ${#变量名}  # 获取变量名指定的字符串长度
    TEX="123456789a"
    ${#TEX}
    >>> 10
    
    ### 获取子字符串
    #{变量名:起点:长度}   索引从0开始
    ${TEX:3:4}
    >>> 4567
    
    #### bash 脚本参数
    ./xxx.bash  参数1  参数2 参数3 参数4
    
    param1=$1
    param2=$2
    param3=$3
    param4=$4
    
    
    #### declare 指定变量类型
    declare -r var=1   # 设定只读变量 var 其值为1
    var=2              # 只读变量不能被修改,会报错
    declare -i 变量    # 指定变量为整数型变量
    
    declare -a 变量    # 声明数组变量
    declare -a linux={'ubuntu','redhat'}
    
    简单数组定义
    linux=()
    赋值
    linux[0]='ubuntu'
    linux[1]='redhat'
    
    # 获取数组变量元素
    echo ${linux[@]}  或者 echo ${linux[*]}  # 索引编号 @/* 代表所有元素
    >>> ubuntu redhat
    echo ${linux[0]}
    >>> ubuntu
    echo ${linux}    # 数组名指代第一个元素
    >>> ubuntu
    
    

    shell 算数运算

    id++  id--  变量后递增和后递减
    ++id  --id  变量前递增和前递减
    - 单目 负号
    = 单目 正号
    +
    ! 逻辑反  ~按位取反
    ** 求幂
    * 乘  /除 %取余 +加 -减
    << 按位左移   >> 按位右移
    <=  >= <>  小于等于 大于等于 不等于
    & 按位与
    ^ 按位异或
    | 按位或
    && 逻辑与
    || 逻辑或
    
    expr?值1:值2
    
    
    
    10   普通数字开头 十进制数
    020  0数字开头为  八进制数
    0x30 0x开头为     十六进制数
    
    2#111 #前面指定进制数  2进制数
    32#20 #32进制数
    
    
    ##### 64 进制数   
    let base64=64#@_
    64进制数,0~9;a~z;A~Z;@ _
    @表示62
    _表示63
    
    

    6. shell 的条件执行

    ### test 测试文件属性 字符串测试 算术测试
    
    ### if 条件语句
    if [ $变量 == $变量2 ]
    then
       xxxx
    else 
       xxxx
    fi
    
    if [ $变量 == $变量2 ]    
    then
       xxxx
    elif [ $变量 -gt $变量2 ]      ### -gt大于-ge大于等于 -eq等于 -ne不等于 -lt小于 -le小于等于
    then
       xxxx
    else
       xxxx
    fi
    
    ### 查看脚本的命令行参数数量 ###################
    
    if [ $# -ne 1 ]; then
         echo "usage: $0 param1"
         exit 1
    fi
    
    num=$1 # 获取第一个命令行参数
    
    if [ $num -ge 90 ] && [ $num -le 100 ]  
    # 多条件 与&& (-a 也表示与 and   或|| (-o 也表示或 or) 逻辑非!
    then
       echo " 90 <= num <= 100"
    fi
    
    if [ ! -f xxx.txt ]; then echo " xxx.txt not exit "; fi
    
    -d 路径存不存在  
    
    

    case 多分支

    if [ $# -lt 2 ]
    then
       echo "usage: $0 param1 param2 "
    fi
    
    # 多case语句
    case "$1" in
    1)
      xxxx
    ;;  # 1)分支结束 必须要两个;来结束
    2)
      xxxx
    ;;
    3) 
      xxxxx
    ;;
    4 | 5 | 6)    # 多重case 匹配
       XXXXX
    ;;
    esac  # 结束case语句
      
    

    7. bash 循环

    7.1 for 循环

    for 变量 in  列表
    do
     ...
    done
    
    # 例如
    param="1 2 3 4 5 6 7 8 9 10"
    for num in $param
    do
       echo $num
    done
    
    for i in 1 2 3
    do
    ...
    done
    
    for s in aa bb cc dd
    do
    ...
    done
    
    
    for (( i = 0; i < 3; i++ ))
    do
       for (( j = 0; j < 5; j++ ))
       do
         ...
       done
       ...
    done
    
    

    7.2 while循环

    while [ $var -le 3 ]
    do
      var=$(( var + 1)) # 变量自加1
    done
    
    
    # while  和 read  读取文件
    
    while read -r line
    do
       echo $line
    done < "$file_name"
    
    
    # 读取文件 成 多列
    
    while read -r col1 col2 col3   # 每一行分成三列
    do
       echo $col1 $col2 $col3
    done < "$file_name"
    
    # 无限循环
    
    while :
    do
    ...
    sleep 3
    done
    
    while true
    do
    ...
    done
    
    

    7.3 until循环 与 while类似 只不过 在条件为假时执行

    7.4 select循环

    7.5 循环控制 break 和 continue

    break 跳出整个循环,退出循环

    continue 跳过当前次循环,执行下一次循环

    8. shell 函数

    # 格式1
    function_name()
    {
    # 函数体
    # 返回值 可选
    return int
    }
    
    # 格式2
    function function_name()
    {
    # 函数体
    }
    
    # 格式3
    function function_name
    {
    # 函数体
    local xxx  #函数内部变量
    }
    
    # 函数放在后台运行
    function_name &
    
    

    函数参数

    fname()
    {
    # 获取函数参数
    func_name=$0  # 函数名
    arg1=$1
    arg2=$2
    # 函数参数总数
    arg_num=$#
    # $* / $@ 所有参数
    
    # 以上同脚本的参数获取和统计方法
    # 关于参数的语句
    
    # 遍历所有参数
    for  arg  in $* ; do 
    ...
    done
    }
    

    调用函数 并传递参数给函数

    fname foo bar

    函数名 参数1 ($1) 参数2 ($2)

    9. 正则表达式

    10. 脚本输入处理

    11. shell重定向

    12. 管道和过滤器

    13. 捕获

    14. sed 和 awk 文本分析修改

    15. 其他

    感谢您的支持,我会继续努力分享更高质量的博文

    展开全文
  • Linux Shell

    2009-01-08 17:10:00
    参考 Linux Shell简介(http://www.linuxsir.org/main/?q=node/135)Linux重定向详解(http://www.ulcms.com/html/linux/shell/20080514/shell_11925.htm)1,shell 基本概念 首先是简单的命令解释器(典型的有 Windows ...

    参考

    Linux Shell简介(http://www.linuxsir.org/main/?q=node/135)

    Linux重定向详解(http://www.ulcms.com/html/linux/shell/20080514/shell_11925.htm)

    1,shell 基本概念

    首先是简单的命令解释器(典型的有 Windows 中的 DOS ),它解释由用户输入的命令并且把它们送到内核,而且是一个全功能的编程环境

    Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果

    同Linux本身一样,Shell也有多种不同的版本。

    目前主要有下列版本的Shell: Bourne Shell:是贝尔实验室开发的。 
    BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell.

    Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。

    C Shell:是SUN公司Shell的BSD版本

    2,终端(Terminals), 虚拟终端, xterm & shell

    终端:是用键盘、显示器及足够的 electronics (电子元件)组成的机器与中央计算机(central computer)相连的设备。

    在这些终端上,用户可以敲字符(teletypy),这就是字符串'tty'表示终端设备文件,和'getty'命令的名称来历

    为了避免各种终端设备标准不统一的混乱,就创建了一个含有所有不同终端特性的(capability)文件,

    这就是'termcap'。'/etc/termcap。
    Linux 终端大多数用'vt100'或'linux'作为终端类型。

    虚拟终端:X Window是一个 Unix 的图形子系统,但是它的好处是可以运行多个虚拟终端

             虚拟终端通过伪(pseudo) tty 设备-- pty 与系统相连

    xterm: 1,是虚拟终端的显示标准-- xterm 2,另一种角度讲是一个可以在XWindow 上 运行虚拟终端的应用程序。

    shell: 为了在终端(包括虚拟终端)中运行程序,需要 shell。shell 是操作系统的一部分,用来与用户打交道,并且可以用来协调各个命令

    3,reverse-i(ncremental)-search模式

    <CTRL r> 后,shell 就进入"reverse-i(ncremental)-search

    4,命令的排列

    command1 ; command2   //先执行 command1 ,不管 command1 是否出错,接下来执行 command2

    command1 && command2  //只有当 command1 正确运行完毕后,才执行 command2 。

    要编译、安装 Linux ,您需要执行一串命令:'make dep'、'make clean'、'make bzImage'、'make modules'、'make modules_install'和'make install'。如果要等一个命令完成后,再输入下一个,再等,再输入,……,那就太麻烦了。另一方面,每个命令只有当前面的命令都正确执行完毕后,才能开始执行。如果您用';'来排列命令,则即使有命令执行失败,后面的也照常运行,最后,您可能在'/boot'目录下得到一个有问题的内核映像(image)。而用'&&':
    make dep && make clean && make bzImage && make modules && make modules_install && make install

    不需要中途打断,就可以编译内核及其模块,并完成后面的安装。

    5,命令替换

    command1 $(command2)  或者 command1 'command2'

    command2 的结果作为command1的输入

    example: kill $(pidof myprocess)

    6,文件名通配符

    rm *[!6]*.bak  除了以'6.bak'结尾的文件,删除其他所有以'.bak'结尾的文件

    ls *.???? 列出所有在点号后有四个字符的文件

    ls [13]* 列出所有以字符'1'或'3'开头的文件

    ls *[3-8]?.*  列出所有点号前倒数第二个字符落在'3'到'8'范围的文件

    通配符的转意符 '/' 

    7,命令之间重定向

    command1 | command2 | command3

    command1 的输出给command2,然后command2的输出给command3

    8,I/O重定向

    1,I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9

    2,常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出)

    3,0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的

    4,>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出

    cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

    9,重定向到文件 >

    ls | sort > sdirlist

    将文件排序并输出到sdirlist中,原先存在的sdirlist将被删除

    追加输出到文件 >>

    echo "string" >> file

    出错信息输出到文件  2>

    command 2> file

    9,bash 配置文件

    .bash_history :记录了您以前输入的命令,

    .bash_logout :当您退出 shell 时,要执行的命令,

    .bash_profile :当您登入 shell 时,要执行的命令,

    .bashrc :每次打开新的 shell 时,要执行的命令

    请注意后两个的区别:'.bash_profile'只在会话开始时被读取一次,而'.bashrc'则每次打开新的终端(如新的 xterm 窗口)时,都要被读取。按照传统,您得将定义的变量,如 PATH ,放到'.bash_profile'中,而象 aliases(别名)和函数之类,则放在'.bashrc'。但由于'.bash_profile'经常被设置成先读取'.bashrc'的内容,您如果图省事的话,就把所有配置都放进'.bashrc'。

    上面的这些文件是每位用户的设置,系统级的设置存储在'/etc/profile'、'/etc/bashrc'及目录'/etc/profile.d'下的文件中。您最好习惯使用各自的配置文件:编辑不需要'root'权限,还可以使您的设置更具个性。当系统级与用户级的设置发生冲突时,将优先采用用户的设置。

    10,bash提示符

    #echo $PS1  显示当前的设定

    其中可用字符的含义在 man bash 的'PROMPTING'部分有说明

    #export PS1="/[/033[1m/][/w]/[/033[0m/] "

    11,命令的别名单引号和双引号的区别

    alias upmuo="rsync -e ssh -z -t -r -vv --progress $MUOHOME muo:/www/mandrakeuser/docs"

    单引号将剥夺其中的所有字符的特殊含义,而双引号中的'$'(参数替换)和'`'(命令替换)是例外

    几个有用的别名

    alias rpmq='rpm -qa | grep' :现在 rpmq string 就将列出所有名称中含有 string 的已安装 RPM 包

    alias ls='ls -ho --color | more' :ls 将以彩色分页方式列出文件,文件大小以 KB为单位

    alias use='du --max-depth=1 | sort -n | more' :use 将子目录按大小排好,并以分页方式列出

    12学习资源

    BASH Programming - Introduction HOW-TO:

    http://www.ibiblio.org/mdw/HOWTO/Bash-Prog-Intro-HOWTO.html 

    将更深入这些主题,并且将把您带到 shell 编程的世界。然后可以继续阅读我强烈推荐的 Advanced Bash-Scripting Guide( http://www.ibiblio.org/mdw/LDP/abs/html/index.html ),作者是:Mendel Cooper 。




    展开全文
  • Linux SHELL脚本设计

    千次阅读 2018-04-19 10:26:33
    Linux SHELL脚本设计SHELL程序的主要用途 在SHELL程序中不仅仅可以使用命令的集合,而且可而且可以安排自动化处理过程,因此可以通过编写SHELL程序使大量的任务执行实现自动化。SHELL比较擅长完成系统管理任务,尤其...
  • Linux Shell编程

    千次阅读 2017-02-09 09:03:52
    简介Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。...
  • Linux Shell脚本操作学习指南

    千次阅读 2018-09-12 15:08:24
    目录 Shell文件的规范 Shell文件的创建和运行 Shell文件语法 Shell传递参数 Shell参数校验 ...Shell数组 ...Shell运算符 ...参考地址:http://www.runoob.com/linux/linux-shell.html Shell文件...
  • linux shell脚本编程之hello world

    千次阅读 2017-07-06 09:45:13
    Linux shell shell编程
  • linux shell学习之find

    2021-01-07 08:55:08
    find命令可以用于查找特定的文件和目录。 一、基础用法 find /home/$USER 会列出用户主目录下的所有文件和目录 find /home/$USER -print print选项是打印的意思,默认换行打印 ...如果想找到所有以.txt结尾的文件和以.s
  • Linux Shell nohup命令

    2018-11-27 14:51:08
    Linux Shell nohup命令用法 在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 &amp; 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe –...
  • Linux shell编程学习

    千次阅读 2020-07-29 23:53:33
    shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。这点与Windows的命令提示符类似,但Linux shell的功能更加强大,我们可以使用 <和>对输入输出进行重定向 ,使用|在...
  • linux shell脚本基本案例 1、修改所有普通用户的密码为随机密码,并保存随机密码到pass.conf文件中。 验证: 考察:          输出重定向 >   &...
  • Linux shell 快捷操作

    2012-09-15 23:57:20
    Linux shell 快捷操作汇总(包含快捷键和些高效的操作): ctrl + a : 命令行开始 ctrl + e : 命令行结尾 ctrl + l : 清屏,等同于 clear 命令 ctrl + u : 剪切光标之前的内容 ctrl + k: 剪切光标之后的...
  • Linux shell 指令

    2016-06-12 10:14:19
    Linux shell指令运行的原理:Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过 kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。shell...
  • Linux Shell

    千次阅读 2005-10-24 20:18:00
    使用 Shell以下将介绍并解释基本的 shell 命令和机制。第一篇:超级工具/Terminals,xterms 和 Shells超级工具您或许听过...事实是上,您可以不懂任何 shell ,就能使用 Linux 。您启动系统后可以直接进入 X Window ,
  • Linux Shell简介

    千次阅读 2009-03-25 13:19:00
    原文: http://www.mandrakeuser.org/doc中译本:吴晓光 http://dummy.linux.net.cn/~xgwu/cmuo/整理: flaboy 北南南北点评:flaboy兄当时整理时发在了LinuxSir.Org 论坛 SHELL讨论区中,《Linux Shell简介》,是...
  • Linux Shell编程整理

    2013-09-13 13:52:42
    第一章 Linux Shell概述 Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口。它接受用户输入的命令,并把它送入内核去执行。Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备...
  • Linux Shell常用技巧

    2013-04-03 13:37:13
    原文地址: ... Linux Shell常用技巧(一)  http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html 一. 特殊文件: /dev/null和/dev/tty 二
  • Linux shell速查手册

    千次阅读 2015-07-02 00:28:59
    Linux Shell脚本攻略笔记[速查] Linux Shell脚本攻略笔记[速查] 资源shell scriptrun shell scriptechoprintf环境变量和变量pgrepshell数学运算命令状态文件描述符和重定向cat数组和关联数组aliasdate调试...
  • Linux shell 常用技巧

    2012-09-17 10:36:58
    转载自:http://www.kuqin.com/linux/20120916/330804.html 在最近的日常工作中由于经常...因此这段时间总结的有关Linux Shell的系列博客就给予了我极大的帮助,然而在实际的使用中却发现,有的时候确实忘记了某个技术
  • linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]

    万次阅读 多人点赞 2021-09-28 10:53:50
    ⭐]关于作者**作者介绍**一、shell 入门简介1.1 什么是shell1.2 shell 编程注意事项1.3 第一个shell 脚本 hello world二、shell 环境变量讲解2.1 shell 变量详解2.2 shell 系统变量 介绍2.3 shell 环境变量 介绍...
  • linux shell编程基础

    千次阅读 2019-01-12 19:43:04
    *shell脚本执行的方式:  脚本文件要在第一行头部以相应的格式写明bash的路径,例,#!/bin/bash 给予脚本文件执行权限,输入文件的路径,进行执行 例,/scripts/first.sh 将脚本文件作为bash的...
  • linux shell编程技巧

    千次阅读 2018-02-23 12:44:26
    1,shell 特性history 用法 连续敲两个!! 代表输入history!$代表上一条命令的最后一个参数! 数字代表执行数字数的命令!vi 代表从history 从下向上数,最近一条vi开头的命令$!2,tab用于命令补全如果按完以后不动...
  • linux shell 脚本编程基本语法

    千次阅读 2017-06-06 17:32:03
    linux shell 脚本编程打印ip命令: ifconfig eth0 | grep ‘inet’| awk ‘{print $2}’ 第一行:#!/bin/sh:表示有bin/sh来执行 -a:表示and,类似于C语言中的& -o:表示or,类似C语言中的| linux有很多sheel ...
  • 本文是Linux Shell系列教程的第(五)篇,更多shell教程请看:Linux Shell系列教程 字符串是Shell编程中最常用最有用的数据类型,今天,Linux大学网就为大家介绍一下在Shell中的字符串用法,以及Shell中常用的字符...
  • Linux Shell 脚本编程(8)—文本过滤(awk命令)文本过滤 正则表达式 —Linux Shell 脚本编程(5)—文本过滤(正则表达式) grep 命令 —Linux Shell 脚本编程(6)—文本过滤(grep命令) find命令 —Linux ...
  • linux shell编程总结

    千次阅读 2009-03-16 12:00:00
    本周学习了unix/linux shell编程,参考的是《LINUX与UNIX Shell 编程指南》,David Tansley著;徐焱,张春萌等译,由机械工业出版社出版的了,往内页那么一翻,都是2000年3月译的了,原书估计会更老,不过图书馆能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,004
精华内容 28,001
关键字:

linuxshell结尾

linux 订阅