4.linux之bash语法
一、概述
1.进入BOIS的键:F2 F12 ctrl+alt+insert(重启)快点F2
二、变量
(1)变量类型
字符型、真假型与数值型等不同类型,内存地址去存时用的不同的位数去存
eg:字符型----一个字符会转化为8位一个字节,eg:10对字符来说是二个字符用对内存来说用二个字节来存
数值型---10是一个数值转化为二进制是1010由于最小字节是8位所以数值型的10用一个字节就可以存了
静态语言(C C++ java等)必须事先申明变量类型,它们变量出问题必须程序自己解决
动态语言:有解释器,变量有问题可由解释器解决
(2)变量声明
2.1环境变量:作用于当前shell及子进程
export VAR=valve
2.2本地变量
VAR=valve
2.3局部变量
local VAR=valve
2.4位置变量
$1 $2
2.5特殊变量:bash内置用于保存特殊数据变量(系统变量)
2.6撤消变量
unset VAR
注:内核只能识别ELF格式,而我们写的是ASCII交给内核后内核理解不了,所以要告诉内核让它启动一个脚本解释器来执行这个ASCII脚本
三、bash的脚本语法
3.1条件判断之if
3.1.1单分支
if 判断条件 ;then-------条件有真假
语句---------条件为真时执行
fi
3.1.2 双分支
if 判断条件;then
语句1------条件为真时执行
else
语句2------条件为假时执行
fi
3.1.3 多分支
if 判断条件;then
语句-------条件为真时执行
elif 判断条件;then-----条件为假时执行
语句2
elif 判断条件;then
语句3
else
语句4
fi
注:语句之间也有逻辑关系
逻辑与:&& eg:真&&执行(前为真后就执行) 假&&不执行
逻辑或:|| eg:真||不执行 假||执行
!:单条件取反
注2:判断条件有三种情况
3.1.1.1:整数测试(双目测试)
-ne:判断整数是否不等,不等为真,相等为假
-gt:判断一个数是否大于另一个数,大为真小为假
-lt:判断一个数是否小于另一个数,小为真大为假
-ge:判断一个数是否大于等于另一个数,大于等于为真否则为假
-le:判断一个数是否小于等于另一个数,小于等于为真否则为假
-eq:判断一个数是否等于另一个数,等于为真否则为假
3.1.1.2:文件测试(单目测试)
-e file:文件是否存在,存在为真否则为假
-f file:文件是否为普通文件,是为真否则为假
-d file:判断文件是否为目录,是目录为真否则为假
-r file:判断是否有读权限,有读权限为真否则为假
-w file:判断是否有写权限,有写权限为真否则为假
-x file:判断是否有执行权限,有执行权限为真否则为假
3.1.1.3:字符测试(双目或单目)
==:测试二个字符是否相等eg:[ $A == $B ]
!==:测试二字符是否不想等
-n string:字符是否为空,空为真,不空为假
-s string:字符串是否为不空,不空为真,空为假
组合判断测试条件
-a:与关系
-o:或关系
!:非关系
注3:条件判断的表达式
3.1.2.1:二边有空格[ 表达式 ]
3.1.2.2:没有空格[[表达式]]
3.1.1.3:test 表达式
exit # :提前退出脚本
注4:由于shell默认把变量当做字符串,无法算术运算,如何做?
3.1.3.1:用let
A=3 B=6 let C=$A+$B
3.1.3.2:$[算术表达式]
C=$[$A+$B]
3.1.3.3:$((算术表达式))
C=$(($A+$B))
3.1.3.4:'expr 算术表达式'
C='expr $A + $B '
3.2条件判断之case
case $变量(值)in
valve1)
语句1;
valve2)
语句2;
esac
3.3循环语句之for
3.1.1 语法结构
for 变量 in 列表;do
循环体
done
for((表达式1;表达式2;表达式3))
变量初值 退出循环条件
注1:列表情况
3.1.1.1:整数列表{1..100}
必须知道整数,不能用$A来代替100,在列表里$A表示字母本身,不是被bash解释它对应的数值,如果必用到字母看如下
3.1.1.2:`seq [起始数] [步进数] 结束数`([]表可省略)eg:`seq 1 $A`
也可以是一个命令`echo $1|sed "s@.@ @g"`
3.4:循环语句之while
3.4.1 语法结构
while CONDITON ;do CONDITON:是进入条件,满足就进去循环,不满足就退出完成循环,适用于循环数未知
循环体
done
eg:declare -i I=1 初始值
declare -i SUM=0
while [ I -lt 100 ];do
let SUM=$SUM+=$I
done
echo $SUM
3.4.2 while的死循环
while : ; do
循环体
done
3.4.3 while特殊用法---读取文件所有行分别处理,循环处理每行
while read LINE(变量);do ------读的每行都在LINE里进行循环体处理
循环体
done < /path/to/somefile
3.4.4 until语句
until CONDITON; do -----条件不满足就循环,满足就退出
循环体
done
注:以上三个循环要提前退出有二个常用控制关键词
break:提前退出循环
continue:提前结束本轮循环而进入下一轮循环
3.5 函数方法
3.5.1:命令的函数
function FUNCNAME {
函数体
}
3.5.2:
function (){
函数体
}
3.6 特殊变量
脚本参数用位置变量$1 $2等来表示
特殊变量:
参数个数:$#
参数列表:$*
参数列表:$@
状态结果:$?
3.7 计算器
bc--交互式
echo "scale=2;111/22;"|bc = bc<<<"scale=2;111/22;"
取余数用% 3%2=1
3.8 取路径值
FILE=/usr/local/src #:从左向右 %从右向左
FILE=/usr/local/src #:从左向右 %从右向左
{FILE#*/} =usr/local/src 从左向右第一个/去掉
{FILE##*/}=src 最后一个/之前的都去掉
{FILE%/*} = /usr/local 从右向左第一个之后的去掉-常用
{FILE%%/*}=空白
3.9 变量中字符长度
A="starting tserver"
echo ${#A}
3.10 变量赋值--变量没值给个默认值
${变量:-word}:变量无值,变量为word,变量有值还是变量的值
${变量:+word}:变量无值,变量为空,变量有值变为word
${变量:=word}:变量无值有值,变量都为word
${变量:offset:length}:取子串,从offset的后一个字符开始取length长的下来
eg:A=3
echo${A:-3}
A='hello world'从第三个字符串向后取3个
echo ${A:2:3}
3.11 声名数组
数组赋值1
declare -a AA ----数组里每个元素(变量)从0开始
AA[0]=jerry AA[1]=tom AA[6]=mtash 数组一共有一个元素
数组赋值2
AA=(jerry tom mtash)或AA=([0]=jerry [1]=tom [3]=mtash)
数组元素引用
${AA[#]} AA[#]是变量 ${}--引用变量的值
判断数组元素个数,值不为空时
${#AA[*]}=${#AA[@]}
判断数组第一个元素字符长度
${#AA[0]}
脚本实例:
实例1:从键盘让用户输入几个文件脚本能够将此几个文件归档压缩成一个文件(让脚本与用户产生交互的命令如下)
read 变量(eg:#read NAME AGE tom 20 # echo $NAME --显示tom )
vi sum.sh
#!/bin/bash
echo "INput two intergers:"
read A B(意味着要在键盘上输入二个值)
echo "$[$A+$B]"
给执行权限后输入二个值:3 4--结果为7
优化不换行:---3与4直接在第一句后面
echo -n "INput two intergers:"
read A B
echo $A plus $B :$[$A+$B]
优化read直接与命令行进行交互
-p:直接引用提示,不用提前用echo打出来
read -p "INput two intergers:" A B
-t timeout:超时时间
read -t 5 -p "INput two intergers [100 and 100]:" A B
相当于If语句
[-z $A] && A=100 当它为空时就给100
脚本:
read -p "three files": FILE1 FILE2
read -p "destination:" DEST
tar -jcf ${DEST}.tar.bz2 $FILE1 $FILE2
实例2:计算100以内所有正整数的和
declare -i I=1 变量初值
declare -i SUM=0
while [$I -le 100];do--小于就进入循环不满足就退出
let SUM+=$I
let I++
done
echo $SUM
实例3:提醒用户输入字符串,不管输入什么字符通通换为大写并显示若输入的是quit就退出循环
read -p "input something:" STRING
while [$STRING != 'quit']; do
echo $STRING | tr 'a-z' 'A-Z'
read -p "input something:" STRING
done