TangWei's Studio

shell脚本编程基础(1)

Word count: 2,819 / Reading time: 11 min
2018/04/10 Share

shell脚本编程基础(1)

一、编程基础

1.什么是程序?

程序是指:指令+数据

程序编程风格可分为:

  • 过程式:以指令为中心,数据服务于指令(关注过程,小软件开发)

  • 对象式:以数据为中心,指令服务于数据(关注结果,适合开发大型软件)

2.程序的执行方式

计算机:运行二进制命令

编程语言:

  • 低级:汇编

  • 高级:

编译:高级语言–>编译器–>目标代码 (由程序员完成编译器翻译过程,安全性相对好)

  • java,C#

解释:高级语言–>解释器–>机器代码 (由电脑完成解释器翻译过程,安全性不如编译型)

  • shell,perl,python

shell程序:提供了编程能力,解释执行

3.编程基本概念

编程逻辑处理方式:

  • 顺序执行

  • 循环执行

  • 选择执行

shell编程:过程式、解释执行

编程语言的基本结构:种系统命令的组合

数据存储:变量、数组

表达式:a+b

语句:if

二、脚本基本格式

1.格式要求:

首行shebang机制(即声明脚本使用哪种编程语言)

1
#!/bin/python

2.shell脚本的用途有:

  • 自动化常用命令

  • 执行系统管理和故障排除

  • 创建简单的应用程序

  • 处理文本或文件

3.运行脚本:

  • 1.给予执行权限,执行

  • 2.直接运行解释器,将脚本作为解释器程序的参数运行

4.脚本规范:

脚本代码开头约定:

  • 1.第一行一般为调用使用的语言

  • 2.程序名,避免更改文件名为无法找到正确的文件

  • 3.版本号

  • 4.更改后的时间

  • 5.作者相关信息

  • 6.该程序的作用,及注意事项

  • 7.最后是各版本的更新简要说明

5.脚本示例:

#!/bin/bash
# ——————————————
# Filename:    hello.sh # Revision:    1.1
# Date:        2018/04/01
# Author:      wangx
# Email:       wangx@gmail.com
# Website:     www.donlihuoguo.cn
# Description: This is the first script
# ——————————————
# Copyright:   2018 wang
# License:     GPL  echo “hello world”

6.脚本调试:

  • bash -n script 检查脚本的语法错误

  • bash -x script 调试脚本执行

三、变量

1.定义变量时,变量名不加$符号,如:

my_name=”wangx”

2.变量命名规则:

  • 1.数字、字母、下划线,不能以数字开头

  • 2.不能使用程序中的保留字:如if,for等

  • 3.做到见名知意

注意:

  • 引用变量一般需加$

赋值变量:

  • name=” ” 要加引号

  • 存放多行字符时”$name”变量外加双引号可保留换行格式

3.bash变量的种类

局部变量、全局变量、本地变量、位置变量、特殊变量

  • 局部变量:只在当前shell进程生效,对当前shell之外其他shell进程,包括父shell和子shell都无效

  • 全局变量:生效范围在当前shell进程及其子进程;父进程变量可以传给子进程,子进程变量不可向上传给父进程

  • 数字变量:\$10以上的变量需要加花括号${10}

  • 特殊变量:\$1,\$@,\$*,\$#,\$0等、

  • \$1,\$2,…:对应第1、第2参数,shift[n]换位置

  • $0:命令本身

  • $*:传递给脚本的所有参数,每个参数合为一个字符串

  • $@:传递给脚本的所有参数,每个参数为独立字符串

  • $#:传递给脚本的参数的个数

  • \$@$*只在被双引号包起来的时候才会有差异

set– 清空所有位置变量

注:怎么判断变量前加不加$符号?

如果命令能识别变量就不加\$,如果命令不能识别变量加\$;

养成好习惯:编完脚本将变量用unset删掉;

()中使用的命令为一次性的,小括号中相当于在子进程中执行命令

注:小括号中所说的子进程与常规的子进程不是一回事

例如:x=1;echo $$;(echo $$)中显示进程号一致

{ ;}中使用命令时在当前shell环境中执行,不开启子进程影响当前shell环境

4.变量运算

bash中的算术运算:help let

+,-,*,/,%取余,**乘方

实现算术运算:

  • 1.let var=算术表达式

  • 2.var=$[算术表达式]

  • 3.var=$((算术表达式))

注:算术运算过程中,空格尽量删除

条件测试过程中,能加空格地方尽量加空格

正则条件测试时,正则表达式不加引号

四、条件测试

1.测试命令:

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]] 双括号一般用于左侧字符匹配右侧扩展正则表达式

注:EXPRESSION前后必须有空白字符

评估布尔声明,以便用在条件性执行中:

  • 若真,则返回0

  • 若假,则返回1

例如:#a=1;b=2

#[ $a -eq $b ]
#echo $?
#1
#a=2;b=2
#[ $a -eq $b ]
#echo $?
#0

条件性的执行操作符

  • &&代表条件性的AND THEN,前面执行结果$?=0时,继续执行&&后命令

  • ||代表条件性的OR ELSE,前面执行结果$?不为0时,执行||后命令

test 与[ ]效果相同,注意括号里内容两边需加空格

  • -v VAR 变量VAR是否设置

2.数值测试:

  • -gt 是否大于(greater-than)

  • -ge 是否大于等于(greater-than-or-equal)

  • -eq 是否等于(equal)

  • -ne 是否不等于(not-equal)

  • -lt 是否小于(less-than)

  • -le 是否小于等于(less-than-or-equal)

3.字符串测试:

  • == 是否等于

  • > ascii码是否大于ascii码

  • < 是否小于

  • != 是否不等于

  • =~ 左侧字符串是否能够被右侧的PATTERN所匹配

注:使用PATTERN匹配时,需要加双括号[[ ]];使用扩展的正则表达式,且正则表达式不能加引号

  • -z 字符串是否为空,空为真,不空为假

  • -n 字符串是否为不空,不空为真,空为假

注:用于字符串比较时的用到的操作应该都使用引号

字符串是否为空还可用[ “$name” == “” ]来测试。

4.文件相关测试:

存在性测试:

  • -a FILE 同-e

  • -e FILE 文件存在性测试,存在为真,否则为假

5.存在性及类别测试:

  • -b FILE 是否存在且为块设备文件

  • -c FILE 是否存在且为字符设备文件

  • -d FILE 是否存在且为目录文件

  • -f FILE 是否存在且为普通文件

  • -h FILE 同-L

  • -L FILE 是否存在且为符号链接文件

  • -p FILE 是否存在且为管道文件

  • -S FILE 是否存在且为套接字文件

6.文件权限测试:

  • -r FILE 是否存在且有可读权限

  • -w FILE 是否存在且有可写权限

  • -x FILE 是否存在且有可执行权限

7.文件特殊权限测试:

  • -u FILE 是否存在且拥有suid权限

  • -g FILE 是否存在且拥有sgid权限

  • -k FILE 是否存在且拥有sticky权限

8.文件大小测试:

  • -s FILE 是否存在且非空

9.文件是否打开:

  • -t fd:fd 文件描述符是否在终端已经打开

  • -N FILE 文件自从上一次被读取之后是否被修改过

  • -O FILE 当前有效用户是否为文件属主

  • -G FILE 当前有效用户是否文文件属组

注意:文件测试后跟空字符时,也反馈为True,如果要保证一个文件存在且满足测试条件时,

应表示为:例:[ -n “file” -a -d “file” ]

file文件是否存在且为目录文件

10.双目测试:

  • FILE1 -ef FILE2 FILE1是否是FILE2的硬链接

  • FILE1 -nt FILE2 FILE1是否新于FILE2(mtime)

  • FILE1 -ot FILE2 FILE1是否旧于FILE2

11.Bash的组合测试条件:

第一种方式:
  • COMMAND1 && COMMAND2 并且

  • COMMAND1 || COMMAND2 或者

  • !COMMAND 非

第二种方式:
  • [ EXPRESSION -a EXPRESSION ] 并且

  • [ EXPRESSION -o EXPRESSION ] 或者

  • [ !EXPRESSION ] 非

注:优先级为:”!”最高,”-a”次之,”-o”最低

短路与&&
  • 0&&0=0

  • 0&&1=0

  • 1&&0=0

  • 1&&1=1

cmd1 && cmd2

如果cmd1为假,cmd2不需要执行,反之cmd1为真,需要cmd2执行

短路或||
  • 0||0=0

  • 0||1=1

  • 1||0=1

  • 1||1=1

cmd1 || cmd2

如果cmd1为真,cmd2不需要执行,反之cmd1为假,需要cmd2执行

异或 XOR ^

如果相同为假,反则为真

  • 0 ^ 1 = 1

  • 1 ^ 0 = 1

  • 1 ^ 1 = 0

  • 0 ^ 0 = 0

注意:[ ]和test用变量时,最好加双引号””避免出问题

false || { echo cmd1 ; echo cmd2 ; }

false || (echo cmd1 ; echo cmd2)

12.使用read命令来接受输入

read 使用read来把输入值分配给一个或多个shell变量

  • -p 指定要显示的提示

  • -s 静默输出,一般用于密码

  • -n N指定输入的字符长度N

  • -d ‘字符’输入结束符,类型与输入重定向的<<EOF

  • -t N TIMEOUT为N秒,N秒内无输入将自动退出

read命令从标准输入中读取单词,并给每个单词分配一个变量

例如:

read -p “Enter a filename:” FILE 标准输入将赋予变量$FILE

read命令从标准输入中读取单词,并给每个单词分配一个变量

read 给多个变量赋值的方法:

(1)将多个变量输入一个文件中,用空格分开,输出重定向

read a b c < f

(2)用“>>>”分开:

read a b c <<< “x y z”

五、配置用户环境

1.bash的配置文件

按生效范围划分,存在两类:

全局配置:
  • /etc/profile

  • /etc/profile.d/*.sh

  • /etc/bashrc

个人配置:
  • ~/.profile

  • ~/.bashrc

2.shell登录的两种方式:

交互式登录:
  • 1.直接输入账号密码登录

  • 2.su – username 切换的用户

执行顺序:/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc–> /etc/bashrc

非交互式的登录:
  • 1.su usernme

  • 2.图形界面打开的终端

  • 3.执行脚本

  • 4.任何其他的bash实例

执行顺序:~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh

注:只在交互式登录生效:/etc/profile,~/.bash_profile

配置执行文件按功能划分,存在两类:

profile类和bashrc类

Profile类:为交互式登录的shell提供配置

  • 全局生效:/etc/profile ,/etc/profile.d/*.sh

  • 个人生效:~/.bash_profile

功用:

  • (1)用于定义环境变量

  • (2)运行命令或脚本

Bashrc类:为非交互式和交互式登录的shell提供配置

  • 全局生效:/etc/bashrc

  • 个人生效:~/.bashrc

功用:

  • (1)定义命令别名和函数

  • (2)定义本地变量

修改profile和bashrc文件后使生效的两种方法:

  • (1)重新启动shell进程

  • (2).或sourc;例:.~/.bashrc

注意: .或source执行脚本表示将在当前进程运行,而不是开启一个子进程运行(配置文件一般用此方式执行)

bash执行脚本则是开启一个进程执行(运行脚本一般用此方式执行)

Bash退出任务
保存在~./.bash_logout文件中(用户)

在退出登录shell时运行

可用于:

  • 创建自动备份

  • 清除临时文件

  • 清除操作历史等

  • 特殊的变量$-

    #echo $-

    #hibBH

  • h:hash缓存功能;set -h,关闭hash功能;set +h,开启hash功能

  • i:代表交互式shell

  • m:打开监控模式

  • B:大括号扩展

  • H:history,命令操作历史

bash展开命令的优先级:
  • 把命令行分成单个命令词

  • 展开别名

  • 展开大括号{}

  • 展开波浪符~

  • 命令替换$()和

  • 再次把命令行分成命令词

  • 展开文件通配(*、?等)

  • I/O重定向

  • 运行命令

CATALOG
  1. 1. shell脚本编程基础(1)
    1. 1.1. 一、编程基础
      1. 1.1.1. 1.什么是程序?
      2. 1.1.2. 2.程序的执行方式
      3. 1.1.3. 3.编程基本概念
    2. 1.2. 二、脚本基本格式
      1. 1.2.1. 1.格式要求:
      2. 1.2.2. 2.shell脚本的用途有:
      3. 1.2.3. 3.运行脚本:
      4. 1.2.4. 4.脚本规范:
      5. 1.2.5. 5.脚本示例:
      6. 1.2.6. 6.脚本调试:
    3. 1.3. 三、变量
      1. 1.3.1. 1.定义变量时,变量名不加$符号,如:
      2. 1.3.2. 2.变量命名规则:
      3. 1.3.3. 3.bash变量的种类
      4. 1.3.4. 4.变量运算
    4. 1.4. 四、条件测试
      1. 1.4.1. 1.测试命令:
      2. 1.4.2. 2.数值测试:
      3. 1.4.3. 3.字符串测试:
      4. 1.4.4. 4.文件相关测试:
      5. 1.4.5. 5.存在性及类别测试:
      6. 1.4.6. 6.文件权限测试:
      7. 1.4.7. 7.文件特殊权限测试:
      8. 1.4.8. 8.文件大小测试:
      9. 1.4.9. 9.文件是否打开:
      10. 1.4.10. 10.双目测试:
      11. 1.4.11. 11.Bash的组合测试条件:
        1. 1.4.11.1. 第一种方式:
        2. 1.4.11.2. 第二种方式:
        3. 1.4.11.3. 短路与&&
        4. 1.4.11.4. 短路或||
        5. 1.4.11.5. 异或 XOR ^
      12. 1.4.12. 12.使用read命令来接受输入
    5. 1.5. 五、配置用户环境
      1. 1.5.1. 1.bash的配置文件
        1. 1.5.1.1. 全局配置:
        2. 1.5.1.2. 个人配置:
      2. 1.5.2. 2.shell登录的两种方式:
        1. 1.5.2.1. 交互式登录:
        2. 1.5.2.2. 非交互式的登录:
        3. 1.5.2.3. 配置执行文件按功能划分,存在两类:
        4. 1.5.2.4. bash执行脚本则是开启一个进程执行(运行脚本一般用此方式执行)
        5. 1.5.2.5. bash展开命令的优先级: