Linux 中shell 学习笔记

SHELL学习笔记

1. Bash 变量

1.1 什么是变量与变量分类

  变量是计算机内存的单元,其中存放的值可以改变;

  变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此他们十分有用

1.2 变量的命名规则

  • 变量名必须以字母或下划线大头,名字中间只能由字母、数字和下划线组成
  • 变量名的长度不得超过255个字符
  • 变量名在有效的范围内必须是唯一的
  • 在Bash中,变量的默认类型都是字符串型

  1.3 变量的分类

  • 用户自定义变量。变量自定义的

变量名=变量值

例如:

  x=5;

  name=“jie cao”

变量的调用:

  echo $x

  echo $name

变量的叠加

  x=123

  x=“$x”456   或者   x=${x}789

  x=$x         #x=123456

变量调用

  $x

  $name

删除变量

  unset 变量名

  unset x

变量查看

  set [选项]      -u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)

  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的

环境变量与用户自定义变量的区别

  环境变量是全局变量

  用户自定义变量是局部变量

自定义环境变量

  export 变量名=变量值  或者   变量名=变量值;export 变量名

查看环境变量

  set   #查看所有变量

  env  #查看环境变量

删除变量

  unset 变量名

常用环境变量

  HOSTNAME:主机名

  SHELL:当前的shell

  TERM:终端环境

  HISTSIZE:历史命令条数

  SSH_CLIENT:当前操作环境是用ssh链接的,这里记录客户端ip

  SSH_TTY:ssh链接的终端时pts/1

  USER:当前登录的用户

  PATH:系统搜索命令的路径

    echo $PATH  #查看PATH环境变量

    PATH=“$PATH”:/root/sh   #增加PATH变量的值

  当前语系变量查询

    locale   #查询当前系统语系

      -LANG:定义系统主语系的变量

      -LC_ALL:定义整体语系的变量

  • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的

$n:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}

$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体

$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

$#:这个变量代表命令行中所有参数的个数

  • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

$0:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确

$$:当前进程的进程号(PID)

$!:后台运行的最后一个进程的进程号(PID)

1.4 接收键盘输入

  • read [选项] [变量名]
    • -p:“提示信息”:在等待read输入时,输出提示信息
    • -t秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
    • -n 字符数:rea的命令只接受指定的字符数,就会执行
    • -s:隐藏输入的数据,适用于机密信息的输入

2. Shell运算符

2.1 declare命令    #声明变量类型

  • declare [+/-] [选项] 变量名
    • -:给变量设定类型属性
    • +:取消变量的类型属性
    • -a:将变量声明为数组型
      • move[0]=cl
      • move[1]=tpc
      • declare -a movie[2]=live
      • echo ${movie}       #列出第一个
      • echo ${movie[2]}   #列出第二个
      • ehco ${movie[*]}   #列出所有
    • -i:将变量声明为整型(integer)
    • -x:将变量声明为环境变量         #与export 作用相似
    • -r:将变量声明为只读变量
    • -p:显示指定变量的被声明的类型

2.2 数值运算的方法

  • 方法1:aa=123;bb=456 ;declare -i cc=$aa+$bb;
  • 方法2:expr或let数值运算工具
    • dd=$(expr $aa + $bb)   #注意:+号两侧必须有空格
  • 方法3:$((运算式))或者$[运算式]   #常用
    • ff=$($aa+$bb)
    • uu=[$aa+$bb]

2.3 变量测试    #了解即可

  • 好处:代码精简
  • 坏处:逻辑混乱

3.环境变量配置文件

  

4.正则表达式

sed [选项] '[动作]' 文件名

选项:

  • -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕
  • -e:允许对输入数据应用多条sed命令编辑
  • -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作:

  • -a:追加,在当前行后添加一行或多行
  • -c:行替换,用c后面的字符串替换原数据行  #sed '4c zhehang bujige' student.txt
  • -i:插入,在当前行前插入一行或多行。       #sed '2i piaoliang jiushi renxing ' student.txt
  • -d:删除,删除指定的行                          #sed '2a piaoliang jiushi renxing ' student.txt
  • -p:打印,输出指定的行   
  • -s:子串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新子串/g”(和vim中的替换格式类似)        #sed '4s/70/100/g' student.txt           #sed -e 's/a//g;s/c//g' student.txt

字符处理命令

  • sort 排序命令

sort [选项] 文件名

-f:忽略大小写

-n:以数值型进行排序,默认使用字符串型排序

-r:反向排序

-t:指定分隔符,默认是分隔符时制表符

-k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

  • wc统计命令

    wc [选项] 文件名

-l:只统计行数

-w:只统计单词数

-m:只统计字符数

 

5.流程控制语句

5.1 条件判断式语句

按照文件类型进行判断

-b文件:判断文件是否存在,并且是否为块设备文件(是块设备文件为真)

-c文件:判断文件是否存在,并且是否为字符设备文件(是字符设备文件为真)

-d文件:判断文件是否存在,并且是否为目录文件(是目录为真)

-e文件:判断文件是否存在,(存在为真)

-f文件:判断文件是否存在,并且是否为普通文件(是普通文件为真)

-L文件:判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真)

-p文件:判断文件是否存在,并且是否为惯导文件(是管道文件为真)

-s文件:判断文件是否存在,并且是否为非空(非空为真)

-S文件:判断文件是否存在,并且是否为套接字文件(是套接字文件为真)

按照文件权限判断

-r文件:判断文件是否存在,并且是否该文件拥有读权限(有读权限为真)

-w文件:判断文件是否存在,并且是否该文件拥有写权限(有写权限为真)

-x文件:判断文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)

-u文件:判断文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)

-g文件:判断文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)

-k文件:判断文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

两个文件之间的比较

文件1 -nt 文件2: 判断文件1的修改时间是否文件2的新(如果新则为真)

文件1 -ot 文件2: 判断文件1的修改时间是否比文件2的旧(如果旧则为真)

文件1 -ef 文件2: 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法

两个整数之间的比较

整数1 -eq 整数2: 判断整数1是否和整数2相等(相等为真)         equal

整数1 -ne 整数2:判断整数1是否和整数2不相等(不相等为真)    not equal

整数1 -gt 整数2:判断整数1是否大于整数2(大于为真)              greater than

整数1 -lt 整数2:判断整数1是否小于整数2(小于为真)               less than

整数1 -ge 整数2:判断整数1是否大于等于整数2(大于等于为真)   greater or equal

整数1 -le 整数2:判断整数1是否小于等于整数2(小于等于为真)    less or  equal

字符串的判断

-z:判断字符串:判断字符串是否为空(为空返回真)

-n:判断字符串是否为非空(非空返回真)

字符串1 == 字符串2:判断字符串1是否和字符串2相等(相等返回真)

字符串1 != 字符串2:判断字符串1是否和字符串2不相等(不相等返回真)

多重条件判断

判断1 -a 判断2: 逻辑与,判断1和判断2都成立,最终的结果才为真

判断1 -o 判断2 :逻辑或,判断1和判断2有一个成立,最终的结果就为真

!判断:逻辑非,使原始的判断式取反

5.2 单分支if语句

if [ 条件判断式 ]; then

  程序

fi

或者

if [ 条件判断式 ] 

  then

  程序

fi

 5.3 双分支if语句

if [条件判断式]  

  then

    条件成立时,执行的程序

  else

    条件不成立时,执行的另一个程序

fi

#例如               #判断apache服务是否运行

 5.4 多分支条件语句

if [条件判断式1]  

  then

    条件成立时,执行的程序

elif [条件判断式2]

  then

    条件不成立时,执行的另一个程序

...省略更多条件

else

    当所有条件都不成立,最后执行此程序

fi

 5.5 多分支case语句

case $变量名 in

  "值1")

    如果变量的值等于值1,则执行程序1

    ;;

  "值2")

    如果变量的值等于值2,则执行程序2

    ;;

  ...省略其他分支...

  *)

    如果变量的值都不是以上的值,则执行此程序

;;

esac

5.6 for循环

for 变量 in 值1 值2 值3

  do

    程序

  done

或者

for (i= 值1;i<=值2;i=epx)

  do

    程序

  done

5.7 while循环

  while 循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。

 

while [条件判断式] 

  do

    程序

  done

5.8 until循环

  until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序,并执行循环程序。一旦循环条件成立,则终止循环

  

 

posted @ 2017-05-14 00:58  我是畅游海  阅读(196)  评论(0编辑  收藏  举报