精华内容
参与话题
问答
  • shell脚本基本命令

    千次阅读 2019-08-01 19:03:48
    shell介绍 shell是一段应用程序,是用户和操作系统交互的一个桥梁 shell是弱类型语言,在定义变量时不需要指定变量的类型 二变量 变量名=变量值 变量名不能以数字开头,字母数字、下划线组成 输出变量内容 ...

    一shell介绍

    shell是一段应用程序,是用户和操作系统交互的一个桥梁

    shell是弱类型语言,在定义变量时不需要指定变量的类型

    二变量

    变量名=变量值

    变量名不能以数字开头,字母数字、下划线组成

    输出变量内容 echo $变量名

    释放变量  unset 变量名

    双引号:如果变量值中存在$变量名,则输出变量名对应的变量值,在$变量前加转义符\,则可原样输出

    单引号:如果变量值中存在$变量名,则原样输出

    #输出当前所在目录
    vi script1.sh
    #!/bin/bash
    dir='pwd'
    echo $dir
    #添加执行权限
    chmod +x

    统计某目录下有多少文件

    vi script.sh
    
    #!/bin/bash
    
    cd /etc
    
    filename=ls -l|wc -l
    
    echo "该目录下有$filename个文件"
    
    :wq
    
    sh script.sh

    三read,echo,数组的使用

    ①read a b

    helloword girl boy

    则  a=helloword,b=girl boy

    复制   cp script.sh script1.sh

    输入:read 变量名

               read -p '输入提示的信息' 变量名 

    ②echo 命令用于向窗口输出文本。

    #!/bin/bash

    echo "这是数据是$1"     #第一个参数

    echo "这是数据是$0"  #文件名称

    echo "这是数据是$4"   #第4个参数

    echo "这是数据是$@"   #显示全部参数

    echo "这是数据是$#"   #显示参数的个数

     

    sh script4.sh 100 200 300 400

    echo 这是数据是100

    echo 这是数据是 script4.sh   #指向该脚本的名称

    echo 这是数据是400

     

    多行注释:
    :<<EOF
    注释内容...
    注释内容...
    注释内容...
    EOF

    ③数组

    Bash Shell 只支持一维数组(不支持多维数组),Shell 数组用括号来表示,元素用"空格"符号分割开
    my_array=(A B "C" D)      
    也可以使用下标来定义数组  
    array_name[0]=value0
    array_name[1]=value1
    读取数组    , 使用@ 或 * 可以获取数组中的所有元素
    echo "第一个元素为: ${my_array[0]}"
    echo "数组的元素为: ${my_array[*]}"
    echo "数组的元素为: ${my_array[@]}"
    获取数组的长度: echo "数组元素个数为: ${#my_array[*]}"
    运算:反引号 ` ,表达式和运算符之间要有空格
    val=`expr 2 + 2`
    echo "两数之和为 : $val"

    四 重定向:把命令的内容输出到文件中

    正确命令  ls 1>a.txt  覆盖内容      ls 1>>a.txt  追加内容

    cat  a.txt

    错误命令  ls 2>a.txt  覆盖内容      ls 2>>a.txt  追加内容

    五程序的结构


                if..else分支
                if...elif...else分支
                case分支
                逻辑运算符:-a -o !
                数字比较运算符: -eq/-ne/-gt/-ge/-lt/-le
                字符串比较:==  !=
                文件状态测试:test 参数 变量名
                文件判断:-参数 变量名

    ①if --else

    1条件两边要有空格 2多个条件间要有空格 3if后面要有空格 4条件中如果存在变量,那么变量两边要有双引号,以fi结尾

    1. 练习:判断 /root目录是否为空

        涉及知识点:字符串间的判断: ==字符串是否相等,!=是否不相等

    script1.sh
    #!/bin.bash
    dir =’ls /root’  
    if [ “$dir”==” ” ]           #if [ “$dir”==” ” ]:then
    then
            echo “目录为空”
    else
            echo “目录不为空”
    fi
    
    
    
    
    read -p "请输入目录:" dir
    d='ls $dir' 
    if [ “$dir”==” ” ]           #if [ “$dir”==” ” ]:then
    then
            echo “目录为空”
    else
            echo “目录不为空”
    fi

    ②逻辑运算符

    运算符    说明    举例
    !    非运算,表达式为 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。
     

    2. 练习:判断用户输入的用户名和密码是否为admin 123456,如果是则提示登录成功,否则提示失败

    script2.sh
    #!/bin/bash
    
    read -p "请输入你的用户名和密码:" username password
    if [ "$username"=="admin" -a "$password"=="123456"]
    then
            echo "success"
    else
            echo "fail"
    fi

     

    变量运算的多种写法

           -eq/-ne/-gt/-ge/-lt/-le

    ((i++))  ((i+=1))  i=$[$i+1]  let i=i+1  i=$(($i+1))

    -eq :相等

    -ne:不相等

    -gt:大于

    -ge:大于等于

    -lt:小于

    -le:小于等于

    3.练习:判断学生的成绩,大于90-100提示优秀,80-90之间提示良好,70-80之间则提示一般,60-70之间提示及格。其他则提示不及格

    vi script3.sh
    #!/bin/bash
    #
    read -p "" score
    #
    if [ "$score" -ge 90 -a "$score" -le 100]
    then
        echo "excellent"
    elif [ "$score" -ge 80 -a "$score" -lt 90]
    then
        echo "good"
    elif [ "$score" -ge 70 -a "$score" -lt 80]
    then
        echo "general"
    elif [ "$score" -ge 60 -a "$score" -lt 70]
    then
        echo "Pass"
    else
        echo "just try again"
    fi 
    

    ③case分支练习

    1.练习:输入一个序号,判断该用户选择哪款产品,A:笔记本 B:电饭煲 C:小台灯

    vi script.sh
    insert
    #!/bin/bash
    read -p "请输入产品:" pro
    case $pro in
    "A")
        echo "笔记本"
    "B")
        echo "电饭煲"
    "C")
        echo "小台灯"
    esac
    
    
    :wq
    sh script.sh

    2.练习:请输入对客服的满意度,【0-3】不满意,【4-6】满意,【7-9】非常满意

    #!/bin/bash
    read -p "请做出评价" pj
    case $pj in
    [0-3])
        echo "不满意"
    [4-6])
        echo "满意"
    [7-9])
        echo "非常满意"
    esac

    ④循环练习:

    1.练习:输出1-10之间的数

    #!/bin/bash
    for i in 1 2 3 4 5 6 7 8 9 10
    do
        echo $i
    done
    
    
    
    
    
    
    for i in seq 1 1 10
    do
        echo $i
    done

    2.1-100之间的和

    seq start size max

    开始点 间隔 结束点   如果size为1,可以省略

    i=1
    sum=0
    while ["$i" -le 100]
    do 
        sum=$(($sum+$i))
        ((i++))
    done
    echo $sum

     

    8. 练习判断用户输入的目录是否存在如果存在则统计目录下的文件个数否则提示用户该目录不存在

        test 参数 变量名---->测试文件的状态

    -e 表示文件是否存在

    -f 表示文件是否存在且为文件

    -d 表示文件名是否存在且为目录

    -r 可读

    -w 可写

    -x 可执行

    #!/bin/bash
    #提示用户输入
    read -p "请输入一个目录:" dir
    #进行判断
    if test -d $dir
    then
    #统计文件的个数
        filenum='ls -l $dir|wc -l'
        echo "目录$dir下的文件个数为$filenum"
    else
        echo "目录不存在"
    fi

    8. 练习判断用户输入的目录是否存在如果存在则统计目录下的文件个数否则提示用户该目录不存在

        test 参数 变量名---->测试文件的状态

    -e 表示文件是否存在

    -f 表示文件是否存在且为文件

    -d 表示文件名是否存在且为目录

    -r 可读

    -w 可写

    -x 可执行

     

    函数

    read -p "请输入第一个参数" num1
    read -p "请输入第二个参数" num2
    hello()[
        echo "helloworld"
        echo "第一个参数$1"
        echo "第一个参数$2"
    ]
    #hello 1 100
    hello $num1 $num2

    ⑤函数练习:

    输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名,判断创建的文件是否存在,如果不存在,则继续创建,否则提示该文件已经存在

    #创建文件函数
    creatfile()[
        cd $1
        read -p "请输入文件:" filename
        if [ -f "$filenme" ]
        then 
            echo "该文件已经存在"
        else
            echo "文件不存在"
            echo "开始创建文件"
            touch $filename
            echo "文件创建成功"
        fi
    ]
    read -p "请输入目录:" dir
    if [ -d "$dir" ]
    then
        #调用创建函数
        createfile $dir
    else
        echo 目录不存在“”
    fi

    ⑥算术运算

    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

    expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

    例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

    实例
    #!/bin/bash

    val=`expr 2 + 2`
    echo "两数之和为 : $val"

    输出结果如下所示:

    两数之和为 : 4
    两点注意:

    表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
    完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
    算术运算符
    下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

    运算符    说明    举例
    +    加法    `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。
    注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

    #!/bin/bash
    
    a=10
    b=20
    
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a - $b`
    echo "a - b : $val"
    
    val=`expr $a \* $b`
    echo "a * b : $val"
    
    val=`expr $b / $a`
    echo "b / a : $val"
    
    val=`expr $b % $a`
    echo "b % a : $val"
    
    if [ $a == $b ]
    then
       echo "a 等于 b"
    fi
    if [ $a != $b ]
    then
       echo "a 不等于 b"
    fi
    
    
    执行脚本,输出结果如下所示:
    
    a + b : 30
    a - b : -10
    a * b : 200
    b / a : 2
    b % a : 0
    a 不等于 b

    判断当前用户是否为root

    if [ "USER"=="root" ]
    then 
        echo "当前用户是root"
    else
        echo "当前不是root"
    fi

    七关于显示命令

    1.显示换行
    echo -e "OK! \n" # -e 开启转义
    echo "It is a test"
    输出结果:

    OK!

    It is a test
    2.显示不换行
    #!/bin/sh
    echo -e "OK! \c" # -e 开启转义 \c 不换行
    echo "It is a test"
    输出结果:

    OK! It is a test

    3.显示命令执行结果
    echo `date`
    注意: 这里使用的是反引号 `, 而不是单引号 '。


    结果将显示当前日期

    Thu Aug 1 14:15:46 CST 2019

    printf 命令,printf 的脚本比使用 echo 移植性好
    printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
    printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
    printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
    姓名     性别   体重kg
    郭靖     男      66.12
    杨过     男      48.65
    
    printf '%d %s\n' 1 "abc" 
    printf %s abcdef
    printf %s abc def
    printf "%s %s %s\n" a b c d e f g 
    printf "%s and %d \n" 
    
    1 abc
    abcdefabcdefabc
    a b c
    d e f
    g 
     and 0

    九 Shell test 命令
    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
    统计 users 文件的行数,执行以下命令:
    $  wc -l < users                  2 users
    $  wc -l < users                  2 

    /dev/null 文件
    如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
    $ command > /dev/null
           

    展开全文
  • Shell脚本基本命令

    千次阅读 2015-06-01 18:49:11
    shell脚本运行方式 $sh script.sh $sh /home/path/script.sh $chmod a+x script.sh ; $./script.sh echo的三种使用方式 echo hello world 不能包含一些特殊关键字,如分号; echo "hello word" 不能包含一些特殊...
    
    

    shell脚本运行方式

    $sh script.sh
    $sh /home/path/script.sh
    $chmod a+x script.sh ; $./script.sh

    脚本调试方法


    shell脚本的三种调试方法:
    -n   读一遍脚本中的命令但不执行,用来检查脚本中的语法错误
    -v   一边执行脚本,一边将执行过的脚本命令打印到标准输出端
    -x   提供跟踪执行信息,将执行的每一条命令和结果一次打印出来
    这应该就像C语言的gdb一样有用吧,有助于检查错误
    使用这些选项有三种方法
    1.在命令行提供参数:$sh -x script.sh
    2.脚本开头提供参数:#!/bin/sh -x
    3.在脚本中用set命令启用or禁用参数:其中set -x表启用,set +x表禁用

    另:在写脚本的时候,需特别注意添加空格或换行或分号
    eg   text命令:  $[ 5 -lt 10 ]左方括号后须有空格,右方括号前也须有空格
            shell脚本中函数定义: foo() {后须有空格或换行
            shell脚本中,若同一行内写有两条命令须加分号
    与C语言不同的是,shell脚本中,返回值0表真,1表假。

    echo的三种使用方式

    echo hello world 不能包含一些特殊关键字,如分号;
    echo "hello word" 不能包含一些特殊字符,比如!
    echo 'hello word" 包含'$var'变量不能被求值


    echo默认会将一个换行符追加到输出后,如果想禁止,可以使用-n这个选项
    如果想要使某些转义字符生效,则可以使用-e这个选项,如 
    echo "\ta\tb" 会输出 \ta\tb
    echo -e "\ta\tb" 则会输出 a b


    显示某些进程的环境变量

    [hadoop@Hadoop ~]$ pgrep bash
    3182
    [hadoop@Hadoop ~]$ cat /proc/3182/environ 
    USER=hadoopLOGNAME=hadoopHOME=/home/hadoopPATH=/usr/local/bin:/bin:/usr/binMAIL=/var/mail/hadoopSHELL=/bin/bashSSH_CLIENT=192.168.1.1 5649 22SSH_CONNECTION=192.168.1.1 5649 192.168.1.10 22SSH_TTY=/dev/pts/0TERM=vt100SELINUX_ROLE_REQUESTED=SELINUX_LEVEL_REQUESTED=SELINUX_USE_CURRENT_RANGE=



    算术运算

    使用 let、(())、[]执行基本的算术运算。

    如let a = b+c; let a++;let a--;
    也可以使用[], a=$[b+c];  a=$[$b+5]
    也可以使用(()),不过都需要在变量前加上$
    删除变量:unset


    tee

    tee命令:以stdin作为输入,将其输入到某个文件中,并原样输出



    显示变量

    set 显示当前shell的变量,包括当前用户环境变量和自己定义的变量

    env 显示当前用户环境变量
    export 显示当前导出成用户变量的shell变量


    关联数组即 Map

    [hadoop@Hadoop ~]$ declare -A map_array
    [hadoop@Hadoop ~]$ map_array[index1]=val1
    [hadoop@Hadoop ~]$ map_array[index2]=val2
    [hadoop@Hadoop ~]$ echo ${map_array[*]}
    val1 val2
    [hadoop@Hadoop ~]$ echo ${!map_array[*]}
    index1 index2

    cat

    作用:读取、显示、拼接文件内容。
    将AB两个文件内容一块输出 [hadoop@Hadoop ~]$ cat A B
    将输入文本与A一块显示 [hadoop@Hadoop ~]$ echo "Hello" | cat - A
    压缩空白行 cat -s  A
    将制表符显示为^|  cat -T A
    显示文本行号 cat -n A


    find

    作用:查找路径及子路径下所有的文件和文件夹
    查找script目录下所有的文件
    [hadoop@Hadoop ~]$ find script/
    script/
    script/timing.log
    script/output.session


    根据文件名或正则表达式匹配搜索
    [hadoop@Hadoop ~]$ find script/ -name "t*" #必须用引号括起来
    [hadoop@Hadoop ~]$ find script/ -iname "t*" #忽略文件名的大小写


    可以用OR连接多个条件
    [hadoop@Hadoop ~]$ find script/ \( -name "t*" -o -name "out*" \)#注意空格
    script/timing.log
    script/output.session


    可以使用参数指定查找深度
     -maxdepth 1 #指定查找的最大深度

     -mindepth 1 #指定查找的最小深度,即只列出1层以上的文件列表


     根据文件类型搜索

     -type d #只列出文件夹  -type f #只列出普通文件


     此外还可以根据时间和文件大小,还可以使用-delete删除找到的文件。
     -exec 可以对查出的每一个文件分别进行处理,如将文件所有者root改为hadoop:
     [hadoop@Hadoop temp]$ sudo find . -type f -user root -exec chown hadoop {} \;

    xargs

    作用:将标准输入转换成命令行参数或者将单行或多行文本转换成命令行参数
    [hadoop@Hadoop ~]$ cat A | xargs #将A文件多行数据转换成单行输入,即将换行符替换为空格
    [hadoop@Hadoop ~]$ cat A | xargs -n 3#将A文件多行数据重新分割并按3个进行分组
    [hadoop@Hadoop ~]$ cat A | xargs -d i #指定分隔符为 i

     小提示:xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 file 1.log 被解释成了两个记录 file 和 1.log, 不幸的是 rm 找不到这两个文件.为了解决此类问题, 让 find命令在打印出一个文件名之后接着输出一个 NULL 字符 ('') 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符. 这就是 find 的 -print0 和 xargs 的 -0 的来历吧.


    sort和uniq

    [hadoop@Hadoop ~]$sort A #对A文件进行升序排序
    [hadoop@Hadoop ~]$sort -r A #对A文件进行逆序排序
    [hadoop@Hadoop ~]$sort -n A #对A文件按数字进行排序
    [hadoop@Hadoop ~]$sort -k 2 A #根据第二列进行排序


    uniq总是和sort一起使用,可以消除重复的行


    脚本文件参数

    $0 这个程式的执行名字
    $n 这个程式的第n个参数值,n=1..9
    $* 这个程式的所有参数,此选项参数可超过9个。
    $# 这个程式的参数个数
    $$ 这个程式的PID(脚本运行的当前进程ID号)
    $! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
    $? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
    $- 显示shell使用的当前选项,与set命令功能相同
    $@ 跟$*类似,但是可以当作数组用
    展开全文
  • Shell脚本基础及基本常用命令

    万次阅读 2018-06-16 11:10:07
    一、shell基本信息 1.概述 脚本语言(shell、python):解释性语言,用解释器解释 运行效率低 | c、java:描述性语言,运行效率高 #!/bin/bash 幻数 ,在脚本运行的时候先进行该程序 以.sh结尾会有高亮显示 ...

    一、shell基本信息

    1.概述
    脚本语言(shell、python):解释性语言,用解释器解释 运行效率低 | c、java:描述性语言,运行效率高
    #!/bin/bash 幻数 ,在脚本运行的时候先进行该程序
    以.sh结尾会有高亮显示
    执行: sh hello.sh 或者 chmod +x hello.sh 再以绝对路径调用 /mnt/hello.sh
    2.shell脚本

    • 脚本是一种解释型语言
    • 用 shell 脚本保存执行动作
    • 用脚本判定命令的执行条件
    • 用脚本来实现动作的批量执行

    二、新建脚本自动添加注释信息

    [root@localhost mnt]# vim  /etc/vimrc 
    map <F4> ms:call MESS()<cr>'s
    func MESS()
            call append(0,"#################################")
            call append(1,"#Author:         gao".(" #"))
            call append(2,"#Version:                ".("    #"))
            call append(3,"#Mail:   gw@163.com".("          #"))
            call append(4,"#Date:           ".strftime("%Y-%m-%d").("       #"))
            call append(5,"#Description:    ".("            #"))
            call append(6,"# ".("                           #"))
            call append(7,"#################################")
            call append(8," ")
            call append(9,"#!/bin/bash")
    endfunc
    [root@localhost mnt]# vim  file.sh   ##新建一个脚本会自动添加注释信息

    配置文件所加内容(在建立一个脚本的情况下按F4会添加信息)
    这里写图片描述
    脚本的信息
    这里写图片描述
    注释掉按F4添加信息,改为自动给新建的脚本添加注释
    这里写图片描述

    三、编写脚本,执行该脚本显示ip

    [root@localhost mnt]# vim  ip_show.sh
    ifconfig eth1 |awk -F " " '/inet\>/{print $2}'
    [root@localhost mnt]# chmod  +x  ip_show.sh ##给一个可执行权限
    [root@localhost mnt]# /mnt/ip_show.sh   ##用绝对路径的方式调用
    [root@localhost mnt]# sh ip_show.sh    ##直接调用脚本

    内容如下:
    这里写图片描述
    执行该脚本的情况
    这里写图片描述

    四、常用的shell命令

    1.diff命令
    diff 命令是用来比较两个文件或目录的不同
    c –change d –delete a –add

    <表示第一个文件中的内容
    —-分割线
    >表示第二个文件中的内容
    [root@localhost mnt]# vim  westos
    [root@localhost mnt]# vim westos1
    [root@localhost mnt]# cat  westos
    hello   123
    linux
    [root@localhost mnt]# cat  westos1
    hello   123
    [root@localhost mnt]# diff westos  westos1    ##第一个和第二个进行比较以第二个文件为准则
    2d1                                           ##删除第一个文件的第二行才能和第二个文件的第一行匹配 
    < linux
    

    对文件进行补丁

    [root@localhost mnt]# diff  -u  westos westos1  ##生成补丁 
    --- westos  2018-06-09 22:44:21.237865024 -0400
    +++ westos1 2018-06-09 22:45:25.921865024 -0400
    @@ -1,2 +1 @@
     hello 123
    -linux
    [root@localhost mnt]# diff -u  westos westos1 > westos.path  
    f -u  westos westos1 > westos.path
    [root@localhost mnt]# yum  install patch -y  ##下载补丁工具
    [root@localhost mnt]# patch westos westos.path 
    patching file westos
    [root@localhost mnt]# cat westos
    hello 123

    这里写图片描述
    补丁的同时进行备份

    [root@localhost mnt]# patch -b  westos westos.path ##进行备份生成.orig文件,-b保留原文件,并进行补丁
    patching file westos
    [root@localhost mnt]# ls
    westos  westos1  westos.orig  westos.path
    [root@localhost mnt]# cat westos.orig ##补丁之前的源文件
    hello 123
    linux

    对目录的比较:

    [root@localhost mnt]# mkdir linux
    [root@localhost mnt]# mkdir unix
    [root@localhost mnt]# ls
    linux  unix  westos  westos1  westos.orig  westos.path
    [root@localhost mnt]# touch linux/hello
    [root@localhost mnt]# diff -r linux/ unix/
    Only in linux/: hello
    

    2.cut命令
    cut 命令多用与字符截取

    • cut -d 指定分隔符
    • cut -f 1,7|1-7 指定截取的列 1,7(1和7) 1-7(1到7)
    • cut -c 1,4|1-4 指定截取的字符位置
    [root@localhost mnt]# cp  /etc/passwd  .
    [root@localhost mnt]# ls
    ip_show.sh  passwd  westos  westos1
    [root@localhost mnt]# vim  passwd 删除一部分便于实验
    [root@localhost mnt]# cut  -d  :  -f  1-2 passwd  ##以:为分隔符截取第一列和第二列

    这里写图片描述

    [root@localhost mnt]# cut  -d  :  -f  1,7 passwd ##以:为分隔符截取第1列和第7列
    

    这里写图片描述

    [root@localhost mnt]# cut -c  1-4 passwd    ##截取第一到第四个字符

    这里写图片描述
    3.sort命令

    多用于字符排序
    sort -n 纯数字排序
    sort -r 倒序
    sort -u 去掉重复数字
    sort -o 输出到指定文件中
    sort -t 指定分隔符
    sort -k 指定要排序的列

    [root@localhost mnt]# vim hello  ##编辑一个由数字组成的文件
    [root@localhost mnt]# cat hello 
    3
    4
    5
    2
    1
    6
    8
    4
    45
    55
    33
    2
    [root@localhost mnt]# sort  -n hello  ##正序排序
    1
    2
    2
    3
    4
    4
    5
    6
    8
    33
    45
    55
    [root@localhost mnt]# sort -r  hello ##倒序排序,默认只排第一位的数字
    8
    6
    55
    5
    45
    4
    4
    33
    3
    2
    2
    1
    [root@localhost mnt]# sort -nr  hello ##倒叙排序
    55
    45
    33
    8
    6
    5
    4
    4
    3
    2
    2
    1
    [root@localhost mnt]# sort -nr -u  hello  ##倒叙排序,删除重复的项
    55
    45
    33
    8
    6
    5
    4
    3
    2
    1
    [root@localhost mnt]# sort -nr  hello   -o  file  ##倒序排序输出到file文件
    [root@localhost mnt]# cat file  ##查看文件
    55
    45
    33
    8
    6
    5
    4
    4
    3
    2
    2
    1
    
    [root@localhost mnt]# vim hello 
    [root@localhost mnt]# cat hello 
    [root@localhost mnt]# sort  -t  :  -k  2 -n hello 

    这里写图片描述
    4.uniq命令
    对重复字符做相应的处理

    • uniq -u 显示唯一的行
    • uniq -d 显示重复的行
    • uniq -c 每行显示一次并统计重复次数
    [root@localhost mnt]# vim hello 
    [root@localhost mnt]# cat hello 
    

    这里写图片描述

    [root@localhost mnt]# sort -n  hello |uniq  -c
    

    这里写图片描述

    [root@localhost mnt]# sort -n  hello |uniq  -d  ##将文件正序排列,显示重复的数字
    [root@localhost mnt]# sort -n  hello |uniq  -u  ##将文件正序排列,显示不重复的数字
    

    这里写图片描述
    5.&&和||运算符
    && 用来执行条件成立后执行的命令,|| 用来执行条件不成立后执行的命令

    [root@localhost mnt]# ping -c1 -w1  172.25.254.62  &> /dev/null && echo this is up|| echo  this  is  down
    this is up
    ## -c代表次数   -w代表等待时间

    编写脚本判断ip是否存在

    [root@localhost mnt]# vim   ip_check.sh
    #!/bin/bash
    [ -z "$1" ] &&{
            echo please give me a ipaddress!!
            exit 1
    }
    ping -c1 -w1 $1 &>  /dev/null  &&{
            echo "$1 is up"
    }||{
            echo "$1 is down"
    }   

    这里写图片描述
    执行脚本:

    [root@localhost mnt]# sh  ip_check.sh 
    please give me a ipaddress!!
    [root@localhost mnt]# sh  ip_check.sh 172.25.254.62
    172.25.254.62 is up
    [root@localhost mnt]# sh  ip_check.sh 172.25.254.5
    172.25.254.5 is down
    

    6.test命令
    test 命令和[ ]等同
    test “A==B” 等同 [ “A==B” ]
    [ “A=B” ]等于
    [ “A!=B” ]不等于
    [ “AeqB” ] 等于
    [ “AneB” ] 不等于
    [ “AleB” ] 小于等于
    [ “AltB” ] 小于
    [ “AgeB” ] 大于等于
    [ “AgtB” ] 大于
    [ “AneB” -a “AgtB” ] ne表示不等于,a表示and都满足
    [ “AneB” -o “AgtB” ] o表示or至少满足一个
    [ -z “A][nA” ] 表示值不为空
    [ “file1” -ef “file2” ] ef 表示节点是否相同
    [ “file1” -nt “file2” ] 表示new,file1是否比file2文件新
    [ “file1” -ot “file2” ] 表示old,file1是否比file2文件老
    [-e “file”] 文件是否存在
    [-f “file”] 文件是否为普通文件
    [-L “file”] 文件是否为符号链接
    [-S “file”] 文件是否为套接字
    [-b “file”] 文件是否为块设备
    [-d “file”] 文件是否为目录
    [-c “file”] 文件是否为特殊文件

    判断两个数字是否相等

    [root@localhost mnt]# a=1
    [root@localhost mnt]# b=2
    [root@localhost mnt]# [ "$a" == "$b" ] && echo yes || echo no
    no
    [root@localhost mnt]# test "$a" == "$b" && echo yes ||echo no
    no
    

    判断节点数是否相等

    [root@localhost mnt]# touch file
    [root@localhost mnt]# ln file  file1
    [root@localhost mnt]# ls -li *
    8842676 -rw-r--r-- 2 root root   0 Jun 15 22:04 file
    8842676 -rw-r--r-- 2 root root   0 Jun 15 22:04 file1
    [root@localhost mnt]# [ "file" -ef "file1" ] && echo yes  || echo no
    yes
    

    这里写图片描述
    判断文件的新旧

    [root@localhost mnt]# rm -rf file1
    [root@localhost mnt]# touch file1
    [root@localhost mnt]# [ "file"  -ot "file1" ] && echo yes || echo no
    yes
    [root@localhost mnt]# [ "file"  -nt "file1" ] && echo yes || echo no
    no
    

    编写脚本,输入一个数字判断是否在10以内

    [root@localhost mnt]# vim  num_check.sh
    #!/bin/bash
    [ -z "$1" ]&&{   ##$1表示输入的数字
            echo please input a number after scripts!!
            exit 1
    }
    [ "$1" -gt "0"  -a "$1" -lt  "10" ]&& { ##表示$1大于等于0并且小于等于10
            echo  "$1" is between 1~10
    }||{
            echo "$1" is not between 1~10
    }
    ~     

    这里写图片描述
    调用脚本:

    [root@localhost mnt]# sh num_check.sh 
    please input a number after scripts!!
    [root@localhost mnt]# sh num_check.sh 33
    33 is not between 1~10
    [root@localhost mnt]# sh num_check.sh 5
    5 is between 1~10
    

    编写脚本,判断文件是否存在,如果存在判断其类型

    [root@localhost mnt]# vim file_check.sh
    #!/bin/bash
    [ -z "$1" ]&& {
            echo "please input a filename after scripts!!"
            exit 1
    }
    [ -e "$1" ]||{
            echo "$1 is not exist!!"
            exit 0
    }
    [ -L "$1" ]&&{
            echo "$1 is a link"
            exit 0
    }
    [ -f "$1" ]&&{
            echo "$1 is a common file"
            exit 0
    }
    [ -b "$1" ]&&{
            echo "$1 is a block file"
    }
    

    这里写图片描述
    调用脚本:

    [root@localhost mnt]# sh file_check.sh 
    please input a filename after scripts!!
    [root@localhost mnt]# sh file_check.sh file
    file is a common file
    

    7.tr命令
    tr命令用于 大小写转换
    编写脚本,判断输入的内容和hello是否相等

    [root@localhost mnt]# vim  test.sh
    #!/bin/bash
    [ "$1" = "hello" ]&& {
            echo yes
    }||{
            echo no
    }

    脚本调用:

    [root@localhost mnt]# sh test.sh hello
    yes
    [root@localhost mnt]# sh test.sh HELLO  ##对于大写的hello不能识别
    no
    

    解决方案:

    [root@localhost mnt]# vim  test.sh
    #!/bin/bash
    WORD=$(echo $1 |tr 'A-Z' 'a-z')  ##利用变量WORD,将输入的字符从大写转换为小写
    [ "$WORD" = "hello" ]&& {
            echo yes
    }||{
            echo no
    }
    

    这里写图片描述
    脚本调用:

    [root@localhost mnt]# sh test.sh hello
    yes
    [root@localhost mnt]# sh test.sh HELLO
    yes
    

    五、用脚本建立用户

    基本思路:

    1、查看脚本后所跟字符是不是两串
    2、检测第一串字符是不是用户
    3、建立不存在的用户并设定密码
    [root@localhost mnt]# vim  user_create.sh
    #!/bin/bash
    [ "$#" -eq "2" ]||{
            echo "please input a username and password after script!!"
            exit 1
    }
    Check_User=`getent passwd $1`
    [ -n  "$Check_User" ] &&{
            echo $1 is exist!!
            exit 1
    }
    useradd $1
    echo $2 |passwd --stdin $1
    ~         

    这里写图片描述
    脚本调用:

    [root@localhost mnt]# sh user_create.sh  
    please input a username and password after script!!
    [root@localhost mnt]# sh user_create.sh  student 123
    student is exist!!
    [root@localhost mnt]# sh user_create.sh  linux 123
    Changing password for user linux.
    passwd: all authentication tokens updated successfully.
    [root@localhost mnt]# su - linux
    [linux@localhost ~]$ 
    
    展开全文
  • Shell 脚本常用命令

    千次阅读 2019-07-31 19:32:50
    Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook。在工作过程中整理了一下,贴在这里已备查看。 1 Shell中的特殊符号 1.1 $ 美元符号。用来表示变量的值。如变量...

    Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook。在工作过程中整理了一下,贴在这里已备查看。

     

    1           Shell中的特殊符号

    1.1           $  美元符号。用来表示变量的值。如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。

    1.2          #  井号。除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中,从#号开始的部分就不执行了。

    1.3           “”  双引号。shell不会将一对双引号之间的文本中的大多数特殊字符进行解释,如#不再是注释的开头,它只表示一个井号“#”。但$仍然保持特殊含义。(在双引号中的$加变量名,即:$PARAM_NAME,依然会转换成变量的值。)

    1.3.1     双引号对于某些特殊符号是不起作用的, 例如:”,$,\,`(反引号)

    1.3.2     双引号和单引号不能嵌套。即:echo ‘””’  输出””,  echo “’’” 输出’’

    1.4           ‘’  单引号。shell不会将一对单引号之间的任何字符做特殊解释。(在双引号中的$加变量名,即:$PARAM_NAME,不会转换成变量的值。)

    1.4.1     echo “$HOME”    (结果:/home/xiongguoan)

    1.5          ``  倒引号。命令替换。在倒引号内部的shell命令首先被执行,其结果输出代替用倒引号括起来的文本,不过特殊字符会被shell解释。

    1.5.1     echo ‘$HOME’    (结果:$HOME)

    1.6          \  斜杠。用来去掉在shell解释中字符的特殊含义。在文本中,跟在\后面的一个字符不会被shell特殊解释,但其余的不受影响。

    1.7          []中括号, 主要是用来测试条件的,通常放在if语句的后面。 (不过还是不太明白),但是中括号本身不会在测试语句执行后消失。

    1.7.1     echo [$HOME]   (结果:出现错误)

    1.7.2     echo [$HOME ]   (结果:[/home/xiongguoan ]) (注意:HOME后面有空格哦。)

    1.7.3     echo [$HOME –eq ‘/xiong’]  (结果:[/home/xiongguoan –eq /xiong])

     

    1.8          {}大括号,主要是和$符号配合,作为字符串连接来使用

    1.8.1     echo ${HOME}ismydir   (结果:/home/xiongguoanismydir)

     

    2           预定义的变量

    2.1          特殊变量

     

    $      shell变量名的开始,如$var

    |      管道,将标准输出转到下一个命令的标准输入

    $#     记录传递给Shell的自变量个数

    #      注释开始

    &      在后台执行一个进程

    ?     匹配一个字符

    *      匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)

    $-     使用set及执行时传递给shell的标志位

    $!     最后一个子进程的进程号 

    $?     取最近一次命令执行后的退出状态(返回码)

    $*     传递给shell script的参数

    $@     所有参数,个别的用双引号括起来

    $0     当前shell的名字

    $n     (n:1-) 位置参数

    $$     进程标识号(Process Identifier Number, PID)

    >      输出重定向

      <      输入重定向

      >>      输出重定向(追加方式)

      []     列出字符变化范围,如[a-z]

     

     

    2.2          代值变量

     

    * 任意字符串 

    ? 一个任意字符 

    [abc] a, b, c三者中之一 

    [a-n] 从a到n的任一字符 

     

     

    2.3          特殊字符的表达

     

    \b 退回  
    \c 打印一行时没有换行符 这个我们经常会用到  
    \f 换页  
    \r 回车  
    \t 制表  
    \v 垂直制表  
    \\ 反斜线本身 

     

    2.4          其他字符

    2.4.1     分号

    ; 表示一行结束

    2.4.2     圆括号

    () 表示在新的子shell中执行括号内的命令(这样可以不改变当前shell的状态。)

    但是圆括号在单/双引号内失去作用,只作为普通字符。

    2.4.3     花括号

    2.4.3.1    分割命令的用法

    与圆括号相似,但是:1. 花括号内的命令在当前shell中执行;2.花括号必须作为命令的第一个字符出现。

    2.4.3.2    引用变量的用法

    在$后面,表示变量名的开始和结束

     

    2.4.4     方括号

    相当与test命令,用来执行测试条件,通常用在需要判断条件的语句后面,例如:if,while等等。

     

     

    3           设置变量

    3.1          格式:VARNAME=value (i.e. PARAM=’hello’)

    3.2          注意:

    3.2.1     等号的前后不能有空格

    3.2.2     如果变量的值是一个命令的执行结果,请加上反引号(`)。

     

    4           引用变量

    4.1          $VARNAME

    4.1.1     e.i.  echo $HOME   (结果:/home/xiongguoan)

    4.2          变量默认值

    4.2.1     在引用一个变量的时候可以设定默认值。如果在此之前,该变量已经设定了值,则此默认值无效。如果此时变量没有被设定值,则使用此默认值(但是没有改变此变量的值)。

    4.2.2     echo Hello ${UNAME:-there}     #其中there是UNAME的默认值

    4.2.3     其他关于默认值与判读变量的方法:

     

    利用大括号表示变量替换

    表示形式

    说明

    ${VARIABLE}

    基本变量替换。大括号限定变量名的开始和结束

    ${VARIABLE:-DEFAULT}

    如果VARIABLE没有值,则这种表示形式返回DEFAULT的值

    ${VARIABLE:=DEFAULT}

    如果VARIABLE没有值,则这种表达形式返回DEFAULT的值。另外,如果VARIABLE没有设置,则把DEFAULT的值赋予它

    ${VARIABLE:+VALUE}

    如果VARIABLE被设置,则这种表示形式返回VALUE;否则,返回一个空串

    ${# VARIABLE}

    这种表示形式返回VARIABLE值的长度,除非VARIABLE是* 或者@在为*或者@的特殊情况下,则返回$@所表示的元素的个数。要记住,$ @保存传给该脚本的参数清单

    ${VARIABLE:?MESSAGE}

    如果VARIABLE没有值,则这种表示形式返回MESSAGE的值。Shell也显示出VARIABLE的名字,所以这种形式对捕获得错误很有用

     

     

    4.2.4     注意:

    4.2.4.1    使用${VALIABLE:?MESSAGE},如果发现此变量此时没有值,则脚本停止运行并显示行号和变量名称。 主要用于调试。

    4.2.4.2     

     

    5           位置变量

    5.1          使用$1,$2,$3…$9,${10},${11}…来代表输入的参数。其中$0代表被执行的命令或者脚本的名字。$1,$2…代表输入的第1,2…个参数

    5.2          例子:

    # cat count.sh#!/bin/sh

    A=$1             # 将位置$1的数值读入,并赋给变量A

    B=$2             # 将位置$2的数值读入,并赋给变量B

    C=$[$A+$B]       # 将变量A与B的值相加,将结果赋给C

    echo $C          # 显示C的数值

     

    结果:

    # ./count.sh  3  6

    9

    # ./count.sh 34  28

    62

    5.3          $@和$*代表参数的列表,$#代表参数的数量 (不知道$@和$*之间的差别)

     

     

    6           运算符和优先级

     

    Shell运算符和它们的优先级顺序

    级别

    运算符

    说明

    13

    -, +

    单目负、单目正

    12

    !, ~

    逻辑非、按位取反或补码

    11

    * , / , %

    乘、除、取模

    10

    +, -

    加、减

    9

    << , >>

    按位左移、按位右移

    8

    < =, > =,  < , >

    小于或等于、大于或等于、小于、大于

    7

    = = , ! =

    等于、不等于

    6

    &

    按位与

    5

    ^

    按位异或

    4

     |

    按位或

    3

    &&

    逻辑与

    2

    | |

    逻辑或

    1

    =, + =, - =, * =, /=, % =, & =, ^ =, | =, << =, >> =

    赋值、运算且赋值

     

     

     

    7           source / export / let / unset

    7.1          source

    7.1.1     正常情况下,脚本中执行的参数设置只能影响到shell脚本本身的执行环境,不能影响到调用此shell的脚本。

    7.1.2     使用source命令执行脚本,可以让脚本影响到父shell的环境(即调用此shell的当前shell)。

    7.1.3     例如:source env.sh

    7.2          export

    7.2.1     在bash下,使用export建立环境变量后,会影响到子shell脚本和当前shell的环境变量

    7.3          unset

    7.3.1     删除环境变量

    7.3.2     i.e.

    #export newval=1

    #echo $newval

    1

    #unset newval

    #echo $newval

        (ß此处为空行,newval已经被删除)

    7.4          let

    7.4.1     在bash中只用此命令可以建立一个临时的变量,此变量不会影响到子shell

     

    8            逻辑判断

    8.1          if

    8.1.1     单格式与嵌套

     

    if 条件表达式  
    then #当条件为真时执行以下语句  
    命令列表  
    else #为假时执行以下语句  
    命令列表  
    fi

     

    if 语句也可以嵌套使用  

    if 条件表达式1  
    then  
    if 条件表达式2  
    then  
    命令列表  
    else  
    if 条件表达式3  
    then  
    命令列表  
    else  
    命令列表  
    fi  
    fi  
    else  
    命令列表  
    fi 

     

    8.1.2     多分支格式

     

    if test -f "$1"  
    then  
    lpr $1  
    elif test -d "$1" #elif 同else if  
    then  
    (cd $1;lpr $1)  
    else  
    echo "$1不是文件或目录"  
    fi

     

    8.2          case

    8.2.1     格式

    case $newval in

    1)          #这里是可能值1

    echo 1

    ;;      #表示第一个分支结束

    2)           #这里是可能值 2

    echo 2

    ;;      #第二个分支结束

    *)      #表示其他可能值,必须在最后,否则他后面的语句无法执行

    echo unkown

    esac    #case 语句结束

    8.2.2      

    8.3          while /until

    8.3.1     格式

    while 表达式

    do

    命令列表

    done

     

    8.3.2     例如:

    Sum=0  
    i=0  
    while true #true是系统的关键词 表示真  
    do  
    i=`expr $i + 1`  
    Sum=`expr $Sum + $i`  
    if [ $i = "100" ]  
    then  
    break;  
    fi  
    done  
    echo $i $Sum  
    最后这个程序显示的是 100 5050 

     

    下面将这个程序再改动一下  


    Sum=0  
    i=0  
    while [ $i != "100" ]  
    do  
    i=`expr $i + 1`  
    Sum=`expr $Sum + $i`  
    done  
    echo $i $Sum  

    改动后的程序运算结果和上面是一样 但程序比上面的要简练  

    在这个循环中还可以以until做为测试条件 它正好与while测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子.  


    Sum=0  
    i=0  
    until [ $i = "100" ]  
    do  
    i=`expr $i + 1`  
    Sum=`expr $Sum + $i`  
    done  
    echo $i $Sum  
    当i不等于100时循环 就是当条件为假时循环,否则就退出,而第一个例子是当i不等于100  
    时循环,也就是测试条件为真时循环. 

     

    8.4          for

    8.4.1     枚举用法

    8.4.1.1    格式

     

     

    for 变量 in 名字列表  
    do  
    命令列表  
    done 

     

    8.4.1.2    格式

    for n in {1..10}

    do

    echo $n

    done

     

    for letter in a b c d e;

    do

    echo $letter

    done

     

     

    8.4.2     文件用法

     

    8.4.2.1    格式

    for file in *

    do

           echo $file

    done

     

    8.4.2.2    例子

     

    for File in a1 a2 a3 a4 a5  
    do  
    diff aa/$File bb/$File  
    done 

     

     

    8.4.3     累加格式

    for (( i=1;$i<10;i++))

    do

    echo $i

    done

     

    for(( i=1;$i<10;i=$[$i+1’ ])

    do

    echo $i

    done

    8.4.4      

    8.5          其他循环控制语句

    break 命令不执行当前循环体内break下面的语句从当前循环退出.  
    continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行.

     

    8.6          逻辑判断的表达

     

    一、判断文件的属性  

    格式:-操作符 filename  
    -e 文件存在返回1, 否则返回0  
    -r 文件可读返回1,否则返回0  
    -w 文件可写返回1,否则返回0  
    -x 文件可执行返回1,否则返回0  
    -o 文件属于用户本人返回1, 否则返回0  
    -z 文件长度为0返回1, 否则返回0.  
    -f 文件为普通文件返回1, 否则返回0  
    -d 文件为目录文件时返回1, 否则返回0  

    二、测试字符串  
    字符串1 = 字符串2 当两个字串相等时为真  
    字符串1 != 字符串2 当两个字串不等时为真  
    -n 字符串      当字符串的长度大于0时为真  
    -z 字符串      当字符串的长度为0时为真  
    字符串       当串字符串为非空时为真  

    三、测试两个整数关系  
    数字1 -eq 数字2     两数相等为真  
    数字1 -ne 数字2     两数不等为真  
    数字1 -gt 数字2     数字1大于数字2为真  
    数字1 -ge 数字2     数字1大于等于数字2为真  
    数字1 -lt 数字2     数字1小于数字2为真  
    数字1 -le 数字2     数字1小于等于数字2为真  

    四、逻辑测试  
    -a         与  
    -o        或  
    !        非 

     

    9           shell中的表达式

    9.1          shell 输出重定向

    9.1.1     管道  |

    就管道符前的命令的输出作为管道符后的命令的输入。

     

    ls | grep ‘.txt’

    将ls的输出作为grep 的输入。 grep从输入中找出所有包含.txt的行。

     

    9.1.2     输出  >

    将右尖括号前的命令的输入重定向到尖括号后的文件中。

     

    例如:

    ls *.sh > list.txt

    将当前目录下所有末尾名为sh的文件的列表写入到list.txt

     

    9.1.3     输入 <

    将左箭头后面的文件作为左箭头前的命令的输入。

    例如:

    grep “a” < test.sh

    将test.sh中找到所有包含a的行

     

    9.1.4     错误输出重定向

    默认bash有3个标准输入输出设备。

    0 标准输入

    1 标准输出

    2错误输出

     

    如果执行脚本的时候发生错误,会输出到2上。

    要想就将错误的输出也输出在标准输出上,需要重定向。

    例如:

    ./test.sh > a.log 2>&1

    后面2>&1就是将标准错误的输出重定向到标准输出上。

     

    9.2          tee

    9.2.1     将此命令的输入分叉,一支输出到屏幕一支可以重定向到其他位置。

    例如: ./test.sh | tee >a.txt 2>&1

    运行test.sh,通过tee输出到a.txt,同时屏幕上可以看到输出。并且将错误输出重定向到标准输出( 2>&1 )

    9.3          cpio

    9.3.1     文件或目录打包

    9.3.1.1    含子目录打包

      find . -name '*.sh' | cpio -o > shell.cpio

      将当前目录及其子目录下的sh文件打包成一个文件库为shell.cpio。 

    9.3.1.2    不含子目录的打包

    ls *.sh | cpio -o > shell.cpio

      将当前目录下的sh文件(不含子目录)打包成一个文件库为shell.cpio。 

    9.3.2      压缩

    文件打包完成后,即可用Unix中的compress命令(/usr/bin下)压缩打包文件。对一般的文本文件,压缩率较高,可达81%。

    例如:compress shell.cpio则将文件库压缩为shell.cpio.Z(自动添加.Z并删除shell.cpio )。 

    9.3.3      解压

    uncompress shell.cpio.Z则自动还原为shell.cpio。 

    9.3.4      解包展开

    将按原目录结构解包展开到当前所在目录下。若以相对路径打包的,当解包展开时,也是以相对路径存放展开的文件数据;若以绝对路径打包的,当解包展开时,也是以绝对路径存放展开的文件数据。因此注意若为相对路径,应先进入相应的目录下再展开。 

     

     cd /u1

     cpio –id < shell.cpio 解压到当期目录。 

     cpio –iud < shell.cpio则文件若存在将被覆盖,即强制覆盖。 

     cpio –id < shell.cpio env.sh 解压缩env.sh

    9.3.5      显示包内的文件

      cpio –it < shell.cpio  

     

    9.4          exec

    9.4.1     将此命令后的参数作为命令在当前的shell中执行,当前的shell或者脚本不在执行。

    例如: exec ls

    当前进程替换为ls,执行结束后就退出了。

    例如:在a.sh 中包含

    exec b.sh 则当a.sh 执行到此句后,被b.sh替换,a.sh中此句后的语句不会再被执行。

     

    9.5          fork

    9.5.1     将此命令的参数,新建一个进程来执行

     

    例如:在a.sh 中包含

    fork b.sh 则当a.sh 执行到此句后,被b.sh替换,a.sh中此句后的语句继续执行。b.sh在新的进程中同时执行。

     

    9.6          expr

    9.6.1     expr argument operator argument

    9.6.2     一般用于整数的运算。 例如:

    #set newval=1

    #echo $newval

    1

    #set newval=`expr $newval + 1`

    #echo $newval

    2

    #set newval=$newval+1

    #echo $newval

    2+1

     

    9.7          test

    9.7.1     测试,通常用在需要判断的语句后面,例如:if,while,等等。

    9.7.2     很多时候可以和中括号[]互换,我不知道区别是什么。

    9.7.3     例子:

    i=1

    if test”$ i” == “1”

    then

    echo true

    else

    echo false

    fi

     

    9.8          exit

    退出当前的shell,执行结果可以在shell中用$?查看

    例如:exit 2

    9.9          read

    从标准输入读取数据。

    例: 
    $ read var1 var2 var3 
    Hello my friends 
    $ echo $var1 $var2 $var3 
    Hello my friends 
    $ echo $var1 
    Hello

     

    9.10       shift

    9.10.1 每次调用的时候,将参数列表中的第一个参数去掉。这样可以循环得到第一个参数。

    9.10.2 例子

    #cat t.sh

    sum=0

    until [ $# -eq 0 ]

    do

    echo $*

    sum=`expr $sum + $1`

    shift

    done

    echo result is: $sum

     

    #./t.sh 1 2 3

    1 2 3

    2 3

    3

     

     

    10       附件一:例子脚本

    10.1        脚本1

     

    10.2        

    11       附件二:Linux 易被遗漏的命令解析

    11.1       grep

    11.1.1 grep ‘string’ filename

    11.1.1.1e.i.: grep ‘list’ mytxt.txt 在mytxt.txt中寻找包含list字符串的所有行

    11.1.2 “-v” : 相反的。 即不包含字符串。

    11.1.2.1e.i.: grep –v ‘list’ mytxt.txt

    11.1.3 cat mytxt | grep ‘list’

    将cat mytxt作为源, 从中查找包含list字符串的行

    11.2       find

    11.2.1 -atime n : 指查找系统中最后n*24小时访问的文件;

    11.2.2 -ctime n : 指查找系统中最后n*24小时被改变状态的文件;

    11.2.3 -mtime n : 指查找系统中最后n*24小时被修改的文件。

    11.2.4 在当前目录下(包含子目录),查找所有txt文件并找出含有字符串"bin"的行
    find ./ -name "*.txt" -exec grep "bin" {} \;

    11.2.5 在当前目录下(包含子目录),删除所有txt文件
    find ./ -name "*.txt" -exec rm {} \;

     

    11.3       du

    11.3.1 显示文件的大小

    11.3.2 i.e.

    #du *.txt

    1230   myfile1.txt

    456    myfile2.txt

     

    11.4       awk

    11.4.1 提取输入中的某个参数

    11.4.2 i.e. 提取输入中每一行的第一个参数

    #echo `du *.txt | awk ‘{print $1}’`

    1230 456

    提取子字符串

    #echo `du *.bin | awk '{print substr($1,2,3)}'`

     

    11.5       前后台运行

    11.5.1 将某个程序在后台启动起来,只需要在命令的最后加上 & 符号。

    例如: ./test.sh &

     

    11.5.2 将当前正在运行的程序切换到后台

    11.5.2.1当按下^z的时候,当前的应用程序就会切换到后台,但是此时的状态是停止的状态。

    11.5.2.2使用jobs命令可以看到当前在后台运行的程序的列表。

    例如:jobs

    [1]+ stopped top

    [2]+stopped find | grep *.txt > a.log

     

    11.5.2.3使用bg命令可以将某个后台程序继续运行。

    #bg %2

    #jobs

    [1]+ stopped top

    [2]+ Running find | grep *.txt > a.log

     

    11.5.3 将后台运行的程序切回到前台

    #fg %2

    将find 命令切回到前台

    11.6       shell的执行选项

     

    -n 测试shell script语法结构,只读取shell script但不执行 
    -x 进入跟踪方式,显示所执行的每一条命令,用于调度 
    -a Tag all variables for export 
    -c "string" 从strings中读取命令 
    -e 非交互方式 
    -f 关闭shell文件名产生功能 
    -h locate and remember functions as defind 
    -i 交互方式 
    -k 从环境变量中读取命令的参数 
    -r 限制方式 
    -s 从标准输入读取命令 
    -t 执行命令后退出(shell exits) 
    -u 在替换中如使用未定义变量为错误 
    -v verbose,显示shell输入行

     

    11.7       alias

    建立别名

    alias dir ls

    11.8        xargs

    执行本命令的第一个参数,并将xargs的输入作为被执行命令的参数

    例如:

    find . -name '*.c' | xargs cat

    将本目录及其子目录下所有的C文件使用cat命令显示其内容。

     

    12       附件三:Bash中影响环境变量的命令

     

    Shell有若干以变量为工作对象的命令,其中有些命令似乎重复了。例如,可以用declare、export和typeset命令来创建全局(或转出)的变量。typeset命令是declare的同义词。

     

    Declare 命令

     

    语法:

    declare [options] [name [= value]]

     

    摘要:

    用于显示或设置变量。

    declare命令使用四个选项:

    -f   只显示函数名

    -r   创建只读变量。只读变量不能被赋予新值或取消设置,除非使用declare或者typeset命令

    -x   创建转出(exported)变量

    -i   创建整数变量。如果我们想给一个整数变量赋予文本值,实际上是赋予0使用+ 代替-,可以颠倒选项的含义。

     

    如果没有使用参数,则declare显示当前已定义变量和函数的列表。让我们关注一下-r选项:

     

    $ declare  –r  title=" paradise Lost"

    $ title = " Xenogenesis"

    bash: title: read-only variable

    $ declare title= " Xenogenesis"

    $ echo $title

    Xecogenesis

    $ typeset title = " The Longing Ring”

    $ echo $title

    The Longing Ring

     

    这个示例表明,只有declare或typeset命令可以修改只读变量的值。

     

     

     

    export命令

     

    语法:

     export [options] [name [= value]]

    摘要:

    用于创建传给子Shell的变量。

    export命令使用四个选项:

    --   表明选项结束。所有后续参数都是实参

    -f   表明在“名-值”对中的名字是函数名

    -n   把全局变量转换成局部变量。换句话说,命名的变量不再传给子Shell

    -p   显示全局变量列表

     

    如果没有用参数,则假定是一个-p参数,并且显示出全局变量的列表:

     

    $ export

    declare –x ENV = "/home/medined/ . bashrc"

    declare –x HISTFILESIZE = "1000"

    declare –xi numPages = "314"

    declare –xr title = "The Longing Ring"

    declare –xri numChapters = "32"

     

    这种显示的一个有趣的特性是,它告诉我们哪些变量只能是整数、是只读的,或者二者皆可。

     

    let命令

     

    语法:

    let expression

    摘要:

    用于求整数表达式的值。

     

    let命令计算整数表达式的值。它通常用来增加计数器变量的值,如例5-9所示。

     

    例5-9 let——使用let命令

    # ! /bin/bash

    count=1

    for element in $@

    do

       echo " $element is element $count"

       let count+=1

    done

     

    下面是这个脚本运行结果示例:

    $ chmod + x let

    $ . /let one two three

    one is element 1

    two is element 2

    three is element 3

     

    注意:如果我们习惯在表达式中使用空格,那么要用双引号把表达式括起来,如:

    let "count + =1"

    否则会导致语句错误。

     

    local 命令

     

    语法:

           local [name [= value]]

    摘要:

           用于创建不能传给子Shell的变量。这个命令仅在过程内部有效。

     

    简单说来,local命令创建的变量不能被子Shell存取。因此,只能在函数内部使用local命令。我们可以在命令行或脚本中使用“变量=值”这种形式的赋值命令。如果使用local时不带实参,那么当前已定义的局部变量列表就送往标准输出显示。

     

    readonly命令

     

    语法:

           readonly [options] [name[ = value]]

    摘要:

    用于显示或者设置只读变量。

    Readonly命令使用两个选项:

    --    表明选项结束。所有后续参数都是实参

    -f    创建只读函数

     

    如果没有用参数,则readonly显示当前已定义的只读变量和函数的列表。

     

    set命令

     

    语法:

           set [--abefhkmnptuvxidCHP] [-o option] [name [= value]]

    摘要:

    用于设置或者重置各种Shell选项。

     

    set 命令可实现很多不同的功能——并非其中所有的功能都与变量有关。由于本节的其他命令重复了通过set命令可用的那些变量选项,所以这里对set命令不做详细说明。

     

    shift命令

     

    语法

    shift [n]

    摘要:

    用于移动位置变量。

     

    shift命令调整位置变量,使$3的值赋予$2,而$2的值赋予$1。当执行shift命令时,这种波动作用影响到所定义的各个位置变量。往往使用shift命令来检查过程参数的特定值——如为选项设置标志变量时。

     

    typeset命令

     

    语法:

    typeset [options] [name [= value]]

    摘要:

    用于显示或者设置变量。

     

    typeset 命令是declare命令的同义词。

     

     

    unset命令

     

    语法:

    unset [options] name [name …]

    摘要:

    用于取消变量定义。

    unset命令使用两个选项:

    --  表明选项结束,所有后续参数都是实参

    -f  创建只读函数

     

    unset命令从Shell环境中删除指定的变量和函数。注意,不能取消对PATH、IFS、PPID、PS1、PS2、UID和EUID的设置。如果我们取消RANDOM、SECONDS、LINENO或HISTCMD等变量的设置,它们就失去特有属性。

     

    原文地址:https://www.cnblogs.com/chen-lhx/p/5743438.html

    展开全文
  • shell脚本常用命令

    2017-09-18 17:05:43
    basename 1. basename 是去除目录...shell> temp=/home/temp/1.test shell> base=`basename $temp` shell> echo $base 结果为:1.test 2. dirname 是取目录 example: shell> temp=/home/temp/1.test shell
  • shell脚本命令

    2018-10-11 16:27:07
    输出的结果文件中 ./脚本.sh |tee 文件名.txt chmod +x 文件名 修改权限 有时候编译不通过,记得编码改成UNIX的,空格换行和window的不同 awk 用来从文本文件中提取字段 cat 文件名 | awk -F+分隔 ‘{...
  • shell (计算机壳层) Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一...
  • shell脚本中的awk命令

    千次阅读 2019-06-20 21:51:36
    sed命令疑难问题 sed -ri ‘/^H+/a 11111111111’ /etc/sysconfig/network 在文件里在以至少一个H开头的行追加111111111 sed -ir ‘/^H+/a 11111111111’ /etc/sysconfig/network 追加不会成功。在 /etc/...
  • shell脚本基本语法详解

    万次阅读 多人点赞 2016-09-28 20:16:04
    编写shell脚本的时候,最前面要加上一行:#!/bin/bash,因为linux里面不仅仅只有bash一个解析器,还有其它的,它们之间的语法会有一些不同,所以最好加上这一句话,告诉系统要用这个解析器。一.shell变量shell变量和...
  • shell脚本中的sed命令用法

    千次阅读 2019-06-20 21:46:26
    Shell脚本sed命令 知识要点 sed命令的工作原理 sed的常用编辑命令 sed的替换命令 sed的特殊用法 sed命令的工作原理 sed是一种支持正则表达式的交互式流编辑器(stream editor) 脚本中修改文本或者文本...
  • MV命令 mv命令可以对文件进行重命名和移动 mv ./aa.txt ./bb.txt 这个是把当前路径的aa.txt重命名成bb.txt(当前目录,而且...这个shell脚本目的是先把oss-开头的文件移动 backup文件夹,然后才执行删除命令
  • Hadoop的Shell脚本命令

    2018-11-14 15:51:05
    1、Shell 常用命令介绍 1.1 -ls 使用方法 hadoop fs -ls [-R] <args> 功能:显示文件、目录信息。 示例:hadoop fs -ls /user/hadoop/file1 1.2-mkdir 使用方法 hadoop fs -mkdir [-p] <paths> ...
  • linux系统中的shell脚本||脚本常用的命令

    万次阅读 多人点赞 2018-05-21 20:41:05
    脚本的编写 这里写代码片
  • linux--shell脚本常用脚本命令

    千次阅读 2018-06-14 22:39:03
    shell也是操作系统中的一个软件,他包含zailinux内核的外面,为了用户和内核之间的交互提供了一个接口系统中的命令用shell去解释shell接收系统回应的输出并显示其屏幕上什么是shell脚本?脚本是一种解释型语言 #...
  • 基本的bash shell命令

    千次阅读 2017-09-13 22:59:47
    大多数linux发行版的默认都是GUNbash shell,本次将介绍bash shell的一些基本特征,bashshell基本命令来操作linux文件和目录。 1.启动shell Gun bash能提供对linux系统的交互式访问,它是作为普通的程序运行的,...
  • shell脚本 http://www.92csz.com/study/linux/12.htm vim命令 https://www.cnblogs.com/yangjig/p/6014198.html shell命令: 通配符:可以使用*来匹配零个或多个字符,而用?匹配一个字符 输入输出从定向:输入...
  • 一.变量: i.变量定义: 语法: variable_name=variable_value 例如: exe_cmd="java -jar $1 -cfp $2 -lfp $3 -tn1 $4 -tn2 $5 -d $6 -cld...2)变量值为普通字符串时,使用单引号(''),值中命令是不识别的。 3)变量...
  • Linux系统Shell脚本中的echo命令

    千次阅读 2019-04-16 16:54:41
    Linux系统Shell脚本中的echo命令 echo的作用 输出字符串 格式 echo "字符串内容" 一,显示转义字符 转义字符的格式 \进行转义的操作 例如\* \" 常见的转义字符 特殊符号以外的转义,需要加上-e去开启...
  • source会在当前shell环境中执行,如果直接执行,会开启一个子shell,在子shell中进入了该目录,脚本执行完后会退出子shell回到父shell环境 2. if语句 判断文件夹是否存在: myPath="/var/log/httpd/
  • shell脚本中执行命令Shell is a command-line interpreter that allows the user to interact with the system. It is responsible for taking inputs from the user and displaying the output. Shell是一个命令行...
  • shell脚本快速执行命令

    千次阅读 2019-03-24 11:26:02
    shell脚本快速执行命令1.gnome-terminal2.基本用法3.启动后自动执行命令4.demo15.demo2 1.gnome-terminal 常用,置顶: gnome-terminal -x bash -c "子终端要执行的命令1;2;...." gnome-terminal -t "title-name" -x...
  • exit命令用于退出当前shell,在shell脚本中可以终止当前脚本执行。 常用方法: 格式:exit n 退出shell脚本,并设置退出码为n。 格式:exit 退出shell脚本,退出码为最后一个命令的退出码(即 $?)。 格式:trap ...
  • 命令行替换 (1)反引号字符(`) 示例 test=`date` !/bin/bash test=`date` echo &amp;quot;The date and time are: &amp;quot; $test (2)$()格式 示例 ...$t...
  • Shell编程(脚本)的常用命令和语句

    千次阅读 2015-07-07 20:25:47
    一些常用的Shell编程(脚本命令和语句,可以满足一般需求。
  • head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾~,看看下面的范例: ## (1) displays the first 6 ...
  • shell脚本--sed的用法

    万次阅读 多人点赞 2018-05-17 01:04:27
    sed在处理文本时是逐行读取文件内容,读匹配的行就根据指令做操作,不匹配就跳...本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。 1.sed的使用方法,调用sed 命令的语法有两种: 一.在命令...

空空如也

1 2 3 4 5 ... 20
收藏数 128,167
精华内容 51,266
关键字:

电脑开机直接到shell提示符下