shell编程基础一

变量 算术|字符|条件测试

1、shell编程:过程式、解释执行 
2、shell脚本基础 
  2.1shell脚本: 包含一些命令或声明,并符合一定格式的文本文件 
  2.2格式要求:首行shebang机制 
     #!/bin/bash 
     #!/usr/bin/python 
     #!/usr/bin/perl 
  2.3shell脚本的用途有: 
     自动化常用命令 
     执行系统管理和故障排除 
     创建简单的应用程序 
     处理文本或文件   
3、创建shell脚本 
  3.1第一步:使用文本编辑器来创建文本文件 
     第一行必须包括shell声明序列:#! 
     #!/bin/bash 
     添加注释,注释以#开头 
  3.2第二步:运行脚本 
     给予执行权限,在命令行上指定脚本的绝对或相对路径 
     直接运行解释器,将脚本作为解释器程序的参数运行 
4、脚本代码开头约定 
  4.1第一行一般为调用使用的语言 
  4.2程序名,避免更改文件名为无法找到正确的文件 
  4.3版本号 
  4.4更改后的时间 
  4.5作者相关信息 
  4.6该程序的作用,及注意事项 
  4.7最后是各版本的更新简要说明
5、脚本测试
  5.1检测脚本中的语法错误 
     bash -n /path/to/some_script
  5.2调试执行
     bash -x /path/to/some_script 
3A3_)7H{]W(MOWJAUXY1(VV
6、变量 
  6.1强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必
  须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误 
  如 java,c# 
  6.2弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进
  行隐式类型转换;变量无须事先定义可直接调用 
   如:bash不支持浮点数,php 
  6.3变量命名法则: 
    6.3.1不能使程序中的保留字:例如if, for 
    6.3.2只能使用数字、字母及下划线,且不能以数字开头 
    6.3.3见名知义 
  6.4统一命名规则:驼峰命名法 
7、bash中变量的种类 
  根据变量的生效范围等标准划分下面变量类型: 
  7.1局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的
  shell进程均无效 
`3W5F[74$TNZ20J2$)SUL%9
>>------------------------------------------------------------------------------------
  变量赋值:name=‘value’ 
  可以使用引用value: 
   (1) 可以是直接字串; name=“root" 
   (2) 变量引用:name="$USER" 
   (3) 命令引用:name=`COMMAND` name=$(COMMAND) 
 变量引用:${name} $name 
    "":弱引用,其中的变量引用会被替换为变量值 
    '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串 
AQGYGTD659])IA1B~O$3C`9
 显示已定义的所有变量:set 
(`J%`C@GXN3G{XAAG0M%IHA
 删除变量:unset name 
注:name=$name和name="$name"有区别,如果name值为多行字符,后者可保持原字符格式,不自动合并
@5N{%0[31YOCT%3@$5FDQ)F
<<------------------------------------------------------------------------------------
  7.2环境(全局)变量:生效范围为当前shell进程及其子进程 
>>------------------------------------------------------------------------------------
 变量声明、赋值: 
   export name=VALUE 
   declare -x name=VALUE 
Y)I693QX%ZF9Y898FS$K~M0
---->pstree命令可查看当前进程位置
2}7R~@L}5[]R0VI7SHZ0~6A
6D9B@}E{OVURF3{Y[K0F~S9
 变量引用:$name, ${name} 
 显示所有环境变量: 
  env 
  printenv 
  export 
  declare -x 
MAK4~6`5}S6YK$T{`YFA
 删除变量: 
  unset name
<<----------------------------------------------------------------------------------- 
  7.3本地变量:生效范围为当前shell进程中某代码片断,通常指函数 
  7.4位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数 
>>------------------------------------------------------------------------------------
 只读变量:只能声明,但不能修改和删除 
 声明只读变量: 
   readonly name 
   declare -r name 
U8@Y_~[9F)4%K~5AUJN0T]X
 查看只读变量: 
   readonly –p 
1Z2NRHAL0I1E_A7}(KK$X%N
位置变量:在脚本代码中调用通过命令行传递给脚本的参数 
   $1, $2, ...:对应第1、第2等参数,shift [n]换位置 
   $0: 命令本身 
   $*: 传递给脚本的所有参数,全部参数合为一个字符串 
   $@: 传递给脚本的所有参数,每个参数为独立字符串 
   $#: 传递给脚本的参数的个数 
   $@ $* 只在被双引号包起来的时候才会有差异 
 set -- 清空所有位置变量 
<<------------------------------------------------------------------------------------
  7.5特殊变量:$?, $0, $*, $@, $#,$$ $_
    $$:当前进程PID
    $_:上一条命令最有一个参数
注:(list)表示在小括号里创建当前进程子进程,运行结束退出,无显示信息
    { list; }只影响当前进程
L@K21$}SE(IJG~P73UW@M3D
---->x=1;echo $$;(echo $$;echo "subx=$x";x=2;echo "subx2=$x");echo "x=$x"
(}PWWE%(Z7%[TAYCH0~FV29
注:subshell中的$$取到的仍然是父进程bash的pid,如果想要取到subshell的pid,可以使用BASHPID变

8、退出状态 
 进程使用退出状态来报告成功或失败 
   0 代表成功,1-255代表失败 
   $? 变量保存最近的命令退出状态 
 例如: 
   ping -c1 -W1 hostdown &> /dev/null 
   echo $? 
---->ping命令,通过icmp包协议探测对方主机是否在线,一般局域网使用
   -c :表示ping次数,也就是icmp包个数
   -W:timeout,
9、退出状态码 
  bash自定义退出状态码 
    exit [n]:自定义退出状态码 
  注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字 
  注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行最后一条命令的状态码 
10、算术运算 
  bash中的算术运算:help let 
    +, -, *, /, %取模(取余), **(乘方) 
  实现算术运算: 
   (1) let var=算术表达式 
   (2) var=$[算术表达式] 
   (3) var=$((算术表达式)) 
   (4) var=$(expr arg1 arg2 arg3 ...) 
   (5) declare –i var = 数值 
   (6) echo ‘算术表达式’ | bc 
  乘法符号有些场景中需要转义,如* 
  bash有内建的随机数生成器:$RANDOM(0-32767) 
    echo $[$RANDOM%50] :0-49之间随机数 
赋值 
  增强型赋值: 
    +=, -=, *=, /=, %= 
  let varOPERvalue 
    例如:let count+=3 
    自加3后自赋值 
  自增,自减: 
    let var+=1 
    let var++ 
    let var-=1 
    let var-- 
11、bash的数值测试 
     -v VAR :变量VAR是否设置 
   数值测试: 
    -gt 是否大于 
    -ge 是否大于等于 
    -eq 是否等于 
    -ne 是否不等于 
    -lt 是否小于 
    -le 是否小于等于 
12、字符串测试: 
     == 是否等于 
     > ascii码是否大于ascii码 
     < 是否小于 
     != 是否不等于 
     =~ 左侧字符串是否能够被右侧的PATTERN所匹配 
 注意: 此表达式一般用于[[ ]]中;扩展的正则表达式 
     -z "STRING“ 字符串是否为空,空为真,不空为假 
     -n "STRING“ 字符串是否不空,不空为真,空为假 
注意:用于字符串比较时的用到的操作数都应该使用引号 
13、Bash的文件测试 
  存在性测试 
   -a FILE:同-e 
   -e FILE: 文件存在性测试,存在为真,否则为假 
  存在性及类别测试 
   -b FILE:是否存在且为块设备文件 
   -c FILE:是否存在且为字符设备文件 
   -d FILE:是否存在且为目录文件 
   -f FILE:是否存在且为普通文件 
   -h FILE 或 -L FILE:存在且为符号链接文件 
   -p FILE:是否存在且为命名管道文件 
   -S FILE:是否存在且为套接字文件
   -s FILE:是否存在且不是空文件
14、文件权限测试: 
     -r FILE:是否存在且可读 
     -w FILE: 是否存在且可写 
     -x FILE: 是否存在且可执行 
   文件特殊权限测试: 
     -u FILE:是否存在且拥有suid权限 
     -g FILE:是否存在且拥有sgid权限 
     -k FILE:是否存在且拥有sticky权限  
 15、文件大小测试: 
    -s FILE: 是否存在且非空 
  文件是否打开: 
   -t fd: fd 文件描述符是否在某终端已经打开 
   -N FILE:文件自从上一次被读取之后是否被修改过 
   -O FILE:当前有效用户是否为文件属主 
   -G FILE:当前有效用户是否为文件属组 
16、双目测试: 
   FILE1 -ef FILE2: FILE1是否是FILE2的硬链接 
   FILE1 -nt FILE2: FILE1是否新于FILE2(mtime) 
   FILE1 -ot FILE2: FILE1是否旧于FILE2
17、bash的组合测试条件 
  第一种方式: 
   COMMAND1 && COMMAND2 并且 
   COMMAND1 || COMMAND2 或者 
   ! COMMAND 非 
     如:[[ -r FILE ]] && [[ -w FILE ]] 
  第二种方式: 
   EXPRESSION1 -a EXPRESSION2 并且 
   EXPRESSION1 -o EXPRESSION2 或者 
   ! EXPRESSION 
注:必须使用测试命令进行  
18、使用read命令来接受输入 
  使用read来把输入值分配给一个或多个shell变量 
   -p 指定要显示的提示 
   -s 静默输入,一般用于密码 
   -n N 指定输入的字符长度N 
   -d ‘字符’ 输入结束符 
   -t N TIMEOUT为N秒 
read 从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量 
  read -p “Enter a filename: “ FILE 






 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/95621

(0)
parrotparrot
上一篇 2018-04-10
下一篇 2018-04-10

相关推荐

  • Linux的发行版 不同发行版之间的联系与区别

    1、Debian:三大主流发行版之一
    2、slackware:三大主流发行版之一
    3、redhat:三大主流发行版之一

    Linux笔记 2018-05-11
  • lvs调度方案和应用场景

    ipvs scheduler: 根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种: 静态方法:仅根据算法本身进行调度; RR:roundrobin,轮询; WRR:Weighted RR,加权轮询; SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的…

    Linux笔记 2018-07-02
  • iproute家族命令

    1 ifconfig up 启动指定网络设备/网卡down 关闭指定网络设备/网卡-a 显示全部接口信息-s 显示摘要信息add 设置指定网卡配置IPv6地址del 删除指定网卡配置IPv6地址mtu<字节数> 设置网卡的最大传输单元(bytes)netmask<子网掩码>设置网卡的子网掩码multicast 为网卡设置组播标志 例子…

    Linux笔记 2018-04-15
  • Linux

    Linux 系统启动过程和Linux系统目录介绍

    Linux笔记 2018-04-05
  • 文本三剑客之AWK

    简要概括AWK

    2018-05-27
  • Linux 文本工具

    grep

    2018-04-11