当前位置:网站首页>第四章 4.1 shell编程基础

第四章 4.1 shell编程基础

2020-11-10 11:31:08 超级李导

  linux系统的控制是由内核操纵资源分配使用的,shell命令是与内核操作通信交流的工具。shell有多种类型,常见的/bin/sh、/bin/bash,在centos环境中 默认使用bash,不建议使用其他形式的shell。

  1)历史记录

  bash shell在使用时,会自动记录所操作的命令,记录存放在.bash_history文件中。命名的历史记录默认记录最近1000条,可以通过profile设置HISTSIZE数值调整记录的长度,比如可以设置记录条数为一万/HISTSIZE=10000。当查询某一个使用过的命令,可以使用Ctrl+r快捷键开启命令搜索,但是在日常管理件建议直接使用history 或history|grep xxxx命令查找。

  2) 快捷键

  在命令行shell操作界面,命令行可以使用如下快捷键,提高操作效率。

    Ctrl+a    光标移动到行首
    Ctrl+e    光标移动到行尾
    Ctrl+l     清屏
    Ctrl+c    终止进程
    Ctrl+z    挂起进程
    Ctrl+u    删除光标到行首的字符
    Ctrl+k    删除光标到行尾的字符
    Ctrl+f    光标右移一个字符
    Ctrl+b   光标左移一个字符
    Ctrl+w   删除光标前一个字符
    Alt+d     删除光标后一个字符
    Tab       自动补齐

  3)别名设置

   linux允许用户根据自己的需求设置命令的别名。比如,ll这个命令是'ls -l --color=auto'的缩写,对复杂的命令设置别名,可以提高操作的效率。在命令行界面输入alias 可以查看已经设置的命令别名;例如设置别名: alias nginxstart='systemctl start nginx',nginxstart  就可以可以直接启动nginx了;取消别名:unalias nginxstart。

  [root@centos7 yum.repos.d]# alias nginxstart='systemctl start nginx'
  [root@centos7 yum.repos.d]# alias
  alias cp='cp -i'
  alias egrep='egrep --color=auto'
  alias fgrep='fgrep --color=auto'
  alias grep='grep --color=auto'
  alias l.='ls -d .* --color=auto'
  alias ll='ls -l --color=auto'
  alias ls='ls --color=auto'
  alias mv='mv -i'
  alias nginxstart='systemctl start nginx'
  alias rm='rm -i'
  alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
  [root@centos7 yum.repos.d]# unalias nginxstart

  4)管道符---“|”

   管道符的作用的是将多个命令连接起来使用,前一个命令的结果标准输出到下一个命令的标准输入。例如,cat /etc/passwd |grep bash命令可以筛选出具有bash登录权限的用户,直接cat查看passwd文件时候,输出的内容很多,不方便查看具有bash权限的信息,当加上管道|后,接着使用grep命令过滤cat输出的信息,最终筛选出带有bash的信息行。

  5)重定向---“> ,>>”

   重定向符号的作用是将命令的结果输出到指定的文件或位置。>是强制覆盖模式,没有文件会自动创建文件,有文件,会覆盖文件内容;>> 是追加模式输出到文件;命令末尾的数字也有特殊含义,0代表标准输入,1代表标准输出,2代表标准错误;2>&1 的意思是将标准错误重定向到标准输出;> /dev/null 是将输出写入到无穷尽的黑洞,用户无意思信息的处理。

  [root@centos7 ~]# history > /tmp/1.txt
  [root@centos7 ~]# cat /etc/nginx.conf >>/tmp/1.txt
  [root@centos7 ~]# nohup ./rmlog.sh > rm.log 2>&1 &
  [root@centos7 ~]# sh mysql.sh >/dev/null 2>&1

  6)序列控制符---“&”

  &是shell中常用的字符,在一个命令后面加&,表示放到后台运行;&&是可以连接两个命令,表示只有当前一个命令执行成功了才会接着执行后面的命令;||是表示当前面的命令执行失败了才会执行后面的字符。

  [root@centos7 ~]# nohup /home/jiankong.sh &    #后台不中断执行

  7)引号

  单引号可以用来还原字符的字面意思,实现屏蔽元字符的功能,单引号必须成对使用;双引号与单引号基本相同,但其不会屏蔽$ ' \这三个元字符的功能,如果要屏蔽,必须在其前面加一个\;反引号是进行命令替换,把命令字符替换为命令结果输出。

  [root@centos7 ~]# echo '$JAVA_HOME'      #实现屏蔽$的特殊功能
  [root@centos7 ~]# echo 'cd \home'        #实现屏蔽转义字符
  [root@centos7 ~]# echo "$JAVA_HOME"       #双引号直接输出了变量
  [root@centos7 ~]# echo "\$JAVA_HOME"     #用\转义,直接输出了后面的字符
  [root@centos7 ~]# echo "today is `date`"      #直接输出date命令的结果

  8)变量

   变量有环境变量、普通变量、特殊变量。环境变量是一般指系统环境变量,只要包含用户、目录、路径、全局参数等主要信息,他们需要执行export声明才能使用,用env命令可以查看这些变量。普通变量主要是应用要调用参数的赋值。特殊变量是linux系统设置的特定参数变量。在日常的应用中最多是声明环境变量,脚本中也会常用赋值变量,特殊变量使用较少。下面是三种变量的示例。

  java环境变量设置示例
  [root@centos7 ~]# vim /etc/profile
    JAVA_HOME=/usr/local/java
    JRE_HOME=/usr/local/java/jre
    CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
    export JAVA_HOME JRE_HOME CLASS_PATH PATH
  [root@centos7 ~]# source /etc/profile

  脚本中常用的赋值变量示例
  [root@centos7 ~]# starttime=`date`
  [root@centos7 ~]# gameuser="lixiaoming"
  [root@centos7 ~]# fr_1='12315'

  特殊变量释义
  $0   获取脚本文件名
  $n   获取第 n 个参数值,$1是第一个参数,$2是第二个参数...
  $#   获取参数的总个数
  $*   获取传参参数,"$*"表示将参数作为单字符串,以"$1 $2 ... $n"形式输出参数
  $@  获取传参参数,"$@"表示将参数视作为独立字符串,以"$1" "$2" "$3" ... "$n"形式输出参数
  $?   获取上一命令的执行状态,0表示成功,其他为失败
  $$   获取当前脚本或命令的进程号
  $!   获取最后一个后台进程的进程号

  9)数组

  数组是一种具有变量功能的数据结构,数组由元素组成,每个元素分配一个从零开始的整数索引。定义一个数组有两种方式,一种是逐一赋值定义,如TESTA[0]=100,TESTA[1]=200;另一种是全量赋值创建,如TESTB=(12 23 34 45),取值采用$TESTB[1]。下面用示例来加深对数组的理解。

  root@centos7 ~]# TESTB=(12 23 34 45)       #定义新数组
  [root@centos7 ~]# echo ${TESTB[2]}       #输出索引为2的元素值
  [root@centos7 ~]# TESTB[4]=56           #增加索引为4的新元素
  [root@centos7 ~]# echo ${TESTB[@]}       #输出所有元素,空格分开元素值格式
  [root@centos7 ~]# echo ${TESTB[*]}       #输出所有元素,字符串格式
  [root@centos7 ~]# echo ${#TESTB[@]}     #输出数组的元素个数
  [root@centos7 ~]# echo ${#TESTB[*]}       #输出数组的元素个数
  [root@centos7 ~]# TESTC=(${TESTA[@]} ${TESTB[@]})   #两个数组合并成新数组

  10) 算术运算

  Bash支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

  1 算术运算
  原生bash不支持简单的数学运算,但是可以通过expr命令来实现expr是一款表达式计算工具,它能完成表达式的求值操作
  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 ]
  
  2 关系运算符
  运算符          说明                 举例
  -eq  检测两个数是否相等,相等返回 true      [ $a -eq $b ] 返回 false
  -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
  
  3 布尔运算符
  运算符        说明                  举例
   !    非运算,表达式为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
  
  4 字符串运算符
  运算符        说明                  举例
  =    检测两个字符串是否相等,相等返回 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
  
  5 文件测试运算符
  操作符 说明 举例
  -b file    检测文件是否是块设备文件,如果是,则返回 true     [ -b $file ] 返回false
  -c file    检测文件是否是字符设备文件,如果是,则返回 true    [ -b $file ] 返回false
  -d file    检测文件是否是目录,如果是,则返回 true        [ -d $file ] 返回false
  -e file    检测文件或目录是否存在,如果是,则返回 true      [ -e $file ] 返回true
  -f file    检测文件是否是普通文件,如果是,则返回 true       [ -f $file ] 返回true
  -g file    检测文件是否设置了SGID位,如果是,则返回 true    [ -g $file ] 返回false
  -h file    检测文件是否为链接文件,如果是,则返回 true      [ -h $file] 返回false
  -k file    检测文件是否设置了粘着位(如果是,则返回 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    检测文件是否为非空,不为空,返回true       [ -s $file ] 返回true

  11)正则表达基础

  1 正则常用的命令工具
  grep、egrep、sed、awk

  2 基本的正则表达符号含义
   d       匹配字母d
   .       匹配任意单个字符
   *       匹配一个或多个
   .*       匹配任意多个字符
   ^       匹配字符串的开头
   $       匹配字符串的结尾
   []       匹配集合中的任意单个字符
   [^]       匹配否定,对括号中的集合取反
   [x-y]      匹配x到y连续的字符串范围
   \      匹配转义后的字符串
   \{n,\}  匹配前一个字符重复至少n次
   \{n\}    匹配前一个字符重复n次
   \(\)    调用\( 和 \)之间的内容
  
  3 校验字符的表达式
  1 汉字:  ^[\u4e00-\u9fa5]{0,}$
  2 英文和数字:  ^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
  3 长度为3-20的所有字符:  ^.{3,20}$
  4 由26个英文字母组成的字符串:  ^[A-Za-z]+$
  5 由26个大写英文字母组成的字符串:  ^[A-Z]+$
  6 由26个小写英文字母组成的字符串:  ^[a-z]+$
  7 由数字和26个英文字母组成的字符串:  ^[A-Za-z0-9]+$
  8 由数字、26个英文字母或者下划线组成的字符串:  ^\w+$ 或 ^\w{3,20}$
  9 中文、英文、数字包括下划线:  ^[\u4E00-\u9FA5A-Za-z0-9_]+$
  10 中文、英文、数字但不包括下划线等符号:  ^[\u4E00-\u9FA5A-Za-z0-9]+$
  11 可以输入含有^%&',;=?$\"等字符:  [^%&',;=?$\x22]+
  12 禁止输入含有~的字符:  [^~\x22]+
  
  4 特殊需求表达式
  Email地址:  ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  域名:  [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  InternetURL:  [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  手机号码:  ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  国内电话号码(0511-4405222、021-87888822):  \d{3}-\d{8}|\d{4}-\d{7}
  15或18位×××:  ^\d{15}|\d{18}$
  15位×××:  ^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
  18位×××:  ^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
  短×××号码(数字、字母x结尾):  ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
  帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):  ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):  ^[a-zA-Z]\w{5,17}$
  强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):  ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  日期格式:  ^\d{4}-\d{1,2}-\d{1,2}
  一年的12个月(01~09和1~12):  ^(0?[1-9]|1[0-2])$
  一个月的31天(01~09和1~31):  ^((0?[1-9])|((1|2)[0-9])|30|31)$
  腾讯QQ号:  [1-9][0-9]{4,} (腾讯QQ号从10000开始)
  中国邮政编码:  [1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
  IP地址:  \d+\.\d+\.\d+\.\d+ (提取IP地址时有用)

 

版权声明
本文为[超级李导]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/superleedo/p/13940675.html