天天看点

shell编程基础

  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)正则表达基础

继续阅读