bash shell
bash的配置文件:
全局配置
/etc/profile , /etc/profile.d/*.sh , /etc/bashrc
个人配置
`/.bash_profile , `/.bashrc
profile类的文件:
设定环境变量
运行命令或脚本
bashrc类的文件 :
设定本地变量
定义命令别名
登录式shell如何读取配置文件?
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登录式shell如何配置文件?
./.bashrc --> /etc/basrc --> /etc/profile.d/*.sh
bash支持的引号:
`` 或$():命令替换
touch `date +%y%m%d`.log 或 touch $(date +%y%m%d).log
"":弱引用,可以实现变量替换
'':强引用,不完成变量替换
变量名称:
1. 只能包含字母,数字和下划线。并且不能数字开头:
2. 不应该跟系统中已有的环境变量重名:
3. 最好做到见名知义:
bash变量类型:
定义变量:set varname=jerry # set可以省略 ,等号左右不能留空格
环境变量:export varname=jerry # 作用域为当前shell进程及其子进程;
本地变量:varname=jerry # 作用域为整个bash进程
局部变量:local varname=jerry # 作用域为当前代码段
位置变量:$1,$2, # 引用脚本参数
./a.sh 1 2 # a.sh是$0,1时$1 , 2时$2 shift #
特殊变量:$? # 保存上一个命令的执行状态返回值:
程序执行,可能有两类返回值 echo $? # 程序状态返回代码(0-255) 0:正确执行 1-255:错误执行 $# # 输入参数的个数 $* # 参数列表 $@ # 参数列表
引用变量:${name} # {}有时可以省略
撤销变量:unset varname
查看当前shell中的变量: set
查看当前shell中的环境变量:printenv、env、export
数值变量:
let:数值 declare -i:表示整形 declare -x:将一个变量声明成环境变量
shell脚本第一行:#!/bin/bash
条件判断类型
条件测试类型:
整数测试
字符测试
文件测试
1、条件测试表达式:中括号必须加空格。
[ expression ] 括号两端必须要有空格 [[ expression ]] 括号两端必须要有空格 test expression 组合测试条件 -a:and -o:or !:取非
2、字符串比较
==:测试是否相等,相等为真,不等为假 !=:测试是否不等,不等为真,相等为假 >:字符串大于为真,小于为假 <:字符串小于为真,大于为假 >= <= -n:测试指定字符串是否为空,空则真,不空则假 -n string -s:测试指定字符串是否不空,不空为真,空为假 -s string
3、整数比较:
-eq:测试两个整数是否相等:比如 [ $a -eq $b ] -ne:测试两个整数是否不等:不等,为真:相等,为假: -gt:测试一个数是否大于另一个数:大于,为真:小于,为假: -lt:测试一个数是否小于另一个数:小于,为真:大于,为假: -ge:大于或等于 -le:小于或等于
4、文件测试:
-z string 测试指定字符是否为空,空着真,非空为假 -n string 测试指定字符串是否为不空,空为假 非空为真 -e FILE 测试文件是否存在 -f file 测试文件是否为普通文件 -d file 测试指定路径是否为目录 -r file 测试文件对当前用户是否可读 -w file 测试文件对当前用户是否可写 -x file 测试文件对当前用户是都可执行 -z 是否为空 为空则为真 -a 是否不空
5、条件测试的写法:
1、执行一个命令的结果 if grep -q "rm" fs.sh;then 2、传回一个命令执行结果的相反值 if !grep -q "rm" fs.sh;then 3、使用复合命令((算式)) if ((a>b));then 4、使用bash关键字 [[判断式]] if [[ str > xyz ]];then 5、使用内置命令:test 判断式 if test "str" \> "xyz";then 6、使用内置命令:[判断式] 类似test if [ "str" \> "xyz" ];then 7、使用-a -o进行逻辑组合 [ -r filename -a -x filename ] 8、命令&&命令 if grep -q "rm" fn.sh && [ $a -lt 100 ];then 9、命令||命令 if grep -q "rm" fn.sh || [ $a -lt 100 ];then
shell中如何进行算术运算:
1. let 算术运算表达式 a=3 b=4 let c=$a+$b echo $c 2. $[算术运算表达式] c=$[$a+$b] 3. $((算术运算表达式)) c=$(($a+$b)) 4. expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用 c=`expr $a + $b`
命令间的逻辑关系:
逻辑与:&&
第一个条件为假时,第二个条件不再判断
第一个条件为真时,第二个条件必须判断
逻辑或:||
read命令
read -p "aaaaa:" cc # 人机交互,cc变量接收输入的字符串
if语句
单分支if语句:
if [ 判断条件 ];then statement1 ... fi
双分支if语句:
if [ 判断条件 ];then statement1 ... else statement1 ... fi
多分支if语句:
if [ 判断条件 ];then statement1 ... elif [ 判断条件 ];then statement1 ... else statement1 ... fi exit:退出脚本
测试脚本是否有语法错误:
bash -n 脚本
bash -x 脚本:单步执行
循环
break:退出循环
continue:结束当前循环
seq:生成列表
seq 起始数 结束数 seq 起始数 步进长度 结束数 例子: for i in `seq 1 10`;do echo $1 done for i in `seq 1 2 10`;do echo $1 done
for循环:
例1: for i in {1..10};do echo $i done 例2: for i in `seq 1 10`;do echo $i done 例3: for (( i=1;i<10;i++ )) do echo $i done
while循环:
例1: aa=True let mun=0 while $aa;do if [ $mun -lt 10 ];then echo $mun else aa=False fi let mun+=1 done 例2: 给while循环传入一个文件,read读取每一行传入LINE变量里 while read LINE;do echo $LINE done < /PATH/TO/SOMEFILE