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个

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

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

basename  取完整路径中的文件名

basename /etc/sysconfig/network
network
basename $str
file.txt

2、算术运算

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

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

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

cut

    语法:cut [option] [文件名]
option:
-b 取字节
-c 取字符
-f 取字段
-d 指定字段分隔符
范围表示:
N    第N项
N-   从第N项开始,到最后
N-M    N-M 项
-M    从1到M
例:只显示 /etc/passwd 中的用户名信息
cut -d: -f1  /etc/passwd
 
shell 程序一般设计流程:
    1、创建一个文件,把完成功能的每一步操作写到脚本文件中
    2、设置文件的可执行权限
    3、执行文件
 
例:写一程序从键盘读入两个数,输出最大数
[root@s100 script]# cat if1.sh
#!/bin/bash
#if 使用示例,显示两个数的最大数 read -p "请输入第一个数:" n1
read -p "请输入第二个数:" n2
max=$n1
if [ $n2 -gt $max ]
then
max=$n2
fi
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. C++学习二 vector的用法(使用sort对于vector排序)

    一.vector的介绍 vector是C++里面的一个容器,也是我们数学上面理解的向量,有一些比较常见的操作. 二.vector的定义 #include<vector> using nam ...

  2. ionic4 ion-modal的用法

    组件内部示例 <ion-header> <ion-toolbar> <ion-title>条件筛选</ion-title> <ion-button ...

  3. aliyun-oss 通过redis来实现跨域上传图片到阿里 OSS并回显进度条

    public class PutObjectProgressListener implements ProgressListener {        private long bytesWritte ...

  4. 补充: Nginx

    1. 定义: Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器: 特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现 ...

  5. MySQL实战45讲学习笔记:第四十讲

    一.本节概述 在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁. 因此,insert 语句是一个很轻量的操作.不过,这个结论对于“普通的 inser ...

  6. 深度解密Go语言之context

    目录 什么是 context 为什么有 context context 底层实现原理 整体概览 接口 Context canceler 结构体 emptyCtx cancelCtx timerCtx ...

  7. 动手学深度学习14- pytorch Dropout 实现与原理

    方法 从零开始实现 定义模型参数 网络 评估函数 优化方法 定义损失函数 数据提取与训练评估 pytorch简洁实现 小结 针对深度学习中的过拟合问题,通常使用丢弃法(dropout),丢弃法有很多的 ...

  8. JeeSite | 访问控制权限

    在各种后台系统中都会涉及到权限的管控,从功能权限的管控,到数据权限的管控,都是为了让系统的在使用的过程中更加的安全.功能权限管控是对针对不同的角色可以进行不同的功能操作,而数据权限管控是针对不同的角色 ...

  9. Spring @CrossOrigin 通配符 解决跨域问题

    @CrossOrigin 通配符 解决跨域问题 痛点: 对很多api接口需要 开放H5 Ajax跨域请求支持 由于环境多套域名不同,而CrossOrigin 原生只支持* 或者具体域名的跨域支持 所以 ...

  10. fatal error compiling: tools.jar not found

    在Eclipse中使用Maven提供的Install(打包)命令插件的时候报错[Fatal error compiling: tools.jar not found]. 报错的原因 报错的原因从错误信 ...