关于脚本
编写脚本中出现的三种错误
1.语法错误bash-n 检查语法错误只是检查并不执行 语法错误之后命令不会再执行
Cat - A查看有无特殊符号语法错误
Cat -n列行
- 逻辑错误 后续命令仍会执行
bash-x 逐行执行 每一行命令都会显示出来
Cat test .txt在脚本中加测试代码每隔一段输出出来一次
- 命令错误 仍然会执行后续命令
也是用bash-x命令
关于变量:
变量类型大致分为:环境变量 内置变量 只读变量 位置变量 退出状态码变量 以及自定义变量
1)环境变量:环境变量:
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
变量声明及赋值:#声明并赋值
export name=VALUE
declare -x name=VALUE
变量引用:$name ${name
注意 :变量的值加不加单引号双引号并无区别 但是等号前后不能带空格 如TITLE=cto
显示出变量的值 echo $TITLE echo后面必须加$否则 echo认为后面的是字符串进行输出
变量value的值可以是多种结果
我们可以把一个变量的值赋给另一个 如NAME=$TITLE
脚本中的变量只在脚本中使用 在
子进程的变量在父进程或者其他地方是看不到的
Echo 两个变量的时候 中间不能添加下划线否则 echo认为是一个整体只会输出一个变量
Env显示环境变量
$?的值是由最后一条决定的 中间错误不会影响显示
2)只读变量:只读变量:只能声明定义,但后续不能修改和删除,即常量
3)声明只读变量:
readonly name
declare -r name
查看只读变量:readonly [-p]
declare -r
4)位置变量 ;位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
5)退出状态码变量:当我们浏览网页时,有时会看到下图所显示的数字,表示网页的错误信息,我们称为状态码,在shell脚本中也有相似的技术表示程序执行的相应状态。
关于脚本安全;set 命令实现脚本安全
-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项
-x 当执行命令时,打印命令及其参数,类似 bash -x
逻辑运算:
与:与:&:和0相与,结果为0,和1相与,结果保留原值
或::|:和1相或结果为1,和0相或,结果保留原值
非:! ! 1 = 0 ! true ! 0 = 1 ! false
异或:异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出 另一个值Y
短路运算
短路与
CMD1 短路与 CMD2
第一个CMD1结果为 0 (假 ),总的结果必定为0,因此不需要执行CMD2
第一个CMD1结果为 1 (真),第二个CMD2必须要参与运算,才能得到最终的结果
短路或
CMD1 短路或 CMD2
第一个CMD1结果为1 (真),总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为0 (假 ),第二个CMD2 必须要参与运算,,才能得到最终的结果
短路与跟短路或同时使用的时候必须短路与写在前面 否则会出现错误 会打印两条命令
花括号跟小括号在组合测试短路与短路或这里使用区别不大 但是要注意{}里面前后都要加空格 以及后面需要加;
条件测试命令 :
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符
条件测试比数字大小
【】内变量前必须加$ 而且两个变量必须都是数字
【】两个变量相比等号前面必须有空格
建议变量加上双引号引起来
关于() 和 {}
( list ) 会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境, 帮助看:man bash 搜索(list)
{ list; } 不会启子shell, 在当前shell中运行,会影响当前shell环境, 帮助参看:man bash 搜索{ list; }
组合测试:组合测试条件
2.13.1 第一种方式
说明: -a 和 -o 需要使用测试命令进行,[[ ]] 不支持
范例:
2.13.2 第二种方式
[ EXPRESSION1 -a EXPRESSION2 ] 并且
[ EXPRESSION1 -o EXPRESSION2 ] 或者
[ ! EXPRESSION ] 取反
条件选择:条件选择
4.1.1 选择执行if语句
格式: 单分支 双分支 多分支
. ~/.bashrc
if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else
COMMANDS; ] fi
多个条件时,逐个条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
if 语句可嵌套
条件判断case语句
格式:
case支持glob风格的通配符:
范例:
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac