shell学习总结(2)
1.Shell 中的数组
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
方式2: arr=(value1 value2 value3) (这种方式带值)
注意:往数组里添加值,数组的长度自动增长
(1)案例实操
#!/bin/bash
my_array=(A B “C” D)
我们也可以使用下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组元素值的一般格式是:
$ echo {array_name[index]}
(2)案例实操
#!/bin/bash
my_array=(A B “C” D)
echo “第一个元素为: ${my_array[0]}”
echo “第二个元素为: ${my_array[1]}”
echo “第三个元素为: ${my_array[2]}”
echo “第四个元素为: ${my_array[3]}”
执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh第一个元素为: A第二个元素为: B第三个元素为: C第四个元素为: D
(3)获取数组中的所有元素
使用@ 或 * 可以获取数组中的所有元素,例如:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo “数组的元素为: ${my_array[*]}”
echo “数组的元素为: ${my_array[@]}”
(4)获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组元素个数为: ${#my_array[]}"
echo “数组元素个数为: ${#my_array[@]}”
执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh数组元素个数为: 4数组元素个数为: 4
(5)遍历数组
案例实操
#!/bin/bash
arr=(1 2 3 4 5 6 7)
for i in ${arr[]}
do
echo $i
done
2.运算符
(1)“
(
(
运
算
式
)
)
”
或
“
((运算式))”或“
((运算式))”或“[运算式]” + , - , *, /, % 加,减,乘,除,取余
(2)expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
3.条件判断
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ jinghang ]返回true,[] 返回false。
常用判断条件
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
4.流程控制
4.1 if 判断
1.基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
4.2 case 语句
1.基本语法
case
变
量
名
i
n
"
值
1
"
)
如
果
变
量
的
值
等
于
值
1
,
则
执
行
程
序
1
;
;
"
值
2
"
)
如
果
变
量
的
值
等
于
值
2
,
则
执
行
程
序
2
;
;
…
省
略
其
他
分
支
…
∗
)
如
果
变
量
的
值
都
不
是
以
上
的
值
,
则
执
行
此
程
序
;
;
e
s
a
c
注
意
事
项
:
1
)
c
a
s
e
行
尾
必
须
为
单
词
“
i
n
”
,
每
一
个
模
式
匹
配
必
须
以
右
括
号
“
)
”
结
束
。
2
)
双
分
号
“
;
;
”
表
示
命
令
序
列
结
束
,
相
当
于
j
a
v
a
中
的
b
r
e
a
k
。
3
)
最
后
的
“
∗
)
”
表
示
默
认
模
式
,
相
当
于
j
a
v
a
中
的
d
e
f
a
u
l
t
。
4.3
f
o
r
循
环
1
.
基
本
语
法
1
f
o
r
(
(
初
始
值
;
循
环
控
制
条
件
;
变
量
变
化
)
)
d
o
程
序
d
o
n
e
4.4
w
h
i
l
e
循
环
1
.
基
本
语
法
w
h
i
l
e
[
条
件
判
断
式
]
d
o
程
序
D
o
n
e
5.
r
e
a
d
读
取
控
制
台
输
入
基
本
语
法
:
r
e
a
d
(
选
项
)
(
参
数
)
选
项
:
−
p
:
指
定
读
取
值
时
的
提
示
符
;
−
t
:
指
定
读
取
值
时
等
待
的
时
间
(
秒
)
。
参
数
变
量
:
指
定
读
取
值
的
变
量
名
6.
函
数
6.1
系
统
函
数
b
a
s
e
n
a
m
e
基
本
语
法
:
b
a
s
e
n
a
m
e
[
s
t
r
i
n
g
/
p
a
t
h
n
a
m
e
]
[
s
u
f
f
i
x
]
(
功
能
描
述
:
b
a
s
e
n
a
m
e
命
令
会
删
掉
所
有
的
前
缀
包
括
最
后
一
个
(
‘
/
’
)
字
符
,
然
后
将
字
符
串
显
示
出
来
。
选
项
:
s
u
f
f
i
x
为
后
缀
,
如
果
s
u
f
f
i
x
被
指
定
了
,
b
a
s
e
n
a
m
e
会
将
p
a
t
h
n
a
m
e
或
s
t
r
i
n
g
中
的
s
u
f
f
i
x
去
掉
。
d
i
r
n
a
m
e
基
本
语
法
d
i
r
n
a
m
e
文
件
绝
对
路
径
(
功
能
描
述
:
从
给
定
的
包
含
绝
对
路
径
的
文
件
名
中
去
除
文
件
名
(
非
目
录
的
部
分
)
,
然
后
返
回
剩
下
的
路
径
(
目
录
的
部
分
)
)
6.2
自
定
义
函
数
基
本
语
法
:
[
f
u
n
c
t
i
o
n
]
f
u
n
n
a
m
e
[
(
)
]
A
c
t
i
o
n
;
[
r
e
t
u
r
n
i
n
t
;
]
f
u
n
n
a
m
e
经
验
技
巧
:
(
1
)
必
须
在
调
用
函
数
地
方
之
前
,
先
声
明
函
数
,
s
h
e
l
l
脚
本
是
逐
行
运
行
。
不
会
像
其
它
语
言
一
样
先
编
译
。
(
2
)
函
数
返
回
值
,
只
能
通
过
变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac 注意事项: 1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。 2)双分号“;;”表示命令序列结束,相当于java中的break。 3)最后的“*)”表示默认模式,相当于java中的default。 4.3 for 循环 1.基本语法1 for (( 初始值;循环控制条件;变量变化 )) do 程序 done 4.4 while 循环 1.基本语法 while [ 条件判断式 ] do 程序 Done 5.read读取控制台输入 基本语法: read(选项)(参数) 选项: -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)。 参数 变量:指定读取值的变量名 6.函数 6.1系统函数 basename基本语法: basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。 选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。 dirname基本语法 dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)) 6.2自定义函数 基本语法: [ function ] funname[()] { Action; [return int;] } funname 经验技巧: (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。 (2)函数返回值,只能通过
变量名in"值1")如果变量的值等于值1,则执行程序1;;"值2")如果变量的值等于值2,则执行程序2;;…省略其他分支…∗)如果变量的值都不是以上的值,则执行此程序;;esac注意事项:1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。2)双分号“;;”表示命令序列结束,相当于java中的break。3)最后的“∗)”表示默认模式,相当于java中的default。4.3for循环1.基本语法1for((初始值;循环控制条件;变量变化))do程序done4.4while循环1.基本语法while[条件判断式]do程序Done5.read读取控制台输入基本语法:read(选项)(参数)选项:−p:指定读取值时的提示符;−t:指定读取值时等待的时间(秒)。参数变量:指定读取值的变量名6.函数6.1系统函数basename基本语法:basename[string/pathname][suffix](功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。dirname基本语法dirname文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))6.2自定义函数基本语法:[function]funname[()]Action;[returnint;]funname经验技巧:(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。(2)函数返回值,只能通过?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
7.Shell工具(文本处理)
7.1 cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
基本用法: cut [选项参数] filename
说明:默认分隔符是制表符
2.选项参数说明
表1-55
选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
-c 指定具体的字符
7.2 sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
基本用法: sed [选项参数] ‘command’ filename
选项参数说明
表1-56
选项参数 功能
-e 直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。
-i 直接编辑文件
命令功能描述
表1-57
命令 功能描述
a 新增,a的后面可以接字串,在下一行出现
d 删除
s 查找并替换
7.3 awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本用法: awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数说明
选项参数 功能
-F 指定输入文件折分隔符
-v 赋值一个用户定义变量
7.4 sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
基本语法:sort(选项)(参数)
选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列
参数:指定待排序的文件列表