shell语法

shell语法特点

  • shell是弱类型语言,值都当成字符串处理,算术运算需要使用特殊的语法
  • if语句:只要if后的命令执行成功($?=0),即为true
  • shell按行或者分号(;)来表示命令的结束
  • echo $a 与 echo "$a"效果不同,如果显示字符串的值使用 echo “$a”

变量

  • 全局变量:在shell中定义的变量默认是全局变量,在当前shell中任何地方使用的变量。
  • 局部变量:在变量名前加local关键字,只能在函数内使用的变量
  • 环境变量:在变量名前加export关键字,可以在其子shell中使用的变量。环境变量只能向下传递,即父shell可以传递给子shell
  • 变量命名:由英文字母、下划线和数字组成,且首字母不能是数字
#'='两边不能出现空格
a="global"					#a是全局变量
local b="local"				#b是局部变量
export c="env"				#c是环境变量
unset <变量名>				#删除指定变量
NAME=$ID					#会解析变量ID			
NAME=AcTarjan				#$NAME=AcTarjan
NAME=hello world			#会出错,不能出现空格
NAME="$ID world"			#变量会被解析
NAME="hello world"			#可以出现空格
NAME='$ID world'			#变量不会被解析,$ID原样输出
NAME=`pwd`					#变量等于命令执行输出的结果

特殊变量

变量含义
$?上个命令的返回值
$0当前函数或脚本名
$#传递给脚本或函数的所有参数参数的个数
$n(n>0)脚本或函数的第n个参数
$*传递给脚本或函数的所有参数
$@传递给脚本或函数的所有参数
$$当前shell的pid

正则表达式

符号含义
.除换行符外的任一字符
[]匹配括号内的字符
[^]匹配除括号内的字符外
{n}匹配前面的字符n次
{,n}匹配前面的字符最多n次
{n,}匹配前面的字符至少n次
{n,m}匹配前面的字符至少n次,最多m次
?匹配0次或1次,等价于{0,1}
+至少匹配1次,等价于{1,}
*匹配0次或无数次,等价于{0,}
^表示行首
$表示行尾
()分组,([a-z]-[0-9])+表示匹配"字母-数字"至少1次
|或,例如:a|b 表示匹配a或b
\转义字符

字符串比较

  • 常用test、[ ]和[[ ]],提供了与或非:!(非) > -a(and 与) > -o(or或)
  • [[ ]]功能更强大,支持正则表达式
  • test与[ ]效果和用法相同,都是shell的内置命令(builtin)
  • '[‘后的空格与’]'前的空格不可省略
test -z "$aa"			#字符串长度为0则$?=0
test -n "$aa"			#字符串长度不为0则$?=0
test "$aa" = 'abc'		#字符串相等则$?=0
test "$aa" == 'abc'		#字符串相等则$?=0
test "$aa" != 'abc'		#字符串不相等则$?=0
test "$aa" < 'abc'		#前者小于(字符串比较)后者则$?=0
[ "$aa" != 'abc' ]		#'['后的空格与']'前的空格不可省略

###正则表达式匹配
[[ "$FILENAME" =~ ^test.*zip$ ]]

算术运算

  • let与双括号均不支持浮点数运算
  • expr命令仅用于计算表达式(不支持浮点数和括号),不能用于赋值。表达式的运算符、操作数之间要有空格,特殊运算符(*,>,<,)要转义
expr a = 1 \* 2		#错误,不能用于赋值
expr $a \* 2		#输出a*2的值
expr 2 \> 1			#2>1成立,输出1

let a+=b			#a=a+b
let a=1+2*(1+1)		#表达式尽量不要写多余的空格
let 2==1+1			#等式成立则$?=0	

(( a =1+2*(1+1) ))	#运算符、操作数之间可以有任意空格,只要表达式成立即可	
(( 2 == 1+1 ))		#等式成立则$?=0

[ $a -eq $b ]		#变量a的数值等于变量b的数值则$?=0		equal
[ $a -ne $b ]		#变量a的数值不等于变量b的数值则$?=0		not equal
[ $a -gt $b ]		#变量a的数值大于变量b的数值则$?=0		greater than
[ $a -ge $b ]		#变量a的数值大于等于变量b的数值则$?=0	greater or equal
[ $a -lt $b ]		#变量a的数值小于变量b的数值则$?=0		less than
[ $a -le $b ]		#变量a的数值小于等于变量b的数值则$?=0	less or equal

文件判断

  • linux中一切皆文件,这里的文件包括目录,特殊文件等
[[ ! -d <文件名> ]]		#文件不为目录则$?=0
test -e <文件名>			#文件存在则$?=0
test -r <文件名>			#文件存在且可读则$?=0
test -w <文件名>			#文件存在且可写则$?=0
test -x <文件名>			#文件存在且可执行则$?=0
test -h <文件名>			#文件存在且为符号链接则$?=0
test -s <文件名>			#文件存在且不为空则$?=0
test -S <文件名>			#文件存在且为socket文件则$?=0
test -f <文件名>			#文件存在且为普通文件则$?=0
test -d <文件名>			#文件存在且为目录则$?=0
test -c <文件名>			#文件存在且为字符特殊文件则$?=0
test -b <文件名>			#文件存在且为块特殊文件则$?=0

流程控制

if条件语句
if 条件语句1				#写法1
then
	语句
elif 条件语句2;then		#写法2,相较于写法1可以少1行
	语句
else
	语句
fi
case选择语句
casein
模式1)
    语句
    ;;				#相当于break
模式2)
    语句
    ;;
esac
for循环语句
#形式1
for((i=0; i<100; i++))
do
	语句
done

#形式2
for file in $list	#变量list中按空格进行划分元素
do
	echo $file		#可以使用break或continue
done
while循环语句
while 条件语句
do
	语句				#可以使用break或continue
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值