shell数组

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 指定需要排序的列**

上一篇:shell——变量
下一篇:Shell常用命令

代码交流 2021