一、shell简介

1、概念

    命令解释器

2、常见的shell

    bash :   linux标准的shell

    sh:早期shell,较简单

    csh ,ksh ,tcsh :是unix 中的shell

3、查看linux中支持的shell

    vi /etc/shells  

4、shell脚本

创建一个shell脚本,并打印出来


        步骤

            1、在root目录下创建目录sh;mkdir sh

            2、进入sh目录下:cd sh/

            3、查看sh目录下文件:ls

            4、创建一个shell文件命名为hello.sh并进入编辑模式:vi hello.sh

            5、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):

                                #!/bin/bash

                                echo  "hello,world!"

            6、退出编辑模式:先按esc,:wq

            脚本执行方式

                    先赋予其执行权限 :chmod 755 hello.sh

                方法一:以绝对路径执行

                                /root/sh/hello.sh

                             以相对路径执行

                                ./hello.sh

                    

                方法二:用“bash 脚本名”直接执行(脚本不需要赋予执行权限)

                    bash  hello.sh

                    

                方法三:用source命令执行,以当前默认Shell解释器执行

                

5、bash常见功能

    1)历史命令

    默认保存1000条历史命令

            vi  /etc/profile          修改环境变量配置文件,要生效,必须注销

            HISTSIZE=1000        修改默认历史命令条数

            history          查询系统历史命令

        历史命令保存文件

                ~/.bash_history

            history  -w   把内存中命令历史,保存入文件

            history  -c   清空所有的历史命

    重复历史命令

     !n   重复执行第n条命令

     !str   重复执行最后一个以str开头的命令

            上箭头 调用上面的命令

    2)别名

            alias            查看系统中生效的别名

            alias  ls='ls  --color=never'         手工设定别名,临时生效

            把别名删掉:alias ls='ls --color=tty'

        vi  ~/.bashrc              写入别名,永久生效 


3)输入输出重定向

                             #设备文件名               #文件描述符              #默认设备

        标准输入         /dev/stdin                          0                          键盘

        标准输出          /dev/stdout                       1                         显示器

        标准错误输出    /dev/stderr                       2                         显示器

    

    a)输出重定向

            把应该输出到屏幕的输出,重定向到文件。

                    >                   覆盖

                    >>                 追加               

                    ls  >  aa          覆盖到aa(解释:把ls下的文件重定向到aa,查看aa下的文件,就是ls下的文件,这就是重定向。如下图

                

                   ls  >>  aa          追加到aa  (示例如下图)   

                                   

                    ls  gdlslga  2>>aa          错误信息输出到aa        强调:错误输出,不能有空格(该命令是把错误命令追加到aa中)

                    ls  &>aa                         错误和正确都输入到aa,但是只能覆盖

                    ls  >> aa   2>>bb          正确信息输入aa,错误信息输入bb

                    ls  >>  aa   2>&1           错误和正确都输入到aa,可以追加

                    2>&1             把标准错误重定向到标准正确输出

     4)多命令顺序执行         

                1)命令1  ;  命令2 ; 命令3                      命令123顺序执行。之间没有任何关系

                2)命令1  &&  命令2                                  命令1正确执行后,命令2才会执行

                3)命令1  ||  命令2                                      命令1执行不正确,命令2才会执行

                ls aa && echo "exist" || echo "not exist!" 执行ls  aa,判断如果正确,输出“存在”。如果不存在,输出“不存在”

             

            5)管道符

        命令1  |  命令2                               命令1的执行结果,作为命令2的执行条件

                             netstat -tlun                               查询监听的端口

                                

                            netstat -tlun | grep 80               查询监听的端口号,并查看80端口是否启动。

                            ls  -l  /etc/  |  more                     分屏显示ls内容

                                    

                            ls -l /etc/ | grep yum

二 、变量 

     1、分类

            本地变量

            环境变量

            位置参数变量

            预定义变量

    2、本地变量

        1)声明

                  变量名=变量值              注意:=号左右不能有空格

                   aa=123

                                            

        2)调用

                    echo  $变量名

        3)查看变量

                    set          查看所有变量,包括环境变量和本地变量

        4)删除

                    unset  变量名

    3、变量设定规则

            1)变量以等号连接值,等号不能有空格

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

            3)变量值中有空格,用引号括起来

            4)双引号内,有特殊字符。如$

            5)单引号中特殊字符无含义

            6)在变量值中,可以使用 \ 转义符

            7)变量值可以直接调用系统命令。 ‘命令’$(命令)

            8)变量值可以累加 aa=123   aa="$aa"456   echo $aa   --->123456

                    

            9)环境变量一定设为大写

     4、环境变量

            1)声明

                    export   变量名=变量值

                    export   a

            2)查看

                    set                     查看所有变量

                    env  export        只能查看环境变量

                    declare            声明变量类型的,如果不特别声明,所有变量为字符串型

                                -i            声明为int

                                -x            声明为环境变量

            3)删除

                    unset   变量名

            4)常见环境变量

    echo  $PATH                                                        /usr/keyberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin                   系统查找命令的路径

                    PATH="$PATH":/root/shell        在系统默认路径后,追加/root/shell目录作为命令查找路径

            5)环境变量配置文件

                    /etc/profile

                    /etc/bashrc              所有用户生效

                    ~/.bashrc

                    ~/.bash_profile        只对指定用户生效

    5、位置参数变量  

位置参数变量说明
$0命令自己
$1第一个参数
$2第二个参数
............
$9第九个参数

        示例:输出位置参数变量,脚本后要接参数

#!/bin/bash
echo "the command is $0"
echo "canshu1 is $1"
echo "canshu2 is $2"

            

        步骤如下:        

                 1、创建一个shell文件命名为canshu.sh并进入编辑模式:vi canshu.sh

                 2、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):

                                #!/bin/bash

                                echo  "the command is $0"

                                echo  "canshu1 is $1"

                                echo  "canshu1 is $1"

                3、退出编辑模式:先按esc,:wq      

                4、先赋予其执行权限 :chmod 755 canshu.sh

                5、以相对路径执并赋初值1,2,3回车之后,即可看到运行结果:    ./canshu.sh 1 2 3

                6、查看canshu.sh的内容用:cat canshu.sh

                    (由于canshu.sh中第一个参数是$0,所以赋值是命令本身(./canshu.sh),其他两个变量依次赋值1,2)

    6、预定义变量

                $?           上一个命令的返回值。 如果返回值是 “0”  表示上一个命令正确执行,如果是非0,表示上一个命令没有正确执行

                    

                $#            统计命令之后的参数个数

                $*            返回所有参数

                $n            位置参数变量

                示例:输出预定义变量

#!/bin/bash
echo "canshu geshu is $#"
echo "suoyou canshu zhi is $*"
echo "$?"

            

        步骤如下:        

                 1、创建一个shell文件命名为canshu.sh并进入编辑模式:vi canshu2.sh

                 2、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):

                                #!/bin/bash

                                echo  "canshu geshu is is $#"

                                echo  "suoyou canshu zhi is $*"

                                echo  "$?"

                3、退出编辑模式:先按esc,:wq      

                4、先赋予其执行权限 :chmod 755 canshu2.sh

                5、以相对路径执并赋初值1,2,3,4,5回车之后,即可看到运行结果:    ./canshu2.sh 1 2 3 4 5

                6、查看canshu2.sh的内容用:cat canshu2.sh

    7、键盘读取命令

            read   -p             "提示信息"    -t    等待时间       变量名

            示例:通过read读入变量值

#!/bin/bash
read -p "please inut numl:" -t 30 test1
read -p "input num2:" -t 30 test2
sum=$(($test1+$test2))
echo "num1+num2=$sum"
                

          步骤如下:        

                 1、创建一个shell文件命名为canshu.sh并进入编辑模式:vi read.sh

                 2、进入编辑模式后,按如下格式输入:(其中第一行是必须输入的,echo代表输出格式):

                                #!/bin/bash

                                read -p  "please input num1:" -t 30 test1

                                read -p  "input num2:" -t 30 test2

                                sum=$(($test1+$test2))

                                echo  "num1+num2=$sum"

                3、退出编辑模式:先按esc,:wq      

                4、先赋予其执行权限 :chmod 755 read.sh

                5、以相对路径执:    ./read.sh 

                6、可以看到提示,并键盘输入

                7、查看read.sh的内容用:cat read.sh

    8、数值运算

            

            变量值默认都是字符串型,要想进行数值运算,以下三种任选一种:

            1)declare  方法

                    num1=12

                    num2=14

                    declare  -i  sum=$num1+$num2

            2)sum=$(($num1+$num2))

            3)sum=$(expr $num1 + $num2)      (注意+号左右两边必须空格)

                

            4)运算符

                    +      -        \*       /       %取余

三、shell中常用命令

    1、行提取命令 grep

            选项:    -v        反向选择

                          -n        提取时,显示行号

                

        举例:(用正则表达式匹配)

                grep  “[^a-z]hen” test.txt               (在文档test.txt中匹配hen前不是小写字母的行匹配)注:和开头没有关系

                grep    "\.$"  test.txt                           (在文档test.txt中匹配以.结尾的行)

                grep    “^[^A-Za-z]” test.txt            (在test.txt中匹配不以字母开头的行)注:所有字母不能这样写A-z

                grep    "oo*"   test.txt                            (匹配最少一个o)

                grep    "^$"   test.txt                            (匹配空白行^代表行首,$代表行尾)

    2、列提取命令

            1)cut   格式:

                    cut  -d    “分隔符”    -f      提取列    文件名

                    

                   比如:

                            cat  /etc/passwd  |  grep "/bin/bash"  | cut -d  ":"  -f  1,3  (提取passwd文件中可以登录的用户的用户名和UID) (具体意思是:cat /etc/passwd是把passwd打开,| 表示管道符,grep "/bin/bash"是把打开的passwd中提取/bin/bash的行,在行的基础上提取第1,3列,cut -d  ":"  -f  1,3

             2)awk

                    awk  '条件   {动作}'

                last | awk '{printf  $1 "\t"  $3  "\n"}'            (提取last显示结果的第一和第三列,其中last表示最后登录的信息)

            

            \t        tab键

            \n        换行

             \r        回车

            再比如:last中提取包含ip的行,在行中提取第一和第三列

                    last | grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"|awk '{printf $1 "\t" $3 "\n"}'

                

             awk 内置变量            FS指定分隔符

            more  /etc/passwd   |    awk   'BEGIN  {FS=":"}    {printf  $1  "\t"  $3   "\n"}'

            读取passwd文件,以“:”为分隔符,截取第一和第三列

            BEGIN    在截取前使分隔符生效。如果没有BEGIN,那么第一行自定义的分隔符不生效

    3、echo命令

            echo    -e    "输出内容"

                    -e    识别格式化打印内容

            echo    -e    “1\t2\t3”            打印tab键

            echo    -e    "\e[1;31m  this is red text  \e[0m"        输出红色字体

            

                    \e[            格式(以其开头,并以其为结尾)

                    1;31m        指定颜色

                    0m            恢复颜色(重置)

                    30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m青色,37m=白色

            echo    -e    "\e[1;42m  background  \e[0m"        

                

                    背景颜色:40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=洋红,46=青色,47=白色

            

            实例:echo输出的小游戏

                        cat    -A     文件名                (显示文件,包括隐藏字符)

                        取消dos文档的回车符,有两种办法

                        1)dos2unix    文档名

                        2)vi    -b    文档

                                :%s/^M//g       ^M使用ctrl+v+m输入


            数据备份: 

#!/bin/bash
DAY=`date +%Y%m%d`
#定义日期变量
SIZE='du -sh /var/lib/mysql'
#定义mysql目录大学的变量
echo "Date:$DAY">>/tmp/dbinfo.txt
#把日期输入信息文档
echo "Date Size:$SIZE">>/tmp/dbinfo.txt
#把大学输入信息文档
cd /opt/dbbak
#切换目录
tar zcvf mysqlbak-${DAY}.tar.gz /var/lib/mysql/tmp/dbinfo.txt
#打包备份mysql目录,同时打包信息文档
rm -f /tmp/dbinfo.txt

下接shell编程(二)


Logo

更多推荐