Shell- shell基础知识

写在前面:只接触过一点点shell,这次修改脚本都是一点点百度,下面记录下自己梳理的内容。


      SHELL 是用C语言编写的程序,又叫命令行的解释器。它将输入的命令加以解释后传给系统,为用户和内核之间的交互提供了一个接口。原理:当用户下达指令给操作系统的时候,实际上是把命令告诉shell,经过shell解释、处理后让内核做出相应的动作。而系统的回应和输出的信息也由shell处理,然后显示在用户的屏幕上。

      bash的特点:使用键盘上下键可以切换输入的历史命令;使用tab键可以自动补全命令;使用命令--help或者man可以查看命令的帮助信息。

一 输入与输出

1)输入输出

      标准输入         stdin     代码   0     

      标准输出         stdout   代码   1   

      标准错误输出  stderr    代码    2

2)输出重定向

      重定向符号: > 覆盖重定向                 >> 追加重定向               < 输入重定向

      cat   f1     1>  f2                                         //将cat命令的标准输出重定向到f2文件中

      cat   /etc   2>  f3                                        //将cat命令的标准错误输出重定向到f3文件中

      cat   f1    &>  f4  或 cat  f1  >  f4   2>&1       //将cat命令的输出,包括标准输出和标准错误输出,重定向到f4文件中

例:常用于忽略命令的输出

      ping  127.0.0.1  &>  /dev/null  或  ping  127.0.0.1 > /dev/null   2>&1         //输出结果不会显示,且需要Ctrl+C退出

二 环境变量

1 环境变量控制文件

1)/etc/profile 设置用户工作环境,

     /etc/bashrc 设置系统功能、函数、别名。

     这两个是系统环境变量配置文件。

2)~/.bash_profile 用户登录时执行该文件,设置用户的使用环境;

     ~/.bashrc 用户登录或打开新的SHELL时执行该文件;

     ~/.bash_logout 用户退出SHELL时执行该文件。以上文件均为个人环境变量配置文件。

     注:当系统文件与个人配置文件发生冲突时以个人配置文件为主

2 重要的环境变量

      系统内存在着一些变量,通过给这些变量赋值可以控制用户的工作环境,这就叫环境变量。以下是环境变量及其说明:

LOGNAME  登陆名,也就是账户名                   PATH  命令搜索路径

PS1 命令提示符                                              PWD 用户的当前目录        

SHELL 用户的shell类型                                   TERM 终端类型         

HOME 用户主目录的位置,通常是/home/用户名

1)查看所有的环境变量:        set           //包括系统和个人的环境变量

   查看各选项的功能是否开启: set  -o     //开启set  -o  vi 关闭set  +o  vi(了解)

   查看系统环境变量:              env         //environment

2)设置环境变量

    临时设置:export  环境变量名=值        //例 export   a=1

    永久设置:vim  /etc/profile  ,在文件末尾添加  export  环境变量名=值,保存退出后source   /etc/profile

例:#vim  /etc/profile   在文件末尾添加 export  LANG=en_US,UTF-8  

      然后  source  /etc/profile             //将系统语言改成了英文

3)查看某环境变量的 值: echo   $环境变量名

4) PS1 控制当前SHELL的命令提示符显示的内容

     查看PS1: echo  $PS1             修改PS1: PS1=新的值

例如:PS1=“{\u@.@\h  \w}\\$”    再改回来 PS1=”{\u@\h \W}\\$”

5)PATH 当前系统命令所在路径

      查看PATH: echo  $PATH           修改PATH: PATH=新的值

      例如:PATH=$PATH:/root     //在PATH中添加路径root

      注1:Linux中,PATH环境变量中各个目录间使用冒号“:”隔开。Windows中,开始——右键我的电脑——属性——高级——环境变量——系统变量——path,Windows中PATH环境变量中各个目录间使用分号“;”隔开

      注2:编写一个1.sh文件脚本,把该脚本放在PATH某个目录的路径下就可以直接输入命令 #1.sh直接运行该脚本。或者把1.sh所在的目录添加到PATH下,向上面的例子一样,这样直接输入#1.sh也能运行脚本

6)子shell

      开启子SHELL:  bash                          关闭子SHELL:  exit

三 正则表达式

1 常用表达

  \n 换行符                                                \t 制表符          

  $ 匹配字符串的结尾位置                          ^ 匹配字符串的开始位置                          

  .匹配除换行符以外的所有单字符

()表示一个子表达式的开始和结束位置     *匹配前面的子表达式0次或多次

  + 匹配前面的子表达式1次或多次              ?匹配前面的字表达式0次或1次

2 举例说明

    dg+ 可匹配dg以及dgg、dgggg等         dg? 匹配dg、dga、dgb等

    dg*  可匹配dg及dga,dgaaa等              dg{2} 匹配dgg,不能匹配dg

    dg{2,} 能匹配dgg,dggg,dgggg等          d{2,4}能匹配dd,ddd,dddd

    echo {Sunday,Monday}.log                         //显示包含Sunday,Monday}.log的字串

    echo  file{1..5}.txt                                        //显示以file开头,第5个字符由1至5,且后缀为.txt的字串

    echo  file{a,b}{1,2}.txt                                //显示以file开头,5,6个字符为a1,a2,b1,b2且后缀为.txt的字串

    echo file{a{1,2},b,c}.txt             //显示以file开头,第5,6个字符为a1,a2及第5个字符为b,c且后缀为.txt的字串

四 历史命令

1)查看历史命令:history  

   history记录历史命令的条数由环境变量HISTSIZE决定,默认是1000条   

   !n  ——执行历史的第N条指令,n为history中的第N条指令

   !!  ——执行最后一次执行的命令        !str——执行最后以str开头的命令

2)Ctrl+r——匹配输入过的命令,在命令行模式下输入Ctrl+r即可

3)快速移动光标——字符操作快捷键

   将光标移动到当前命令行的头部Ctrl+a       将光标移动到当前命令的尾部Ctrl+e

   清除光标前至头部的字符Ctrl+u             清除光标前至尾部的字符Ctrl+k

五 命令分隔符

“;”分号,命令依次执行                                                  //优先级最低

“&&”前面命令执行成功后,后面命令才执行                       //&&与||同级,从左到右依次执行

 “||”前面命令执行失败后,后面命令才执行

 注意:不用记所有的优先级,直接用括号括起想要先执行的命令

六 shell脚本

1 基本使用

1)SHELL脚本:使用SHELL语言编辑的文件,一般以.sh为文件的后缀,用于批量执行命令。

2)变量的赋值

    变量:用于存储特定的数值    赋值格式:变量名=值

3)释棒/释伴  #!/bin/bash:用于规定当前脚本使用的SHELL

4)SHELL脚本的输入与输出

    输入: read  变量    //从键盘输入一个值赋给变量,例如 read  a

    输出: echo  变量    //$用于提取变量中存储的值,echo用于将当前变量的值输出到屏幕,例,echo   $a

2 脚本的执行

方法一:为脚本增加执行权限,以绝对路径的方式执行,例chmod  a+x  1.sh 然后/root/1.sh

方法二:使用bash命令执行,但需要文件属主具有读权限,例如,bash  1.sh

例如:vim  age.sh

      #!/bin/bash

      echo “please input your age:”

      read  age

      echo  “your age is  $age!”

然后输入 bash  age.sh即可

3  $的使用

        $$  指当前进程ID号

        $?  表示上一条命令的执行结果,0则为上一条命令执行成功,1则为失败。经常用其作为if、while等语句的判断条件,

              如while  [ $? -ne 0 ] ,-ne为不等于。

        $1,$2  表示传入/调用的第一个参数,第二个参数

        $VALUE  调用参数

4  函数的定义与调用

#获取网卡上ipv6地址的cidr

#定义函数getcidr

getcidr(){
    local dev=$1
    local cidr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 2`
    local addr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 1`
    echo $addr/$cidr
}

#调用函数,$1指的就是$dev,即调用该函数时传入的第一个参数

getcidr $dev

5  利用其他脚本生成函数缓存,并调用缓存函数

vim bak.sh

getcidr(){
    local dev=$1
    local cidr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 2`
    local addr=`ip addr show $dev|grep inet6|head -n 1|awk '{print $2}'|cut -d '/' -f 1`
    echo $addr/$cidr

}

vim use.sh

source /root/bak.sh

ip6cidr=$(getcidr)

6  if的使用

6.1 格式

格式1:   if   [条件]       then   语句1    else   语句2   fi       //一个条件

格式2:   if   [条件1]     then   语句1    elif   [条件2]    then  语句2  

          elif  [条件3]    then   语句3    ……… else  语句n   fi  //多个条件

6.2 判断条件

1)数字判断    

-eq 等于     -ne不等于      -ge 大于等于     -gt 大于    -le 小于等于    -lt 小于

2)字符串判断   

= 字符串相等         !=字符串不相等          -z 字符串 字符串长度伪为真       -n字符串  字符串长度不伪为真

3)文档判断   

-e 文件名   如果文件存在则为真                        -d 目录名  如果目录存在则为真

-x 文件名  如果文件存在且可执行则为真            -b 文件名  如果文档存在且为块设备

-c 文件名  如果文档存在且为字符设备则为真

6.3 举例说明

1)if [ $2 ]                                                                //$2是否为0,为0则执行then,否则执行else

    Then

        time=$2

    else

        time=30

    fi

2)if [ ! -e $FILE ]                                                                    //$FILE是否不存在,不存在则执行then

    then

        echo 0

        return

    fi

3)if [ "$str" == "1" ]                                                          //$str是否是1,是则删除$FILE

    then

        rm $FILE

    fi

}

4)if [ $num -eq 1 ]                                                          //$num是否等于1,等于则删除$FILE

    then

        rm $FILE

    fi

}

5) if [ -n $addr ]                                                                            //如果$addr存在,则执行then语句

then

    ip addr show|grep $addr

else

   echo "$addr  doesn't  exsit  !!!"

fi

7 Case多路判断语句

7.1 格式:

case   变量名   in    

条件1)语句1 ;;

条件2)语句2;;

条件3)语句3;;

………

*)语句n;;

esac

7.2 举例说明

     #!/bin/bash

      echo  “please input your number:”

      read   number

      case   $number   in

     18)echo   “hi,lucky sweetie!”;;

     28)echo   “hi,go away!”;;

     38)echo    “hi, nice try!”;;

     *)echo    “please input the right number!”;;

     esac

8 for 语句

8.1 格式:

for  变量   in   值1   值2   值3 ……

do

语句

done

注:break  跳出循环,即终止循环      continue 跳过本轮循环

8.2 举例

#!/bin/bash                       #!/bin/bash

for  i  in   1  2  3                for  i   in   1   2    3

do                                   do

if  [ &i –eq   2 ]                 if  [ &i –eq   2 ]

then                                then

break                              continue

else                                else

echo   $i                         echo   $i

fi                                    fi

done                              done

结果: 1                         1   3

9 while

格式:

while   [  条件  ]

 do

      语句

done

例1:vim  while.sh                            例2:vim  xunjian.sh 

      #!/bin/bash                                        while  true

      a=1                                                  do

      while  [ $a  -le  3 ]                              ps aux|sed  1d|sort  -rn  -k3|head  -n5

      do                                                    sleep  2s  //系统延迟2秒,取消延迟用Ctrl+c

      echo  $a                                           done

      let  a=$a+1                                                               //这样就会每隔2秒输出结果

      done   //结果:1  2  3

10 循环语句  until

until   [  条件  ]

do

语句

done  //直到条件为真才停止执行

例如:vim  until.sh    

#!/bin/bash

a=1

until  [  $a   -eq   3  ]

do

echo   $a

let  a=$a+1

done    //运行结果: 1   2   3

11 select

格式:

select  变量   in   值1   值2……

do

语句

done

例如:vim  select.sh

select   i   in   1  2

do

case $i  in

1)echo  “your choice  is  1”;;

2)echo  “your choice is  2”;;

*)break;;

esac

done

七 脚本的调试

1)脚本执行失败会显示执行到具体哪一行失败,修改该行代码。执行失败的那行后面的行一般都是未执行,从而不知道后面有没有错误。

2)bash  -x  脚本名 ,可以查看脚本执行到每一行时具体的状态

3)也可以在脚本内容中添加set -x


转载请注明出处,谢谢!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼刺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值