shell-第一篇
常用的shell
- Mac端工具: Terminal、iTerm2
- windows端工具: gitbash、cygwin;
变量
a=1
b=hello
c=“hello world”
d=‘你好,“中国”’
“=”左右不要有空格
如果内容有空格要使用单引号或者双引号
双引号支持转义,$开头的自变量会被自动替换
echo $a
echo ${b}
echo “$a”
使用 $var 或 $ {var}来访问变量,后者更为严谨,$var_x 和 ${var}_x 是不同的
变量不需要定义也可以使用,引用未定义的变量,默认为空值
预定义变量
echo $PWD
echo $USER
echo $HOME
echo $PATH
echo $RANDOM
echo ~
特殊符号的使用
单引号,表示其内容是字符串值,不支持转义
双引号,用于扩起一条字符串值,支持 $var 形式的变量替换
反斜线\:某些情况下表示转义
((a=a+3)) 是整数扩展:把里面的变量当做整数去处理
$(ls) 执行命令并把结果保存为变量,简写为``
{1…10} 简写为 seq 1 10,表示1到10
seq 1 10 3 表示生成一个1 到 10 ,步长为3
变量类型
字符串 a=“xxx”
数字 i=1314
布尔 true false
数组 array=(a b c)
函数 foo () {echo hello,world}
高于 4.x 的 shell 没有 hash 词典功能
数字型变量只能进行整数运算
浮点型计算请使用 awk ‘BEGIN{print 1/3}’
格式化显示可以换用 awk ‘BEGIN{printf("%.2f\n",1/3)}’
字符串操作
例子
- 取值
${value:offset} ${value:offset:length}
${#value} 字符串长度
${#array[*]} 和 ${#array[@]} 数组中元素的个数 - 掐头去尾与内容替换
${value#pattern} ${value##pattern} #表⽰掐头
${value%pattern} ${value%%pattern} %表⽰去尾
${value/pattern/string} ${value//pattern/string} /表⽰替换
${var/#Pattern/Replacement} ${var/%Pattern/Replacement}
#与## %与%% /与//的区别:最短匹配模式VS最长匹配模式
- AWK可以替代这些操作,推荐使用AWK
布尔变量
命令执行返回值 echo $?
0 表示正确
非0 表示错误
判断的类型
算术判断
[ 2 -eq 2 ] 相等
[ 2 -ne 2 ] 不等
[ 3 -gt 1 ] 大于
[ 3 -ge 3 ] 大于等于
[ 3 -lt 4 ] 小于等于
[ 3 -le 3 ] 小于等于
(())也可以表⽰算术⽐较。((10>=8)) ,((10==10))
字符串判断
[ string1 = string2 ] 如果两字符串相同,则结果为真
[ string1 != string2 ] 如果两字符串不相同,则结果为真
[ -n “
v
a
r
"
]
如
果
字
符
串
不
是
空
,
则
结
果
为
真
[
−
z
"
var" ] 如果字符串不是空,则结果为真 [ -z "
var"]如果字符串不是空,则结果为真[−z"var” ] 如果字符串是空,则结果为真
[[ “xxxx” == x* ]] 在表达式中表⽰0或者多个字符
[[ xxx == x?? ]] 在表达式中表⽰单个字符
在引⽤变量的时候要记得加双引号[ -z “$a”] 否则当a未定义时会语法报错
逻辑判断
[ 2 -ge 1 -a 3 -ge 4 ];echo $? 与
[ 2 -ge 1 -o 3 -ge 4 ];echo $? 或
[[ 2 -ge 1 && 3 -ge 4 ]];echo $? 与
[[ 2 -ge 1 || 3 -ge 4 ]];echo $? 或
[ ! 2 -ge 1 ];echo $? ⾮
shell内置判断
-e file 如果⽂件存在,则结果为真
-d file 如果⽂件是⼀个⼦⽬录,则结果为真
-f file 如果⽂件是⼀个普通⽂件,则结果为真
-r file 如果⽂件可读,则结果为真
-s file 如果⽂件的长度不为0,则结果为真
-w file 如果⽂件可写,则结果为真
-x file 如果⽂件可执⾏,则结果为真
[[]]是[]的扩展语法,在⽼的sh⾥并不⽀持。推荐⽤[]
数组变量
❖ array=(1 3 4 6)
❖ array=(ls
)
❖ array[2]=“hello world”
❖ echo ${array[2]};
❖ echo ${array[*] }
❖ echo ${#array[*]}
使⽤ () 来定义数组变量,中间使⽤空格隔开
逻辑控制
条件 if
分⽀ case、select
循环 for、while、until
break 和 continue
有⽣之年也许你只需要⽤到if、for、while
If结构
if [ condition ];then …;fi
if [ condition ];then …;else…;fi
if [ condition ];then …;elif…;fi
简单的逻辑可以使⽤ && || 去替代
[ -f file ] && echo file exist || echo file not exist
条件可以⽤命令返回值代替
for循环
for((c1,c2,c3));
do
…;
done
for((i=0;i<=10;i++));do echo $i;done
for遍历循环
用于递归数组,还可以递归以空格隔开的字符串序列。或者是某个命令的返回值
for f in $array[*];
do
…
done
ss=‘aa bb cc dd’; for x in $ss;do echo $x;done
for x in `ls`;do echo $x;done
ss=(aa bb cc “ss dddd”);for x in “${ss[@]}”;do echo $x;done
while 循环
while 设置条件
i=0;
while ((i<=3));do
echo $i;((i=i+1));
done
一行行读取文件内容
while read line;do echo $line;done< /tmp/tmp
退出控制
return函数返回
exit 脚本进程退出
break 退出当前循环
continue 跳过当前循环,进入下一次循环