Shell Scripting Fundamentals for Programming Basics
程序:指令+数据 程序: 算法+数据结构数据:是程序的核心数据结构:数据在计算机中的类型和组织方式算法: 处理数据的方式程序编程风格:过程式 :以指令为中心,数据服务于指令对象式 : 以数据为中心,指定服务于数据shell程序: 提供了编程能力,解释执行
How the program is executed
计算机:运行二进制指令编程语言:人与计算机之间交互的语言低级编程语言:机器:二进制的0和1的序列低级:汇编高级编程语言:编译:高级语言---编译器---机器代码---执行 c, c++解释:高级语言--执行--×××--机器代码 shell python java
BASIC Programming Concepts:
编程逻辑处理方式: 顺序执行 循环执行 选择执行shell编程:过程式,解释执行 编程语言的基本结构 各种系统命令的组合 数据存储:变量,数组表达式:a+bshell脚本基础
Shell script:
contain some commands or declarations and conform to a certain format text file
Format requirements: First line shebang mechanism
#! /bin/bash
#! /usr/bin/python
The uses of shell scripts are:
自动化常用命令创建简单的应用程序处理文本或文件执行系统管理和故障排除
Create a shell script
第一步:使用文本编辑器来创建文本文件第一行必须包括shell声明序列 :#! #! /bin/bash 添加注释 注释以#开头第二步:运行脚本给予执行权限,在命令行上指定脚本的绝对或相对路径直接运行解释器,将脚本作为解释器程序的参数运行
Scripting specifications
1:第一行一般为调用的语言2:程序名,避免更改文件名为无法找到的文件3:版本号4:更改后的时间5:作者相关信息6:该程序的作用,及注意事项7:最后是个版本的更新简要说明
Script debugging
检测脚本中的语法错误bash -n /path/to/some_script调试执行bash -x /path/to/some_script
Variable
变量:命令的内存空间 数据存储方式 字符 数值:整型,浮点型变量:变量类型 作用: 1:数据存储格式 2:参与的运算 3:表示的数据范围类型: 字符 数值:整型,浮点型
Variable:
强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转 换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明 变量会产生错误 如 java,c# 弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符 型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用 如:bash 不支持浮点数,php
Variable command rule:
1:不能使用程序中的保留字:例如if,for2: 只能使用数字3:见名知义4:统一命令规则:驼峰命名法
Types of variables in bash
根据变量的生效范围等标准划分下面变量类型: 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括 当前shell的子shell进程均无效 环境(全局)变量:生效范围为当前shell进程及其子进程本地变量:生效范围为当前shell进程中某代码片段,通常指函数位置变量: :$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它 的参数
Local variables:
局部变量即普通变量 只能当前进程使用 ,子进程不能使用变量赋值:name=‘value’可以使用引用‘value’ (1)可以是直接字符;name=“root“ (2)变量引用:name="$USER" (3) 命令引用:name=`COMMAND` name=$(COMMAND) ?变量引用:${name} $name 变量引用:${name} $name " ":弱引用,其中的变量引用会被替换为变量值 ’ ‘:强引用,,其中的变量引用不会被替换为变量值,而保持原字符串 显示已定义的所有变量:set删除变量:unset name
Environment variables:
环境变量 当前可以使用,子进程也能使用 父进程不能使用 加上export 例如:export name=`hostname`export [只看环境变量] set[所有变量都在里面] unset name [取消删除变量] 变量声明 、赋值: export name=VALUE declare -x name=VALUE
Show all environment variables:
env printenv export declare -x 删除变量: unset name bash内建的环境变量:PATHSHELLUSERUIDHOMEPWDSHLVLLANGMAIL HOSTNAMEHISTSIZE
Read-only and positional variables
只读变量:只能声明,但不能修改和删除 【例:readonly name=dang 这就是只读变量 不能删除但是exit退出来只读变量就没有了】查看已读变量:readonly -p 位置变量::在脚本代码中调用通过命令行传递给脚本的参数 $1, $2, ...:对应第1、第2等参数,shift [n]换位置 $0: 命令本身 $*: 传递给脚本的所有参数,全部参数合为一个字符串 [email protected]: 传递给脚本的所有参数,每个参数为独立字符串 $#: 传递给脚本的参数的个数 [email protected] $* 只在被双引号包起来的时候才会有差异
Exit Status:
进程使用退出状态来报告成功或失败 0 代表成功 1-255代表失败$?变量保存最近的命令退出状态例如: ping -c1 -W1 hostname &>/dev/null echo $?
Exit Status Code
bash自定制退出状态码 exit [n] :自定义退出状态码 注意: 脚本中一旦遇到exit命令,脚本会立刻终止;终止退出状取决于exit命令后面的数字
Logical operation:
true【真】,false【假】 1,0 与: 1 与 1 = 1 1 与 0 = 0 &【代表与】 0 与 1 = 0 0 与 0 = 0 或: 1 或 1 = 1 1 或 0 = 1 0 或 1 = 1 |【代表或】 0 或 0 = 0 逻辑运算非: ! !1=0 !0=1
Short circuit operation
短路与 第一个为0 ,结果必定为0 &&【代表短路与】 第一个为1 ,第二个必须要参与运算例: ls dng &>/dev/null && chmod +x dang 【意思: 如果前面命令存在就给他加执行权限】 短路或 第一个为1 ,结果必定为1 ||【代表短路或】 第一个为0, 第二个必定要参与运算例:id dang &>/dev/unll || useradd dang 【意思: 如果前面没有这个目录就创建】
XOR or the same or
异或:^ 异或的两个值,相同为假,不同为真同或:相同为1 ,不同为0条件性的执行操作符根据退出状态而定,命令可以有条件地运行 && 代表条件性的AND THEN || 代表条件性的OR
Bash's numerical test:
-v VAR变量VAR是否设置数值测试: -gt 是否大于 -ge 是否大于等于 -eq 是否等于 -ne 是否不等于 -lt 是否小于 -le 是否小于等于
Bash's string test
字符串测试: = 是否等于 > ascii码是否大于ascii码 < 是否小于 =~ 左侧字符串是否能够被右侧的PATTERN所匹配 【类似于包含】 注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
[[ ]]
= = Same, the string does not add "" to support wildcard characters
=~ match, string do not add "" support extended regular expression
Bash's file test
存在性测试-a 并且-o 或者-e 文件存在性测试,存在为真不存在为假-b 文件 :是否存在且为块设备文件-c 文件 :是否存在且为字符设备文件 -d 是否 目录文件-f 普通文件-h或-l 链接文件 -p 命令管道文件-S 套接字文件-w 可写文件 -o 当前有效用户是否为文件属组-G 当前有效用户是否为文件属组-r 存在且 可读文件-w 存在且可写文件-x 存在且可执行
Example: View/etc/issue is not a normal file if it is print Shi if it is not printed Bushi
[ -f "/etc/issue" ] && echo shi || echo bushi
View/dev/sda is not a block file if it is print Shi if it is not printed Bushi
[ -b "/dev/sda" ] && echo shi || echo
View F1 is not a normal file and has execute permissions if it is added R permission if not print Bushi
file=f1; [ -f "$file" -a
View F1 If you do not have execute permission, if yes add W permission if not print Bushi
file=f1; [ ! -x "$file" ] && chmod +w "$file"|| echo bushi
Prevent normal users from logging in: Touch/etc/nologin "Create/etc/nologin file"
把 buyunxuputongyonghudengru >/etc/nologin 【把前面字符写入,etc/nologin中 每当普通用户登入时会显示前面的字符】
Use the Read command to accept input
使用read来把输入值分配给一个或多个shell变量 -p 指定要显示的提示 read -p "please input your passwd " passwd 【会显示提示 ,后面的passwd是赋值 就是把前面输入的只赋给passwd】 -s 静默输入,一般用于密码 -n N 指定输入的字符长度N -d ‘字符’ 输入结束符 -t N TIMEOUT为N秒 read 从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量 read -p “Enter a filename: “ FILE read可以同时给几个变量赋值例:read z x c <<< "aa ss dd" 【三个<号】
Shell Programming Basics