shell编程:

编译器、解释器
编程语言:机器语言、汇编语言、高级语言

静态语言:编译型语言
  强类型(变量):变量在使用前,必须事先声明,甚至还需要初始化
  事先转换成可执行格式
  C/C++、C#、Java...
动态语言:解释型语言
  弱类型:变量用时声明,拿来直接用,不需要提前声明,甚至不区分类型
  边解释边执行
  PHP,SHELL,Python...

面向过程:SHELL,C
面向对象:Java,Python,C++
用其所长,避其所短

变量:内存空间,命名

内存:编址的存储单元

变量类型:事先确定数据的存储格式和长度
  字符
  数值
    整型
    浮点型

逻辑运算:与,或,非,异或
与:只要一个为假,结果一定为假
或:只要有一个为真,结果一定为真
非:非真=假,非假=真

shell:弱类型编程语言
  NULL:空

变量赋值:VAR_NAME=VALUE

引用变量:${VARNAME},括号有时可省略

bash的变量类型:
  环境变量
  本地变量(局部变量)
  位置变量
  特殊变量

本地变量:
set VARNAME=VALUE:作用域为整个bash进程

局部变量:
local VARNAME=VALUE:作用域为当前代码段

环境变量:作用域为当前shell进程及其子进程
export VARNAME=VALUE
  "导出"

脚本在执行时会启动一个子shell进程
  命令行中启动的脚本会继承当前shell环境变量

  系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量

位置变量:
$1,$2,...
shift
  shift #

特殊变量:
$?:保存上一个命令的执行状态返回值
$#:参数的个数
$*:参数列表
$@:参数列表

程序执行,可能有两类返回值
  程序执行结果
  程序状态返回代码(0-255)
    0:正确执行
    1-255:错误执行,1,2,127系统预留

输出重定向:
>
>>
2>
2>>
&>

/dev/null:软件设备(软件模拟设备),bit bucket,数据黑洞

撤销变量:
unset VARNAME

查看当前shell中变量:
set

查看当前shell中的环境变量:
printenv
env
export

位置和特殊不能查看

脚本:命令的堆砌,按照实际需要结合命令流程控制机制实现的源程序

shebang:魔数
#!/bin/bash
#注释行,不执行

条件判断:
  如果用户不存在
    添加用户,给密码并显示添加成功
  否则
    显示如果已经存在,没有添加

bash中如何实现条件判断?
条件测试类型:
  整数测试
  字符测试
  文件测试

条件测试的表达式:
  [ expression ]
  [[ expression ]]
  test expression

整数比较:
  -eq:测试两个整数是否相等;比如 $A -eq $B #写作[ $A -eq $B ]
  -ne:测试两个整数是否不等
  -gt:测试一个数是否大于另一个数
  -lt:测试一个数是否小于另一个数
  -ge:大于或等于
  -le:小于或等于

命令间的逻辑关系:
  逻辑与:&&
  逻辑或:||

如果用户user6不存在,就添加用户user6
  ! id user6 && useradd user6
  id user6 || useradd user6

如果用户存在,就显示用户已存在,否则,就添加此用户
id user1 && echo "user1 exists." || useradd user1

如果用户不存在,就添加;否则,显示其已经存在
! id user1 && useradd user1 || echo "user1 exists."

如果用户不存在,就添加并且给密码,否则,显示其已经存在
! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists."

练习:写脚本,完成以下任务
1、添加5个用户,user1,...,user5
2、每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息
3、每个用户添加完成后,都要显示用户某某已经添加成功

练习:写一个脚本,完成以下任务
1、使用一个变量保存一个用户名
2、删除此变量中的用户,且一并删除其家目录
3、显示"用户删除完成"类的信息

练习:写一个脚本,完成以下要求
1、添加三个用户user1,user2,user3;但要先判断用户是否存在,不存在而后再添加
2、添加完成后,显示一共添加了几个用户,当然,不能包括因为事先存在而没有添加的
3、最后显示当前系统上共有多少个用户

练习:写一个脚本,完成以下要求
给定一个用户:
  1、如果其UID为0,就显示此为管理员
  2、否则,就显示其为普通用户

条件判断,控制结构:
单分支if语句
if 判断条件; then
  statement1
  statement2
  ...
fi

双分支的if语句:
if 判断条件; then
  statement1
  statement2
  ...
else
  statement3
  statement4
  ...
fi

多分支的if语句
if 判断条件1; then
  statement1
  ...
elif 判断条件2; then
  statement2
  ...
elif 判断条件3; then
  statement3
  ...
else
  statement4
  ...
fi

练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户
#!/bin/bash
#
grep "\<bash$" /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
  USERS=`grep "\<bash$" /etc/passwd | wc -l`
  echo "The shells of $USERS users is bash"
else
  echo "No such user."
fi

####"引用"一个命令的执行结果,要使用命令引用;比如:RESAULTS=`wc -l /etc/passwd | cut -d: -f1`;
  使用一个命令的执行状态结果,要直接执行此命令,一定不能引用;比如:if id user1一句中的id命令就一定不能加引号
  如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=`id -u user1`;
  如果想把一个命令的执行结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如
    id -u user1
    RETVAL=$?
    此句绝对不可以写为RETVAL=`id -u user1`;

shell中如何进行算术运算:
1、let 跟算术运算表达式
  let C=$A+$B
2、$[算术运算表达式]
  C=$[$A+$B]
3、$((算术运算表达式))
  C=$(($A+$B))
4、expr 跟算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
  C=`expr $A + $B`

定义脚本退出状态码
exit:退出脚本
  exit #:自定义状态码
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出吗即为脚本的退出状态码

文件测试:
-e FILE:测试文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE:测试指定路径是否为目录
-r FILE:测试当前用户对指定文件是否有读权限
-w FILE:测试当前用户对指定文件是否有写权限
-x FILE:测试当前用户对指定文件是否有执行权限

[ -e /etc/inittab ]
[ -x /etc/rc.d/rc.sysinin ]

测试脚本是否有语法错误的(测试结果只是提供一个建议,仅供参考)
bash -n

bash -x:脚本单步执行

#### sed ###

三大基本文本处理工具:
grep
sed(流编辑器)
awk(报告文本的生成器)

sed基本能用法:
sed:Stream EDitor
  sed是一个行编辑器,它只是操作纯ASCII码的文本的,其次它在操作文本的时候,逐行进行
  行编辑器(全屏编辑器:vi)

模式空间
默认情况下不编辑原文件,仅对模式空间中的数据做处理,而后,处理结束后,将模式空间打印至屏幕

sed [options] 'AddressCommand' file ...
  -n:静默模式,不再默认显示模式空间的内容
  -i:直接修改原文件(小心用)
  -e SCRIPT -e SCRIPT:可以同时执行多个脚本
  -f /PATH/TO/SED_SCRIPT :把多个执行的脚本写在一个文件里面,这个文件每一行就是一个脚本,使用-f读取这个文件,也能执行脚本
    sed -f /path/to/scripts file
  -r:表示使用扩展正则表达式

Address:
1、StartLine,EndLine
  比如1,100
  $:最后一行
2、/RegExp/ 使用正则表达式来使用的模式
  /^root/
3、/pattern1/,/pattern2/
  第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行
4、LineNumber
  指定的行
5、StartLine,+N
  从startline开始,向后的N行:一般指N+1行,当前行和后面的N行

Command:
  d:删除符合条件的行
  p:显示符合条件的行(模式一次,打印一次。屏幕打印结果会显示两次,不想显示两次就在命令前使用-n选项)
  a \string:在指定的行后面追加新行,内容为string
  \n:可以用于换行
  i \string:在指定的行前面添加新行,内容为string
  r FILE:将指定的文件内容添加至符合条件的行处
  w FILE:将地址指定范围内的行另存至指定的文件中
  s/pattern/string/:查找并替换,默认只替换每行中第一次被模式匹配到的字符串
    加修饰符:s/pattern/string/修饰符
    g:全局替换
    i:查找时忽略字符大小写
  s///:s###,s@@@..这个分隔符只要三个是一样的都行,不是仅限于斜线

  l..e: like-->liker
    love-->lover

  sed 's/l..e/&r/g' file
  sed 's/(l..e)/\1r/g' file
  如果只匹配前面一部分的时候,只能使用后向引用
  &:引用模式匹配整个串

字符测试:
==:是否相等,相等为真,不等为假
!=:是否不等,不等为真,相等为假
<
>
-n string:测试指定字符串是否为空,空则为真,不空则假
-z string:测试指定字符串是否不空,不空为真,空则为假

循环:进入条件,退出条件
for循环
while循环
until循环

for 变量 in 列表;do
  循环体
done

如何生成列表:
{1..100}
`seq [起始数 [步进长度]] 结束数`

declare:表示声明的意思
-i:integer
-x:声明为环境变量

写一个脚本,计算1-100的和
#!/bin/bash
#
declare -i SUM=0

for I in {1..100};do
  let SUM=$[$SUM+$I]
done
echo "The sum is: $SUM."

10_bash_变量_条件判断及运算_sed_循环的更多相关文章

  1. shell脚本编程(一) 变量、条件判断、循环

    目录   1. shell脚本编程   2. 运行 Shell 脚本有两种方法   3. 变量   4. 本地变量   5. 环境变量   6. 参数变量   7. 多行注释   8. if条件判断 ...

  2. 【01】Python 环境变量、条件判断、循环、基本运算符

    1 环境变量 1.1 Windows下环境变量 系统变量Path中要加入Python安装路径: C:\xxxx\Python36;C:\xxxx\Python36\Scripts; 2 条件判断 2. ...

  3. python学习_条件判断语句_if

    #条件判断语句(if)#语法:if条件表达式:语句# 代码块#执行流程:if语句在执行时,会先对条件表达式进行求值判断#如果为True,则执行if后面的语句#如果为False,则不执行#默认情况下,i ...

  4. python-if条件判断与while/for循环

    条件判断if 让计算机像人一样,能判断是非对错,根据条件做一些事情. if ''' ------ if代码结构:------- if 条件: 代码体 tips:同一缩进范围内的代码被视作同一代码体,p ...

  5. python条件判断if···else、循环while和for

    1.if···else条件判断基本语法 if 条件: 执行语句 elif 条件 : 执行语句 …… else : 执行语句 var=input("请输入表示会员级别的数字(1-5):&quo ...

  6. python初识,变量,条件判断语句,基本数据类型,while循环语句

    python文件后缀可以是任意,但是导入模块时不用.py后缀时会报错 python文件的两种执行方式: python解释器 python文件路径 进入python解释权,事实获取执行结果 在Linux ...

  7. Swift 常量、变量、条件判断

    - 常量用 let ,变量用 var - // Optional为可选项,// 可用类型值 + ? 代替 let x: Optional = 10 let y: Int? = 5 print(x! + ...

  8. js !!条件判断或运算的作用

    今天看到一个判断语句非常奇怪: if(!!selected){} //为什么是双'!'号呢? 自己查了下资料终于明白了这其中的原理: 原来'!!'会将表达式转为Boolean类型的数据. 如果'!un ...

  9. py定义变量-循环-条件判断

    定义变量 # print('hahaha')name = " let'go "title = '刘伟长得 "很帅"!'conent = '''     let' ...

随机推荐

  1. 支持向量机(SVM)

    SVM 简介 SVM:Support Vector Machine , 支持向量机, 是一种分类算法. 同Logistic 分类方法目的一样,SVM 试图想寻找分割线或面,将平面或空间里的样本点一分为 ...

  2. mysql 日期 字符串

    Mysql 中字符串转时间跟Oracle略不同,函数为 str_to_date 应注意的是里面的大小写 如下: MySQL内置函数,在mysql里面利用str_to_date()把字符串转换为日期. ...

  3. 【QT】Pycharm add QT Desinger

    1. https://www.cnblogs.com/dalanjing/p/6978373.html -m PyQt5.uic.pyuic  $FileName$ -o $FileNameWitho ...

  4. Netflix是怎样运行的(极度简化版)— 每次点击播放按钮背后的复杂东西

    Netflix是怎样运行的(极度简化版)- 每次点击播放按钮背后的复杂东西 本文摘译自 How Netflix works: the (hugely simplified) complex stuff ...

  5. win 下 python ImportError: No module named requests

    第一次弄爬虫,报库找不到,网上找了半天,一般都让都让改成绝对路径...那不是饮鸩止渴嘛. 然后 在无意中发现,不需要控制台输入pip命令,因为不是在Linux下啊,,win下直接在pycharm里添加 ...

  6. 爬虫---爬虫er与反爬虫er之间的斗争 转发

    转自:昵称:python修行路 https://www.cnblogs.com/zhaof/p/7326260.html

  7. C++中浮点数比较大小,即小数比较大小

    浮点数比较大小,由于精度问题,所以直接比较有时可能会出错. 单精度数7位有效数字. (float)双精度数16位有效数字.(double) 单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^ ...

  8. 使用Configuration Extensions读取配置

    使用Configuration Extensions读取配置 Configuration Extensions 是微软基于Configuration的扩展,能够很好的解析系统遇到各种配置文件,包括js ...

  9. nginx ../logs/nginx.pid" failed (2: No such file or directory)

    [1]nginx.pid相关 (1)可能出现两种场景: 1.1 nginx.pid文件不存在 发生现象:nginx: [error] open() "/usr/local/lib/ubcsr ...

  10. MOS管的低端驱动和高端驱动

    低端功率开关驱动电路的工作原理 低端功率开关驱动的原理非常简单,就是负载一端直接和电源正端相连,另外一端直接和开关管相连,正常情况下,没有控制信号的时候,开关管不导通,负载中没有电流流过,即负载处于断 ...