Shell脚本

本文围绕Shell脚本编程展开,介绍了Linux的Shell解析器,如CentOS默认的bash。详细讲解了脚本创建、执行方式,阐述了系统变量、自定义变量、特殊变量的使用,还涉及条件判断、流程控制、函数等内容,最后介绍了cut、sed、awk、sort等Shell工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shell解析器

Linux的Shell解析器有

[yyx@hadoop04 ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

CentOS默认的解析器为bash

创建一个脚本实例

要求:输出HelloWord

  • 首先,创建一个.sh文件
  • touch helloword.sh
  • 其次,vim编辑文件内容

#!/bin/bash 

echo "hello word"
                

#!/bin/bash 是指定解析器

  • 运行sh helloword.sh

脚本的执行方式

第一种

  1. sh+脚本相对路径
  2. sh+脚本绝对路径
  3. bash+脚本相对路径
  4. bash+脚本绝对路径

第二种
首先要修改脚本文件权限

 chmod 777 helloword.sh 

之后运行:

./hellowold.sh

绝对路径同理
注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

创建另一个脚本文件

创建一个文件夹cls,在cls文件夹中创建一个txt文件并且在文件中写入I Love You
创建脚本文件并编写:

[yyx@hadoop04 ~]$ touch ILoveYou.sh
[yyx@hadoop04 ~]$ vim ILoveYou.sh 
#!/bin/bash
mkdir cls
cd cls
touch ILoveYou.txt
echo "I Love You" >> ILoveYou.txt

运行:

[yyx@hadoop04 ~]$ sh ILoveYou.sh 

Shell中的变量

系统变量

常用系统变量

$HOME、$PWD、$SHELL、$USER
查看系统变量:

[yyx@hadoop04 ~]$ echo $HOME
/home/yyx

自定义变量

基本语法:

定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly变量,注意:不能unset

创建变量规则:

1.变量名可以由字母、数字、下划线组成,但是不能以数字开头,环境变量名建议大写
2.等号两侧没有空格
3.在bash中,变量默认类型都是字符串类型,无法进行数值运算
4.变量的值如果有空格,需要双引号或者单引号括起来

实操

1.定义变量A

[yyx@hadoop04 ~]$ A=5
[yyx@hadoop04 ~]$ echo $A
5

2.给A重新赋值

[yyx@hadoop04 ~]$ A=8
[yyx@hadoop04 ~]$ echo $A
8

3.撤销变量

[yyx@hadoop04 ~]$ unset A
[yyx@hadoop04 ~]$ echo $A

4.创建静态变量B,不能unset

[yyx@hadoop04 ~]$ readonly B=6
[yyx@hadoop04 ~]$ echo $B
6
[yyx@hadoop04 ~]$ unset B
-bash: unset: B: 无法反设定: 只读 variable

5.无法运算:

[yyx@hadoop04 ~]$ A=7
[yyx@hadoop04 ~]$ echo $A+$B
7+6

运算

基本语法
$((运算式))或$[运算式]

实操:

[yyx@hadoop04 ~]$ echo $A+$B
7+6
[yyx@hadoop04 ~]$ echo $[A+B]
13

2.expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格,尽量不要用
实操:

[yyx@hadoop04 ~]$ expr $A + $B
13

特殊变量

特殊变量:$n

基本语法

$n
功能描述:n为数字,$0代表该脚本名称,$1~$9表示第一到第九个参数,** 十以上的参数需要用大括号包含 **

${11}

实操:

#!/bin/bash
echo $1 $2 $3
[yyx@hadoop04 ~]$ sh aaa.sh aaa bbb ccc ddd
aaa bbb ccc

特殊变量:$#

基本语法

$# :获取所有输入参数个数,常用于循环
实操:


#!/bin/bash
echo $1 $2 $3
echo '$#'=$#
~                    
[yyx@hadoop04 ~]$ sh aaa.sh aaa b c d
aaa b c
$#=4
[yyx@hadoop04 ~]$ 

特殊变量:$* $@

基本语法:

$*:这个变量代表命令行中所有的参数, $ *把所有参数看成一个整体
$@:这个变量也代表命令行中所有参数,不过 $@把每个参数区分对待
实操:

#!/bin/bash
echo $1 $2 $3
echo '$#'=$#
echo '$*'=$*
echo '$@'=$@

[yyx@hadoop04 ~]$ sh aaa.sh aaa b c d
aaa b c
$#=4
$*=aaa b c d
$@=aaa b c d

特殊变量:$?

基本语法

$?:最后一次执行命令的返回状态,如果这个变量值为0,证明上一个命令正确执行,如果这个变量的值非0,证明上一个命令执行有误。
实操:

[yyx@hadoop04 ~]$ sh aaa.sh aaa b c d
aaa b c
$#=4
$*=aaa b c d
$@=aaa b c d
[yyx@hadoop04 ~]$ echo $?
0

条件判断

基本语法:

【condition】(注意:condition前后要空格)

常用的判断条件

1.两个整数之间比较

=:字符串比较
-lt :小于
-eq:等于
-ge:大于等于
-le:小于等于
-gt:大于
-ne:不等于
实操:

[yyx@hadoop04 ~]$ A=4
[yyx@hadoop04 ~]$ B=5
[yyx@hadoop04 ~]$ [ $A = $B ]
[yyx@hadoop04 ~]$ echo $?
1
[yyx@hadoop04 ~]$ 

只能通过这种方式判断,注意空格

按照文件权限进行判断

-r:有读的权限
-w:有写的权限
-x:有执行的权限
实操:

[yyx@hadoop04 ~]$ [ -x aaa.sh ]
[yyx@hadoop04 ~]$ echo $?
1

证明没有执行权限

按照文件类型判断

-f:文件存在并且是一个常规文件
-e:文件存在
-d:文件存在并且是一个目录

[yyx@hadoop04 ~]$ [ -f aaa.sh ]
[yyx@hadoop04 ~]$ echo $?
0
[yyx@hadoop04 ~]$ [ -d aaa.sh ]
[yyx@hadoop04 ~]$ echo $?
1

流程控制

if判断:

语法:

if [ 条件判断语句 ]
	then
		程序。。。
elif [ 条件判断 ]
	then
			程序。。。
else
	程序
fi

注意:if后要有空格
实操:
查看是否存在一个叫b的文件,如果存在,输出文件内容,否则新建一个b文件,并且打印bbbb在其中

vim bbbb.sh
#!/bin/bash
if [ -e b.txt ]
        then
                cat b.txt
else
        touch b.txt
        echo 'bbbb' >> b.txt
fi

case语句

基本语法

case $变量名 in
“值1”)
程序1
;;
“值2”)
程序2
;;
*)
如果变量不是上面的值,执行此程序
;;
esac
实操:

#!/bin/bash
#如果一个参数是1,我们打印1,如果参数是2,我们打印2,否则打印3
case $1 in
        "1")
                echo '1'
        ;;
        "2")
                echo '2'
        ;;
        *)
                echo '3'
        ;;
esac
[yyx@hadoop04 ~]$ sh testcase.sh 
3
[yyx@hadoop04 ~]$ sh testcase.sh 1
1
[yyx@hadoop04 ~]$ sh testcase.sh 1 2
1
[yyx@hadoop04 ~]$ sh testcase.sh  2
2

注意:case行尾必须为单词in,每一个模式匹配都必须以)结束
双分号;;表示命令序列结束,相当于java中的break
最后的*表示默认模式,相当与java中的default

for循环

基本语法1

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

实操:
从1加到100

[yyx@hadoop04 ~]$ vim for1.sh

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

[yyx@hadoop04 ~]$ sh for1.sh
5050

基本语法2

for 变量 in 值123.....
do
	程序
done

实操:


#!/bin/bash
for i in "$*"
do
        echo $i
done
for i in "$@"
do
        echo $i
done

[yyx@hadoop04 ~]$ sh for2.sh aaa bbb ccc ddd
aaa bbb ccc ddd
aaa
bbb
ccc
ddd

while循环

基本语法

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

实操:

[yyx@hadoop04 ~]$ vim while.sh

#!/bin/bash
#用while循环输出1100的和
i=1
s=0
while [ $i -le 100 ]
        do
                s=$[ $s+$i ]
                i=$[ $i+1 ]
        done
        echo $s 

[yyx@hadoop04 ~]$ sh while.sh 
5050

read控制台输入

[yyx@hadoop04 ~]$ vim testread.sh

#!/bin/bash
read i
echo $i

[yyx@hadoop04 ~]$ sh testread.sh
aaa
aaa

太单调,放一些提示信息

[yyx@hadoop04 ~]$ vim testread.sh 

#!/bin/bash
read -p "请输入变量" i
echo $i

[yyx@hadoop04 ~]$ sh testread.sh
请输入变量 aaa
aaa

设置时间限制:

[yyx@hadoop04 ~]$ vim testread.sh 

#!/bin/bash
read -p "请五秒内输入变量" -t 5  i
echo $i

函数

系统函数

自定义函数

基本语法

[ function ] funname[()]
	{
		Action
		[return int;]
	}
funname #表示调用函数

注意:

必须在调用函数之前声明函数,shell是逐行执行语言,不会向其他语言一样先编译
函数返回函数值,只能通过$?变量来获得,return返回的是函数执行成功或失败的状态码,而不是结果。return后加数值(0-255)

参数并不是放在()中
实操:

[yyx@hadoop04 ~]$ vim functionAaa.sh

#!/bin/bash
function aaa(){
        echo aaa
}
aaa
[yyx@hadoop04 ~]$ sh functionAaa.sh 
aaa

Shell工具(工具)

cut

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

基本语法

cut 【参数】 filename
在这里插入图片描述
实操:

[yyx@hadoop04 ~]$ ifconfig ens33 | grep  "inet " | cut -d" " -f10
192.168.111.114

注意空格,很重要

sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

基本语法

sed [选项参数] ‘command’ filename
在这里插入图片描述
命令功能描述
在这里插入图片描述

正则表达式(简要)

在这里插入图片描述
实操:
创建set文件并插入数据

[yyx@hadoop04 ~]$ vim set.txt

aaaaaaaaaaa
bbbbbbbbbbbbbb
cccccccccccccccccc
woxiangmonidetoufazhishijiandandeshitana
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
nituibanbudedongzuorenzhendema
xiaoxiaodedongzuoshanghaihainameda
wozhixiangbanyangeshenshi
cainenghenishuoshuohua                

1.将duanduan插入第二行并打印

[yyx@hadoop04 ~]$ sed '2 a duanduan' set.txt 
aaaaaaaaaaa
bbbbbbbbbbbbbb
duanduan
cccccccccccccccccc
woxiangmonidetoufazhishijiandandeshitana
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
nituibanbudedongzuorenzhendema
xiaoxiaodedongzuoshanghaihainameda
wozhixiangbanyangeshenshi
cainenghenishuoshuohua

未 -i 文件不改变
2.删除所有包含z的行
//中表示正则表达式

[yyx@hadoop04 ~]$ sed '/z/ d' set.txt 
aaaaaaaaaaa
bbbbbbbbbbbbbb
cccccccccccccccccc
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
cainenghenishuoshuohua

3.将文件中所有z换成y
g表示全部替换

[yyx@hadoop04 ~]$ sed 's/z/y/g' set.txt 
aaaaaaaaaaa
bbbbbbbbbbbbbb
cccccccccccccccccc
woxiangmonidetoufayhishijiandandeshitana
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
nituibanbudedongyuorenyhendema
xiaoxiaodedongyuoshanghaihainameda
woyhixiangbanyangeshenshi
cainenghenishuoshuohua

awk

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

基本语法

awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
在这里插入图片描述
实操,还是以刚刚的set.txt练习
1.搜索以wo开头的所有行,并且按i分割,输出第七列

[yyx@hadoop04 ~]$ awk -F i '/^wo/{print $7}' set.txt
tana
ma

2.搜索所有以wo开头的行,并按i分割,输出第2列和第5列

[yyx@hadoop04 ~]$ awk -F i '/^wo/{print $7,$5}' set.txt
tana j
ma angpengyouy
awk内置变量

在这里插入图片描述

sort

排序

基本语法

sort(选项)(参数)
在这里插入图片描述
参数:指定待排序的文件列表

默认按照字符串按位比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值