shell 基础
脚本格式
shell脚本:文本文件 #!/bin/bash #!/usr/bin/python shebang: magic number:魔数 运行脚本: 1.给予执行权限,通过具体的文件路径指定文件执行 ./test.sh 2.直接运行解释器,将脚本作为解释器程序的参数运行 sh test.sh
shell 变量
变量类型: 数据存储格式,存储空间大小,参与运算种类 字符型: 数值型: 整型 浮点型 强类型:定义变量时必须指定类型,参与运算必须符合类型要求,调用未声明变量会产生错误 弱类型:无须指定类型,默认均为字符型,参与运算会自动进行隐式类型转换,变量无须事先定义可以直接调用 定义环境变量:declare -x bash中的变量的种类: 根据变量的生效范围等标准: 本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效 环境变量:生效范围为当前shell进程,及其子进程. 局部变量:生效范围为当前shell进程中某代码片段(通常指函数) 位置变量:$1,$2....用于让脚本在脚本代码中调用通过命令行传递给它的参数 特殊变量:$?,$0,$*,$@,$# 本地变量: 变量赋值:name='value' 可以使用引用: value: 可以是直接字符串:name="username" 变量引用:name="$username" 命令引用:name=`COMMAND`,name=$(COMMAND) 变量引用:${name},$name "":弱引用,其中的变量引用会被替换为变量值 '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串 显示已定义的所有变量: set 销毁变量: unset name 环境变量: 变量声明,赋值 export name=VALUE declare -x name=VALUE 变量引用:$name,${name} 显示所有环境变量: export env printenv 销毁: unset name bash有许多内建的环境变量:PATH,SHELL,UID,HISTSIZE,HOME,PWD,OLD,HISTFILE,PS1 变量命名法则: 1.不能使程序中的保留字,如if,for 2.只能使用数字,字母及下划线,且不能以数字开头 3.见名知义 只读变量: readonly name declare -r name 位置变量: 在脚本代码中调用通过命令行传递给脚本的参数 $1,$2...:对应调用第1,第2...等参数 shift [n]:换岗操作,会剔除shift n $0:命令本身 $*:传递给脚本的所有参数,把所有参数当做1个字符串 $@:传递给脚本的所有参数,把每个参数当做1个字符串 $#:传递给脚本的参数个数
环境配置文件
按生效范围划分,两类: 全局配置: /etc/profile /etc/profile.d/*.sh /ect/bashrc 个人配置 ~/.bash_profile ~/.bashrc 按功能划分,两类: profile类:为交互式登录的shell提供配置 全局:/etc/profile /etc/profile.d/*.sh 个人:~/.bash_profile 功用: 定义环境变量 运行命令或脚本 bashrc类:为非交互式登录的shell提供配置 全局:/ect/bashrc 个人:~/.bashrc 功用: 定义命令别名 定义本地变量 shell登录: 交互式: 直接通过终端输入账号密码登录 使用su - username 或su -l username切换的用户 /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc 非交互式: su username 图形界面下打开的终端 执行脚本 ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh 编辑配置文件定义的新配置的生效方式: 1.重新启动shell进程 2.使用source或.命令 问题: 1.定义对所有用户都生效的别名 2.让用户的PATH环境变量的值多出一个路径,例如/usr/bin/local/apache2/bin 管理员:~/.bash_profile 用户:
算数运算
+,-,*,/,%, 实现算数运算: 1. let var=算数表达式 2. var=$[算数表达式] 3. var=$((算数表达式)) 4. var = $(expr arg1 arg2 arg3 ...) 乘法符合有些场景中需要转义 bash有内建随机数生成器:$RANDOM 增强型赋值: +=,-=,*=... let varOPERvalue 例如:let count+=1 自增,自减: let var+=1 let var++ let var -=1 let var--
条件测试
条件测试:判断某需求是否满足,需要有测试机制来实现, 注意:专用的测试表达式需要由测试命令辅助完成测试过程 测试命令: test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]] 注意:EXPRESSION前后必须有空格存在,否则语法错误 测试类型: 数值测试: -gt:是否大于 -ge:大于等于 -eq:等于 -ne:不等于 -lt:小于 -le:小于等于 字符串测试: ==:等于 >:大于 <:小于 !=:不等于 =~:左侧字符串是否能被右侧PATTERN所匹配 注意:此种表达式一般用于[[]] -z "STRING":测试字符串是否为空,空则为真,不空为假 -n "string":是否不为空 注意:用于字符串比较时用到的操作数都应该使用引号 文件测试: 存在性测试 -a FILE -e FILE:文件存在性测试,存在为真,不存在为假 存在性及类别 -b FILE:是否存在且为块设备文件 -c FILE:是否存在且为字符设备文件 -d FILE:是否存在且为目录文件 -f FILE:是否存在且为普通文件 -h FILE 或 -l FILE:存在且为符号链接文件 -p FILE:是否存在且为命名管道文件 -S FILE:是否存在且为套接字文件 文件权限测试: -r FILE:是否存在且拥有读权限 -w FILE:是否存在且拥有可写权限 -x FILE:是否存在且可执行 文件特殊权限测试: -g FILE:是否存在且拥有sgid权限 -u FILE:是否存在且拥有suid权限 -k FILE:是否存在且拥有sticky权限 文件大小测试: -s FILE:是否存在且非空 文件是否打开: -t fd:fd表示文件描述符,是否以及打开且与某终端相关 -N FILE:文件自从上一次被读取后是否被修改过 -O FILE:当前有效用户是否为文件属主 -G FILE:当前有效用户是否为文件数组 双目测试: FILE1 -ef FILE2:FILE1和FILE2是否执行同一个设备上的相同iNode FILE1 -nt FILE2:FILE1是否新于FILE2 FILE1 -ot FILE2:FILE1是否旧于FILE2
组合测试条件
逻辑运算: 第一种方式: COMMAND1 && COMMAND2 COMMAND1 || COMMAND2 ! COMMAND [ -e FILE ] && [ -r FILE ] 第二种方式: [ EXPRESSION1 -a EXPRESSION2 ] [ EXPRESSION1 -o EXPRESSION2 ] [ ! EXPRESSION ] 必须使用测试命令进行: [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
自定义退出状态码
exit [n]:自定义退出状态码
注意:脚本中遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码