SHELL 编程
    shell 是一个命令解释器,侦听用户指令、启动这些指令、将结果返回给用户(交互式的shell)
    shell 也是一种简单的程序设计语言、利用它可以编写一些系统脚本。
 
查看本机shell 信息:
    cat /etc/shells     --查看本支持的shell
    echo $SHELL --查看当前支持的shell
 
shell 在执行命令时,各种命令的优先级:
    别名 -> 关键字 -> 函数 -> 内置命令 -> 脚本
    别名:命令的另一种形式,有些情况下可以简化命令的输入,例如可以将很长的命令定义成短别名。
    别名的设置:
alias  别名= '      '   
  如: alias del='rm -i'
alias ll='ls -l'
 
alias 显示存在的别名
   删除别名:unalias del
 
bash 初始化:
/etc/profile -> ~/.bash_profile  -> /etc/profile.d/*.sh  -> ~/.bashrc  -> /etc/bashrc
bash 退出时也会执行一些脚本    ~/.bash_logout
 
bash 命令历史
默认情况下,shell 执行的命令会保留下来,保存的地方有两个:内存和~/.bash_history,保存下来后,可以查看,也可以上翻去执行。执行的命令先放在内存中,退出窗口时写到 ~/.bash_history
历史查看:history
cat ~/.bash_history
 
历史命令操作:
!! 执行前一个命令
!n 执行第n号命令,如 !1023
!$ 表示的是上一次命令的最后一个参数
如:  mkdir /abc
cd !$
与history 相关的设置 (/etc/profile)
vim /etc/profile
HISTSIZE=1000    --内存中保存的最大记录条目
HISTFILESIZE=1000  --历史文件中保留的最大记录条目
HISTFILE           --指定命令历史文件
 
禁用命令历史:
    1) HISTSIZE  设置为0
    2) 把历史命令文件链接到/dev/null
如: ln -s /dev/null ~/.bash_history
 
shell 中执行命令:
1.无条件执行多条命令
;  隔开
如:mkdir /abc ; cd /abc ;cp /etc/yp.conf /abc
 
2.有条件执行多条命令
&&  前一个命令执行成功后,再执行后一个(前面不成功,后面就不执行了)  
||  前一个命令执行不成功时,才执行后一个(前面成功了,后面就不执行了)
 
如:[tom@s100 ~]$ mkdir /aaa && cd /aaa && cp /etc/yp.conf /aa
[tom@s100 ~]$ mkdir /aaa || mkdir ~/aaa
 
3、子shell中执行
(   )   把命令括起来
例:(cd /etc/X11;ls)
 
4、命令替换 `  ` 或 $()
命令替换是将一个命令作为另一个命令的一部分,执行时被替换的部分先执行,执行的给果作为参数传给外层命令

如: mkdir `echo $USER`

mkdir "`date`"

mkdir "$(date)"

 
返回值  
    每执行一个命令都有它的返回值,返回值用来标识命令的执行成功与否
    查看上一个命令执行的返回值:echo $?
0 表示执行成功
 
shell 中的变量
    shell 中的变量没有严格的类型之分,但不同数据还是有不同的运算符。
    变量定义:
变量名=值
 
     注:
         1、变量名由字母、数字、下划线组成,不能以数字开头
         2、变量区分大小写
         3、shell 变量一般以大写命名(习惯,但不是要求)
 
       如:a=3
 
获取变量值的方法:
$变量名
或者
${变量名}   尽可能用这个

如:a=tt

echo "how are you" > $a_old.txt
echo "how are you" > ${a}_old.txt
 
shell 的变量运算
1、字符运算
字符连接
shell 的字符连接,无须任何符号,只需拼接起来即可
如:a=3;b=5;c=abcdefg
echo $a$b$c
字符处理
获取长度   ${#变量名}
例:a="abcdefg"
echo ${#a}
模式匹配  =~
如 if [[ $a =~ "^a" ]]
判断变量a是否以a开头

取子串   ${变量名:(+/-)n:n}

+n 从左边第n个位置开始取(第一个字符是0)

-n 从右边第n个位置开始取

n  取多少个

s="abcdefg"

echo ${s:(-3):1}    --从倒数第3个开始,取1个

字符删除   ${变量名#*截止字符}

  1. #*x 从左边开始删,遇到第一个x为止
  2. ##*x 从左边开始删,遇到最后一个x为止
  3. %x* 从右边开始删除,遇到第一个x为止
  4. %%d* 从右边开始删除,遇到最后一个x为止
  5. str=/dir1/dir2/dir3/dir4/file.txt
  6. echo {str#*d} --从左边开始,删到第一个d为止  ir1/dir2/dir3/dir4/file.txt
  7. echo {str##*d} --从左边开始,删到最后一个d为止  ir4/file.txt
  8. echo ${str%d*}    /dir1/dir2/dir3/
  9. echo ${str%%d*}    /

basename  取完整路径中的文件名

  1. basename /etc/sysconfig/network
  2. network
  3. basename $str
  4. file.txt

2、算术运算

$[  ]
$(( ))
 
如:echo $[3*5]
echo $((3*8))
 
但要注意 shell 算数的能力比较差,小数处理有很多问题
如在程序需要计算小数,可用 bc 和 awk
如:
   echo "scale=2;5/2" | bc
           awk 'BEGIN {print 5/2}'
 
算术运算符:+ - * / ** %   
 
3、比较运算
数值比较
  1. -eq 等于
  2. -ne     不等于
  3. -gt     大于
  4. -lt      小于
  5. -ge     大于等于
  6. -le      小于等于
字符比较
  1. = 等于
  2. != 不等于
  3. \> 大于
  4. \< 小于
  5. -z string 字符是否为空
  6. -n string 字符是否不为空
更多的内容可见 man test
  1. -b file
  2. -c file
  3. -d file
  4. -e file
  5. -f file
  6. -g file 文件是否设置了 sgid
  7. -G file
  8. -r file
  9. -w file
  10. -x file
输入输出:
    输出:  echo
      格式:echo [option] 字符串
option:
    -n 不换行
    -e 对一些控制符加以处理
    如\t   插入tab
     \a   发警告音
     
输入: read
  1. 格式:read [option] [var]
  2. option:
  3. -p    设置提示字符
  4. -s   输入时不显示,如同输入密码
  5. -t n   设置等待时间,如果过了指定的秒数,就返回一个非零的状态
  6. -n n   设置只接收多个字符,达到这个字符个数n后,就自动回车

如:read -p “请输入你的姓名:" name

   read -sp “请输入密码:" passwd
   read -n 1 "是否继续:" jx

cut

  1. 语法:cut [option] [文件名]
  2. option:
  3. -b 取字节
  4. -c 取字符
  5. -f 取字段
  6. -d 指定字段分隔符
  7. 范围表示:
  8. N    N
  9. N   从第N项开始,到最后
  10. NM    NM
  11. -M    1M
例:只显示 /etc/passwd 中的用户名信息
cut -d: -f1  /etc/passwd
 
shell 程序一般设计流程:
    1、创建一个文件,把完成功能的每一步操作写到脚本文件中
    2、设置文件的可执行权限
    3、执行文件
 
例:写一程序从键盘读入两个数,输出最大数
  1. [root@s100 script]# cat if1.sh
  2. #!/bin/bash
  3. #if 使用示例,显示两个数的最大数
  4.  
  5. read -p "请输入第一个数:" n1
  6. read -p "请输入第二个数:" n2
  7. max=$n1
  8. if [ $n2 -gt $max ]
  9. then
  10. max=$n2
  11. fi
  12. echo "最大数是: $max"
流程控制:
    分支结构
     格式一:
    if [ condition ]    --注意括号两边有空格,condition 是个条件表达式
    then
commands
    fi
  作用:判断 ccondition 条件是否成立,如果成立,执行中间的命令 commands,不成立不执行。
if [ $a -gt $b ]
then
echo "a大于b"
fi
 
if 可以接 条件表达式  如 if [ $a -gt $b ],也可以直接接一个命令
如 if mkdir /abc  ,这时,会把命令的执行结果作为判断,如果成功执行
就相当于条件成立,如果执行不成功,就相当于条件不成立

格式二:

if [ condition ]    
    then
commands1
    else
commands2
    fi
 
作用:判断 condition 条件是否成立,如果成立,执行commands1,如果不成立
     执行 commands2  
 
如:if [ $a -gt $b ]
   then
echo "a>b"
   else
echo "b>=a"
   fi
 
分支嵌套
分支嵌套是分支中包含分支
普通的分支形式:
if [ condition ]
      then
commands
      fi
 
或者
if [ condition ]
      then
commands1
      else
commands2
      fi
 
嵌套后就:
if [ condition ]
then
if [ condition ]
then
commands1
else
commands2
fi
fi
 
if [ condition ]
then
if [ condition ]
then
commands1
else
commands2
fi
else
commands3
fi
如:  
if [ $a -ge 0 ]
then
if [ $a -gt 0 ]
then
b=$a
else
b=0
fi         
else
b=$[$a*-1]
fi
 
if [     ]
then
commands1
else
commands2
fi

例:输入文件,判断是否存在,如果存在,判断当前用户对它的权限

if [ -f $file ]
then
if [ -r   ...
if [ -w ....
if [ -x ...
else
echo "文件不存在!"
exit 1
fi

用分支嵌套实现:

某产品 199 元一件,买5件或以上9折,10件或以上 85 折,输入购买件数,计算付款。
 
if [ $n -ge 5 ]
then
 
else
fi
 
多条件表示:
逻辑与
if [ condition1 -a condition2 ]  
if [ condition1 ] && [ condition2 ]
if [[ condition1 && condition2 ]]
 
逻辑或
if [ condition1 -o condition2 ]  
if [ condition1 ] || [ condition2 ]
if [[ condition1 || condition2 ]]
 
逻辑非(取反)
!  
输入 x 值、 y值,判断所在象限
 

10、shell编程+流程控制+分支嵌套的更多相关文章

  1. shell编程流程控制

    前言: 在linux shell中,通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更为复杂的逻辑判断,我们就需要使用流程控制语句来支持了. 所谓流程控制既是通过使用流程控 ...

  2. shell编程--流程控制for,do-while,if-then,break,continue,case等

    2.5 流程控制 2.5.1 if语法 1.语法格式 if condition then     statements [elif condition     then statements. ..] ...

  3. Linux学习 -- Shell编程 -- 流程控制

    if语句 单分支 if [ 条件判断式 ]; then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi 例子: 双分支 if [ 条件判断式 ] then 程序 else 程序 fi ...

  4. linux shell编程流程控制

    条件选择 单分支条件 多分支条件 选择执行if语句 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 f ...

  5. Python 流程控制-分支结构详解

    目录 Python 流程控制--分支结构 1.结构分类 顺序结构 分支结构 循环结构 2.分支结构详解 分支结构 定义格式: if 单支结构 if 双分支结构 if 多分支结构 Python 流程控制 ...

  6. JavaScript 流程控制-分支

    JavaScript 流程控制-分支 1.流程控制 在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能. 简单理解:流程控 ...

  7. linux shell 之流程控制 if if else while

    (1)流程控制不可以为空: (2)if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi 条件 ...

  8. Shell工具| 流程控制

    1. 流程控制 if 判断 ()[ 条件判断式 ],中括号和条件判断式之间必须有空格 ()if后要有空格 [kris@hadoop datas]$ vim if.sh #!/bin/bash -eq ...

  9. python基础-->流程控制-->分支结构-->单项分支-->双向分支

    # ###流程控制 ''' 流程:代码执行过程 流程控制:对代码执行过程的管控 顺序结构:代码默认从上到下依次执行 分支结构:对代码执行过程的管控 循环机构: while for ..in.... 分 ...

随机推荐

  1. jwt揭秘(含源码示例和视频)

    JSON Web Tokens,是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流程 在项 ...

  2. ora-01489 字符串连接的结果过长 解决方案

    如下代码,使用listagg进行分组拼接时,常常会报 ora-01489 错误,造成该报错的主要原因是:oracle对字符变量的长度限制,正常情况下,oracle定义的varchar2类型变量的长度不 ...

  3. jQuery中的属性(四)

    1. attr(name|properties|key,value|fn), 设置或返回被选元素的属性值 参数说明: name:属性名称 properties:作为属性的“名/值对”对象 key,va ...

  4. 《为什么说Redis是单线程的以及Redis为什么这么快!》

    为什么说Redis是单线程的以及Redis为什么这么快!   一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓 ...

  5. URL、URI、URN之间的区别

    URL统一资源定位符 URI统一资源标识符 URN统一资源名称 URL是URI的一个特例. URI由URL和URN两部分组成. 在java类中,URI类不包含任何访问资源的方法,它唯一的作用就是解析. ...

  6. Python中xlrd和xlwt模块使用方法----》》数据库数据导出(之一)

    xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. (1) 打开excel文件并获取所有sheet >>> import xlrd >>& ...

  7. vue.js操作元素属性

    vue动态操作div的class 看代码: <!doctype html> <html lang="en"> <head> <meta c ...

  8. Asp.Net Core 工作单元 UnitOfWork UOW

    Asp.Net Core 工作单元示例 来自 ABP UOW 去除所有无用特性 代码下载 : 去除所有无用特性版本,原生AspNetCore实现 差不多 2278 行代码: 链接:https://pa ...

  9. Loadrunner 进行压力测试 并发测试

    问题背景: 今年公司项目进行Saas化转型,在中间遇到很多问题,其中之一就是 Saas化后多租户的性能 和 并发问题.公司让我来调研和重现问题,通过调研总结了一些经验教训,分享给大家. 环境: Loa ...

  10. cURL error 60: SSL certificate problem: unable to get local issuer certificate(转)【亲测】

    php5.6以上的版本会出现这种问题 解决办法: [开启拓展] extension=curl extension=openssl [配置证书] 访问https://curl.haxx.se/docs/ ...