Shell入门之二

目录

第6章 流程控制(重点)

6.1 if判断

6.2 case语句

6.3 for循环

6.4 while循环

第7章 read读取控制台输入

第8章 函数

8.1 系统函数

8.1.1 basename

8.1.2 dirname

8.2 自定义函数

第9章 Shell工具(重点)

9.1 cut

9.2 awk

9.3 sort

9.4 wc

第10章 正则表达式入门

10.1 常规匹配

10.2 常用特殊字符

10.3 其他特殊字符


6流程控制(重点)

6.1 if判断

1)基本语法

(1)单分支

if [ 条件判断式 ];then
    程序
fi 

或者

if  [ 条件判断式 ]
then
    程序
fi

(2)多分支

if [ 条件判断式 ]
then
    程序
elif [ 条件判断式 ]
then
    程序
else
    程序
fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

2)案例实操

输入一个数字,如果是1,则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。

[shenxian@hadoop101 shells]$ touch if.sh
[shenxian@hadoop101 shells]$ vim if.sh

#!/bin/bash
if [ $1 -eq 1 ]
then
    echo "banzhang zhen shuai"
elif [ $1 -eq 2 ]
then
    echo "cls zhen mei"
fi
[shenxian@hadoop101 shells]$ chmod 777 if.sh
[shenxian@hadoop101 shells]$ ./if.sh 1
banzhang zhen shuai

6.2 case语句

1)基本语法

case $变量名 in
"值1")
    如果变量的值等于值1,则执行程序1
;;
"值2")
    如果变量的值等于值2,则执行程序2
;;
    …省略其他分支…
*)
    如果变量的值都不是以上的值,则执行此程序
;;
esac

注意事项:

(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

(2)双分号“;;”表示命令序列结束,相当于java中的break。

(3)最后的“*)”表示默认模式,相当于java中的default。

2)案例实操

输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它,输出renyao。

[shenxian@hadoop101 shells]$ touch case.sh
[shenxian@hadoop101 shells]$ vim case.sh

#!/bin/bash

case $1 in
"1")
    echo "banzhang"
;;
"2")
    echo "cls"
;;
*)
    echo "renyao"
;;
esac
[shenxian@hadoop101 shells]$ chmod 777 case.sh
[shenxian@hadoop101 shells]$ ./case.sh 1
1

6.3 for循环

1)基本语法1

for (( 初始值;循环控制条件;变量变化 ))
do 
    程序
done

2)案例实操

从1加到100

[shenxian@hadoop101 shells]$ touch for1.sh
[shenxian@hadoop101 shells]$ vim for1.sh

#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
    sum=$[$sum+$i]
done
echo $sum

[shenxian@hadoop101 shells]$ chmod 777 for1.sh
[shenxian@hadoop101 shells]$ ./for1.sh
5050

3)基本语法2

for 变量 in 值1 值2 值3…
do 
    程序
done

4)案例实操

(1)打印所有输入参数

[shenxian@hadoop101 shells]$ touch for2.sh
[shenxian@hadoop101 shells]$ vim for2.sh

#!/bin/bash

#打印数字
for i in cls mly wls
do
    echo "ban zhang love $i"
done

[shenxian@hadoop101 shells]$ chmod 777 for2.sh
[shenxian@hadoop101 shells]$ ./for2.sh
ban zhang love cls
ban zhang love mly
ban zhang love wls

(2)比较$*和$@区别

$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。

[shenxian@hadoop101 shells]$ touch for3.sh
[shenxian@hadoop101 shells]$ vim for3.sh

#!/bin/bash
echo '=============$*============='
for i in $*
do
    echo "ban zhang love $i"
done

echo '=============$@============='
for j in $@
do      
    echo "ban zhang love $j"
done

[shenxian@hadoop101 shells]$ chmod 777 for3.sh
[shenxian@hadoop101 shells]$ ./for3.sh cls mly wls
=============$*=============
banzhang love cls
banzhang love mly
banzhang love wls
=============$@=============
banzhang love cls
banzhang love mly
banzhang love wls

当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;$@会将各个参数分开,以“$1” “$2”…“$n”的形式输出所有参数。

[shenxian@hadoop101 shells]$ vim for4.sh

#!/bin/bash
echo '=============$*============='
for i in "$*" 
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
    echo "ban zhang love $i"
done

echo '=============$@============='
for j in "$@" 
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
    echo "ban zhang love $j"
done

[shenxian@hadoop101 shells]$ chmod 777 for4.sh
[shenxian@hadoop101 shells]$ ./for4.sh cls mly wls
=============$*=============
banzhang love cls mly wls
=============$@=============
banzhang love cls
banzhang love mly
banzhang love wls

6.4 while循环

1)基本语法

while [ 条件判断式 ]
do 
    程序
done

2案例实操

从1加到100

[shenxian@hadoop101 shells]$ touch while.sh
[shenxian@hadoop101 shells]$ vim while.sh

#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
    sum=$[$sum+$i]
    i=$[$i+1]
done

echo $sum

[shenxian@hadoop101 shells]$ chmod 777 while.sh
[shenxian@hadoop101 shells]$ ./while.sh
5050

7read读取控制台输入

1)基本语法

read  (选项)  (参数)

选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)如果-t不加表示一直等待

参数

变量:指定读取值的变量名

2)案例实操

提示7秒内,读取控制台输入的名称

[shenxian@hadoop101 shells]$ touch read.sh
[shenxian@hadoop101 shells]$ vim read.sh

#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds :" NN
echo $NN

[shenxian@hadoop101 shells]$ ./read.sh
Enter your name in 7 seconds : shenxian
shenxian

8函数

8.1 系统函数

8.1.1 basename

1)基本语法

basename [string / pathname] [suffix]   (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

basename 可以理解为取路径里的文件名称

选项:

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

2)案例实操

截取该/home/shenxian/banzhang.txt路径的文件名称

[shenxian@hadoop101 shells]$ basename /home/shenxian/banzhang.txt
banzhang.txt
[shenxian@hadoop101 shells]$ basename /home/shenxian/banzhang.txt .txt
banzhang

8.1.2 dirname

1)基本语法

dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

dirname 可以理解为取文件路径的绝对路径名称

2)案例实操

获取banzhang.txt文件的路径

[shenxian@hadoop101 ~]$ dirname /home/shenxian/banzhang.txt

/home/shenxian

8.2 自定义函数

1)基本语法

[ function ] funname[()]
{
    Action;
    [return int;]
}

2)经验技巧

(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

3)案例实操

计算两个输入参数的和

[shenxian@hadoop101 shells]$ touch fun.sh
[shenxian@hadoop101 shells]$ 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;

[shenxian@hadoop101 shells]$ chmod 777 fun.sh
[shenxian@hadoop101 shells]$ ./fun.sh
Please input the number1: 2
Please input the number2: 5
7

9Shell工具(重点)

9.1 cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

1)基本用法

cut  [选项参数]  filename

说明:默认分隔符是制表符

2)选项参数说明

选项参数

功能

-f

列号,提取第几列

-d

分隔符,按照指定分隔符分割列,默认是制表符“\t”

-c

按字符进行切割 后加加n 表示取第几列  比如 -c 1

3)案例实操

(1)数据准备

[shenxian@hadoop101 shells]$ touch cut.txt
[shenxian@hadoop101 shells]$ vim cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le

(2)切割cut.txt第一列

[shenxian@hadoop101 shells]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

(3)切割cut.txt第二、三列

[shenxian@hadoop101 shells]$ cut -d " " -f 2,3 cut.txt
  Le 

(4)在cut.txt文件中切割出guan

[shenxian@hadoop101 shells]$  cat cut.txt |grep guan | cut -d " " -f 1

guan

(5)选取系统PATH变量值,第2个“:”开始后的所有路径:

[shenxian@hadoop101 shells]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shenxian/.local/bin:/home/shenxian/bin
[shenxian@hadoop101 shells]$ echo $PATH | cut -d ":" -f 3-
/usr/local/sbin:/usr/sbin:/home/shenxian/.local/bin:/home/shenxian/bin

(6)切割ifconfig 后打印的IP地址

[shenxian@hadoop101 shells]$ ifconfig ens33 | grep netmask | cut -d "i" -f 2 | cut -d " " -f 2
192.168.6.101

9.2 awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

1)基本用法

awk  [选项参数] ‘/pattern1/{action1}  /pattern2/{action2}...’ filename

pattern:表示awk在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

2)选项参数说

选项参数

功能

-F

指定输入文件折分隔符

-v

赋值一个用户定义变量

3)案例实操

(1)数据准备

[shenxian@hadoop101 shells]$ sudo cp /etc/passwd ./
passwd数据的含义
用户名:密码(加密过后的):用户id:组id:注释:用户家目录:shell解析器

(2)搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。

[shenxian@hadoop101 shells]$ awk -F : '/^root/{print $7}' passwd
/bin/bash

(3)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。

[shenxian@hadoop101 shells]$ awk -F : '/^root/{print $1","$7}' passwd
root,/bin/bash

注意:只有匹配了pattern的行才会执行action

(4)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"haimianbaobao,/bin/zuishuai"。

[shenxian@hadoop101 shells]$ awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "haimianbaobao,/bin/zuishuai"}' passwd
user, shell
root,/bin/bash
bin,/sbin/nologin
。。。
shenxian,/bin/bash
haimianbaobao,/bin/zuishuai

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。

(5)将passwd文件中的用户id增加数值1并输出

[shenxian@hadoop101 shells]$ awk -v i=1 -F : '{print $3+i}' passwd
1
2
3
4

4)awk的内置变量

变量

说明

FILENAME

文件名

NR

已读的记录数(行号)

NF

浏览记录的域的个数(切割后,列的个数)

5)案例实操

(1)统计passwd文件名,每行的行号,每行的列数

[shenxian@hadoop101 shells]$ awk -F : '{print "filename:" FILENAME  ",linenum:" NR ",col:"NF}' passwd
filename:passwd,linenum:1,col:7
filename:passwd,linenum:2,col:7
filename:passwd,linenum:3,col:7
。。。

(2)查询ifconfig命令输出结果中的空行所在的行号

[shenxian@hadoop101 shells]$ ifconfig | awk '/^$/{print NR}'
9
18
26

(3)切割IP

[shenxian@hadoop101 shells]$ ifconfig ens33 | grep netmask | awk -F "inet" '{print $2}' | awk -F " " '{print $1}'
192.168.6.101

9.3 sort

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

1)基本语法

Sort  (选项)  (参数)

选项

说明

-n

依照数值的大小排序

-r

以相反的顺序来排序

-t

设置排序时所用的分隔字符

-k

指定需要排序的列

参数:指定待排序的文件列表

2)案例实操

(1)数据准备

[shenxian@hadoop101 shells]$ touch sort.txt
[shenxian@hadoop101 shells]$ vim sort.txt
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6

(2)按照“:”分割后的第三列倒序排序。

[shenxian@hadoop101 shells]$ sort -t : -nrk 3  sort.txt
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6

9.4 wc

wc命令用来统计文件信息。利用wc指令我们可以计算文件的行数,字节数、字符数等。 

1)基本语法

wc  [选项参数]  filename

选项参数

功能

-l

统计文件行数

-w

统计文件的单词数

-m

统计文件的字符数

-c

统计文件的字节数

2)案例实操

统计/etc/profile文件的行数、单词数、字节数!

[shenxian@hadoop101 shells]$ wc -l /etc/profile
[shenxian@hadoop101 shells]$ wc -w /etc/profile
[shenxian@hadoop101 shells]$ wc -m /etc/profile

第10章 正则表达式入门

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等命令都支持通过正则表达式进行模式匹配。

10.1 常规匹配

一串不包含特殊字符的正则表达式匹配它自己,例如:

[shenxian@hadoop101 shells]$ cat /etc/passwd | grep shenxian

就会匹配所有包含shenxian的行

10.2 常用特殊字符

1)特殊字符:^

^ 匹配一行的开头,例如:

[shenxian@hadoop101 shells]$ cat /etc/passwd | grep ^a

会匹配出所有以a开头的行

2)特殊字符:$

$ 匹配一行的结束,例如

[shenxian@hadoop101 shells]$ cat /etc/passwd | grep t$

会匹配出所有以t结尾的行

思考:^$ 匹配什么?

3)特殊字符:.

. 匹配一个任意的字符,例如

[shenxian@hadoop101 shells]$ cat /etc/passwd | grep r..t

会匹配包含rabt,rbbt,rxdt,root等的所有行

4)特殊字符:*

* 不单独使用,他和上一个字符连用,表示匹配上一个字符0次或多次,例如

[shenxian@hadoop101 shells]$ cat /etc/passwd | grep ro*t

会匹配rt, rot, root, rooot, roooot等所有行

思考:.* 匹配什么?

5)特殊字符:[ ]

[ ] 表示匹配某个范围内的一个字符,例如

[6,8]------匹配6或者8

[0-9]------匹配一个0-9的数字

[0-9]*------匹配任意长度的数字字符串

[a-z]------匹配一个a-z之间的字符

[a-z]* ------匹配任意长度的字母字符串

[a-c, e-f]-匹配a-c或者e-f之间的任意字符

[shenxian@hadoop101 shells]$ cat /etc/passwd | grep r[a,b,c]*t

会匹配rt,rat, rbt, rabt, rbact,rabccbaaacbt等等所有行

6)特殊字符:\

\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 '$' 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如

[shenxian@hadoop101 shells]$ cat /etc/passwd | grep a\$b

就会匹配所有包含 a$b 的行。

10.3 其他特殊字符

见正则表达式语法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值