Shell数组
Shell中数字用括号来表示,元素中用“空格”符号分隔开
注意:往数组里添加值,数组的长度自动增长。
例:创建数组 : arr=()
读取数组:echo arr[1] 通过下标读取
获取数组中的所有元素 :echo ${arr[]} 或者 echo ${arr[@]}
获取数组的长度:echo ${#arr[@]}
遍历数组:
For i in ${arr[]}
Do
Echo $i
Done
运算符
1.基础语法
((运算式))或 ((运算式)) 或((运算式))或[运算式] + – * / % 加 减 乘 除 取余
Expr +,-,*,/,% 加 减 乘 除 取余
注意:expr 运算符间要有间隔
例:计算3+2的值 expr 2 + 3
计算(2+3)*4的值 expr expr 2 + 3 * 4
条件判断
1.基本语法
[ condition ] 注意:condition 前后要有空格 条件非空即为true
2.常用判断条件
2.1 两个整数之间比较
=字符串比较
-lt 小于 -le 小于等于
-qe 等于 -gt 大于
-ge 大于等于 -ne 不等于
例:[ 23 -ge 22 ]
=======按照文件权限进行判断
命令 描述
-r(read) 有读的权限
-w(write) 有写的权限
-x(execute) 有执行的权限
========按照文件类型进行判断
命令 描述
-f(file) 文件存在并且是一个常规的文件
-d(directory) 文件存在并且是一个目录
-e(existence) 文件存在
2.4 多条件判断
&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令
例:[ condition ] && echo ok || echo notok
流程控制
if语法:
[ 条件判断] ,中括号和条件判断之间必修有空格,if后面必须有空格
注意:如果aaa.txt文件存在,往文件中写入bbb,
如果不存在,创建aaa.txt文件,往文件中写入bbb
case语法:
1.case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2.双分号“;;”表示命令序列结束,相当于java中的break。
3.最后的“*)”表示默认模式,相当于java中的default。
注意:输入一个数字,如果是1,则输出1,
如果是2,则输出2,如果是其它,输出3。
for循环语法1:
for循环语法2:
比较∗与 *与∗与@区别
都表示传递给函数或脚本的所有参数,不被双引号包含时,都一样
包含以后$*被看做为一个整体
while语法:
#!/bin/bash
s=0
i=1
while [ $i -le 100 ] do s=$[$s+$i]
i=$[$i+1]
done
echo $s [jinghnag@hadoop101 datas]$ chmod 777 while.sh
[jinghnag@hadoop101 datas]$ ./while.sh
5050
read读取控制台输入: read(选项)(参数)
选项: -p 指定读取值时的提示符
-t 指定读取值等待的时间(秒)
参数:变量(指定读取值的变量名)
例子:
[jinghnag@hadoop101 datas]$ touch read.sh
[jinghnag@hadoop101 datas]$ vim read.sh
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME [jinghnag@hadoop101 datas]$ ./read.sh
Enter your name in 7 seconds xiaoze
xiaoze
函数:1) basename [string / pathname] [suffix] (basename命令会删除所有的前缀包括最后一个 (‘/’)字符
,然后将字符串显示出来
2) dirname 文件绝对路径 (从给定的包含绝对路径的文件名中去除文件名(非目录的部分), 然后返回剩下的路径(目录的部分))
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
例子:1) [jinghnag@hadoop101 datas]$ basename /home/jinghnag/banzhang.txt
banzhang.txt
[jinghnag@hadoop101 datas]$ basename /home/jinghang/banzhang.txt .txt
banzhang
2) [jinghnag@hadoop101 ~]$ dirname /home/jinghnag/banzhang.txt
/home/jinghnag
自定义函数: function funname[()]
{
Action;
[return int;]
}
funname
例子:[jinghnag@hadoop101 datas]$ touch fun.sh
[jinghnag@hadoop101 datas]$ vim fun.sh
#!/bin/bash
function sum()
{**
s=0
s=$[ $1 + $2 ] echo "$s"
}
read -p “Please input the number1: " n1;
read -p “Please input the number2: " n2;
sum $n1 $n2; [jinghnag@hadoop101 datas]$ chmod 777 fun.sh
[jinghnag@hadoop101 datas]$ ./fun.sh
Please input the number1: 2
Please input the number2: 5
7
Shell工具: 1) cut [选项参数] filename (默认分隔符是制表符)
参数:-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
-c 制定具体的字符
2) sed [选项参数] ‘command’ filename
参数:-e 直接在指令模式上进行sed的动作编辑
-i 直接编辑文件
命令: a 新增,a的后面可以接字串,在下一行出现
d 删除
s 查找并替换
例子:将“mei nv”这个单词插入到sed.txt第二行下,打印。
sed ‘2a mei nv’ sed.txt
删除sed.txt文件所有包含wo的行
sed ‘/wo/d’ sed.txt
将sed.txt文件中wo替换为ni(g表示global,全部替换)
sed ‘s/wo/ni/g’ sed.txt
将sed.txt文件中的第二行删除并将wo替换为ni
sed -e ‘2d’ -e ‘s/wo/ni/g’ sed.txt
3) awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
参数: -F 指定输入文件折分隔符
-v 赋值一个用户定义变量
例子:
数据准备:
sudo cp /etc/passwd ./
搜索passwd文件以root关键字开头的所有行,并输出该行的第7列:
awk -F: ‘/^root/{print $7}’ passwd (只有匹配了pattern的行才会执行action)
只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user
shell在最后一行添加”dahaige, /bin/zuishuaiai“:
awk -F : 'BEGIN{print “user, shell”} {print $1”,”$7} END{print “dahaige,/bin/zuishuai”}’ passwd
(注意:BEGIN在所有数据读取行之前执行;END在所有数据执行之后执行)
将passwd文件中的用户id增加数值1并输出:
awk -v i=1 -F: ‘{print $3+i}’ passwd
awk的内置变量:
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数(切割后,列的个数)
例子:
统计passwd文件名,每行的行号,每行的列数:
awk -F: ‘{print “filename:” FILENAME “, linenumber:” NR “,columns:” NF}’ passwd
切割IP:
ifconfig eth0 | grep “inet addr” | awk -F: ‘{print $2}’ | awk -F " " ‘{print
KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲' …/{print NR}’ sed.txt
4) sort(选项)(参数)
选项:
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分割字符
-k 指定需要排序的列**