系统相关
首页 > 系统相关> > 学妹面前装 “X” 必备,一篇文章教你学会Shell编程~

学妹面前装 “X” 必备,一篇文章教你学会Shell编程~

作者:互联网

好文推荐

好文推荐链接
Linux系统介绍及安装教程https://blog.csdn.net/weixin_45692705/article/details/119869250?spm=1001.2014.3001.5501
深入理解Linux系统https://blog.csdn.net/weixin_45692705/article/details/119882786?spm=1001.2014.3001.5501

前言

在这里插入图片描述

文章目录


【正则表达式】

1.什么是正则表达式?

2.不同风格的正则表达式

egrep工具

  • Linux egrep命令用于在文件内查找指定的字符串。
  • egrep执行效果与"grep-E"相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。
  • egrep是用extended regular expression语法来解读的,而grep则用basic regular expression语法解读,extended regular expression比basic regular expression的表达更规范。

3.快速上手:在字典中查找单词

egrep "^a.*t$" /usr/share/dict/words     ##列出文件words中a开头t结尾的所有单词

在这里插入图片描述

egrep "^a.*t$" words | wc -w

在这里插入图片描述

4.字符集和单词

.at
[a-z]at
[abc]
[a-zA-z]
[0-9]
egrep '[a-z]at' /usr/share/dict/words

在这里插入图片描述

\<[a-z]at\>
 egrep '\<[a-z]at\>' /usr/share/dict/words 

在这里插入图片描述

5.字符类

egrep "^[[:upper:]]t$" /usr/share/dict/words

在这里插入图片描述

POSIX正则表达式中的字符类

匹配字符
[[:alnum:]]文字,数字字符
[[:alpha:]]字母字符
[[:lower:]]小写字母
[[:upper:]]大写字母
[[:digit:]]小数
[[:xdigit:]]十六进制数字
[[:punct:]]标点符号
[[:blank:]]制表符和空格
[[:space:]]空格
[[:cntrl:]]所有控制符
[[:pring:]]所有可打印的字符
[[:graph:]]除空格外所有可打印的字符

6.位置匹配

^a[a-z]t$
^[0-9]

7.字符转义

www\.google\.cn

8.重复

^a.*t$
\<hi\>.+\<Jerry\>

使用花括号{ }可以明确指定模式重复的次数。例如,{3}表示重复3次,{3,}表示重复3次或者更多次,{5,12}则表示重复的次数不少于5次,不多于12次。下面这条正则表达式匹配所有不少于8位的数。

\<[1-9][0-9]{7,}\>

用于重复模式的元字符

元字符描述
*重复0次或更多次
+重复1次或更多次
重复0次或1次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复不少于n次,不多于m次

9.子表达式

请看下面这个例子:

在这里插入图片描述

egrep "or{2,}" /usr/share/dict/words

在这里插入图片描述

10.反义

[^y]
[^aeiou]
^[^y]

11.分支

^ht$
^h|t$
Jan(uary| |\.) |Feb(uary| |\.)|Mar(ch| |\.)|Apr(il| |\.)|May( |\.)|Jun(e|\.)|Jul(y| |\.)|Aug(ust| |\.)|Sep(tember| |\.)|Oct(ober| |\.)|Nov(ember| |\.)|Dec(ember| |\.)
Jan(uary| |\.)

12. 逆向引用

(\<.*\>).?( )*\1

(\<.*\>):匹配任意长度的单词。第 1 个子表达式。
.?:匹配 0 个或 1 个标点符号。由于在句点之前匹配的是单词,因此句点.在这里只能匹配标点。
( )*:匹配 0 个或多个空格。第 2 个子表达式。
\1:指代第 1 个子表达式匹配到的模式。如果第 1 个子表达式匹配到单词 cart,那么这里也自动成为 cart。


【Shell 脚本编程】

在这里插入图片描述

第一个程序:Hello World

vim hello
#! /bin/bash
#Display a line

echo "Hello World"
chmod +x hello  	##为脚本加上可执行权限
./hello					##执行脚本

在这里插入图片描述

#! /bin/bash
Display a line
echo "Hello"

变量和运算符

1.变量的赋值和使用

# ! /bin/bash

#将一个字符串赋给变量 output
log="monday"

echo "The value of logfile is:"

#美元符号 ($) 用于变量替换
echo $log

在这里插入图片描述

log ="monday"

在这里插入图片描述

在这里插入图片描述

unset count

在这里插入图片描述

2.变量替换

注意这两个的区别

在这里插入图片描述

在这里插入图片描述

3.位置变量

#! /bin/bash

echo "\$0 = *$0*"
echo "\$1 = *$1*"
echo "\$2 = *$2*"
echo "\$3 = *$3*"

在这里插入图片描述

如下:

字符说明
$*包含参数列表
$@包含参数列表,同上
$#包含参数的个数
#! /bin/bash

#显示有多少文件需要列出
echo "$# file(s) to list"

#将参数列表中的值逐一赋给变量file
for file in $@
do
        ls -l $file
done

在这里插入图片描述

4.BASH 引号规则

  1. 双引号:阻止 Shell对大多数特殊字符(例如#)进行解释。但$、` 和 ” 仍然保持其特殊含义。
  2. 单引号:阻止 Shell 对所有字符进行解释。
  3. 倒引号:`,这个符号通常位于键盘上Esc键的下方。当用倒引号括起一个 Shell命令时,这个命令将会被执行,执行后的输出结果将作为这个表达式的值。倒引号中的特殊字符一般都被解释。

下面的脚本quote显示这3个引号的不同之处。

[root@localhost ~]# vim quote
#! /bin/bash

log=Saturday

#双引号会对其中的 “$” 字符进行解释
echo "Today is $log"

#单引号不会对特殊字符进行解释
echo 'Today is $log'

#倒引号会运行其中的命令,并把命令输出作为最终结果
echo "Today is 'date'"

在这里插入图片描述

5.运算符

Shell 中用到的运算符

运算符含义
-,+单目负,单目正
!,~逻辑非,按位取反
*,/,%乘,除,取模
+加,减
<<,>>按位左移,按位右移
<,>,<=,>=大于,小于 ,大于等于,小于等于
==,!=等于,不等于
&按位与
^按位异或
|按位或
&&逻辑与
||逻辑或
=,+=,-=,*=,/=,%=,&=,^=|=,<<=,>>=赋值,运算并赋值

( 7 + 8 ) / ( 6 − 3 ) (7 + 8) / (6 - 3) (7+8)/(6−3)

表达式求值

num=$[$num+1]

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

脚本执行命令和控制语句

1.if选择结构

最简单的if结构如下:

if test-commands
then
	commands
fi
#! /bin/bash

echo "Enter password:"
read password

if ["$password" = "mypassswd"]
then
        echo "Welcome!!"
fi

在这里插入图片描述

if test-command-1
then
	commands-1
elif test-command-2
then
	commands-2
elif test-command-3
then
	commands-3
...
else
	commands
fi

在这里插入图片描述

在这里插入图片描述

2.case多选结构

case word in
	pattern-1)
		commands-1
		;;
	pattern-2)
		commands-2
		;;
	...	
	pattern-N)
			commands-N
			;;
esac						

在这里插入图片描述

echo -n "Starting	SSH	daemon"

## Start daemon with startproc(8). If this fails
## the echo return value is set appropriate.

startproc -f -p $SSHD_PIDFILE $SSHD_BIN $SSHD_OPTS -o "PidFile=$SSHD_PIDFILE"

#Remember status and be verbose
rc_status -v
echo "Usage: $0 {start|stop|restart|}"

条件测试

1.if判断的依据

#!/bin/bash

if ./testscript -1
then
        echo "test exit -1"
fi

if ./testscript 0
then
        echo "test exit 0"
fi

if ./testscript 1
then
        echo "test exit 1"
fi

在这里插入图片描述

#!/bin/bash
exit $@

2.test命令和空格的使用

test expr
test "$password" = "john"
[ expr ]
password="john"
test "$password" = "john"
[ "$password" = "john"]
password = "john"
bash: password: 找不到命令

在这里插入图片描述

test和[命令可以对以下3类表达式进行测试;

  1. 字符串比较
  2. 文件测试
  3. 数字比较

字符串比较

用于字符串比较选项

选项描述
-z str当字符串 str 长度为 0 时返回真
-n str当字符串 str 长度大于 0 时返回真
str1 = str2当字符串 str1 和 str2 相等时返回真
str1 != str2当字符串 str1 和 str2 不相等时返回真
#!/bin/bash

read password

if [ -z "$password"]
then
	echo "Please enter the password"
fi
if [ -z ]
#!/bin/bash

if [ "ABC" = "abc" ]
then
	echo "ABC"=="abc"
else
	echo "ABC"!="abc"
fi

if [ "ABC" = "ABC" ]
then
	echo "ABC"=="ABC"
else
	echo "ABC"!="ABC"
fi

在这里插入图片描述

文件测试

选项描述
-b file当file是块设备文件时返回真
-c file当file是块设备文件时返回真
-d pathname当file是块设备文件时返回真
-e pathname当file是块设备文件时返回真
-f file当file是块设备文件时返回真
-g pathname当file是块设备文件时返回真
-h file当file是块设备文件时返回真
-p file当file是块设备文件时返回真
-r pathname当file是块设备文件时返回真
-s file当file是块设备文件时返回真
-u pathname当file是块设备文件时返回真
-w pathname当file是块设备文件时返回真
-x pathname当file是块设备文件时返回真
-o pathname当file是块设备文件时返回真
if [ -x /sbin/unconfigured.sh ]
then
	/sbin/unconfigured.sh
fi

数字比较

test int1 option int2
[ int1 option int2 ]

用于数字比较的选项

选项对应的英语单词描述
-eqequal如果相等,返回真
-nenot equal如果不相等,返回真
-ltlower than如果 int1 小于 int2,返回真
-lelower or equal如果 int1 小于或等于 int2,返回真
-gtgreater than如果 int1 大于 int2,返回真
-gegreater or equal如果 int1 大于或等于 int2,返回真
if [ $status -eq 0 ]; then
	log_success_msg "SMBD is running"
else
	log_failure_msg "SMBD is not running"
fi	

复合表达式

操作符描述
! expr“非” 运算,当expr为假时返回真
expr1 -a expr2“与” 运算,当expr1和expr2同时为真时才返回真
expr1 -o expr2“或” 运算,expr1或expr2为真时返回真
#!/bin/bash

if [ -f $@ -a -x /usr/bin/vi ]
then
	cp $@ $@.bak
	vi $@
fi
  1. 首先执行-f $@测试命令,如果S@变量(也就是用户输入的参数)对应的文件存在,那么该测试返回真(0)﹔否则整条测试语句返回假,直接跳出if语句块。
  2. 如果第一个条件为真,就执行-x /usr/bin/vi测试命令。如果/usr/bin/vi文件可执行,那么该测试返回真(0),同时整条测试语句返回真(0)。否则整条测试语句返回假,直接跳出if语句块。
  3. 如果整条测试语句返回真,那么就执行if语句块中的两条语句。
if [ ! -z "$password" -o -f ~/.public_key ]
then
	exit 0
else
	echo "Please enter the password:"
	read password
fi
  1. 首先执行! -z "Spassword"测试命令,如果字符串 password 不为空,那么该测试语句返回真(0),同时整条测试语句返回真(0),不再判断-f~/.public_key
  2. 如果第一个条件为假,就执行-f ~/.public_key测试命令。如果主目录下的.public_key文件存在,那么该测试返回真(0),同时整条测试语句返回真(0)﹔否则整条测试语句返回假,直接跳出if语句块。
  3. 如果整条测试语句返回真,那么就执行exit 0﹔否则执行else语句块中的语句。
if [ -f $@ ] && [ -x /usr/bin/vi ]
then
	cp $@ $@.bak
	vi $@
fi
if [ ! -z "$password" ] || [ -f ~/.public_key ]
then
	exit 
else
	echo "Please enter the password:"
	read password
fi

循环结构

1.while语句

while test=commands
do
	commands
done
#!/bin/bash

sum=0
number=1

while test $number -le 100
do
	sum=$[ $sum + $number ]
	let number=$number+1
done

echo "The summary is $sum"
#!/bin/bash

echo -n "Enter a number(>0):"
while read n
do
	sum=0
	count=1
	if [ $n -gt 0 ]
	then
		while [ $count -le $n ]
		do
			sum=$[ $sum + $count ]
			let count=$count+1
		done
		echo "The summary is $sum"
	else
		echo "Please enter a number greater than zero"
	fi
	
	echo -n "Enter a number(>0):"
done		

在这里插入图片描述

2.until语句

until test-commands
do
	commands
done
#! /bin/bash

sum=0
number=1

until ! test $number -le 100
do
	sum=$[ $sum + $number ]
	let number=$number+1
done

echo "The summary is $sum"
while test $number -le 100

until ! test $number -le 100

3.for语句

for variable [in list]
do
	commands
done
#! /bin/bash

for i in 1 2 3 4 5 6 7 8 9
do
	echo $i
done

在这里插入图片描述

seq 9
#! /bin/bash

for i in 'seq 9'
do
	echo $i
done
#! /bin/bash

count=0

for file in 'ls'
do
	if ! [ -d $file ]
	then
		let count=$count+1
	fi
done
echo "There are $count files"

读取用户输入

在这里插入图片描述

#! /bin/bash

read first second

echo $first
echo $second

在这里插入图片描述

脚本执行命令

1.exit命令

#! /bin/bash
exit 1

2.trap命令

#! /bin/bash

trap 'echo "Type quit to exit"' INT

while [ "$input" != 'quit' ]
do
	read input
done

在这里插入图片描述

#! /bin/bash

trap 'echo "Goodbye"; exit' EXIT

echo "Type 'quit' to exit"

while [ "$input" != "quit" ]
do
	read input
done

在这里插入图片描述

创建命令表

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot
if [ -d /etc/rc.boot ]
then
	run-parts /etc/rc.boot
fi
表示形式说明
a && b“与” 命令表。当且仅当a执行成功,才执行b
a || b“或” 命令表。当且仅当a执行失败,才执行b
a;b顺序命令表。先执行a,再执行b

其他有用的Shell编程工具

其他常用的Shell命令

命令描述
cut以指定的方式分割行,并输出特定的部分
diff找出两个文件的不同点
sort对输入的进行排序
uniq删除已经排好序的输入中的重复行
tr转换或删除字符
wc统计字符,单词和行的数量
substr提取字符串中的一部分
seq生成整数数列

1.cut命令

Beijing	010
Shanghai	021
Tianjin	022
Hangzhou	0571

在这里插入图片描述

2.diff

diff badpro badpro2
7c7
<	sleep 2s
---
> 	sleep 6s

3.sort命令

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.uniq命令

Beijing 		010
Shanghai        021
Tianjin 		022
Hangzhou        0571
Shanghai        021
# sort city.txt | uniq
Beijing 		010
Hangzhou        0571
Shanghai        021
Tianjin 		022

5.tr命令

ABC DEF GHI
jkl mno pqr
StU vwx yz
12A Cft pOd
Hct Yoz cc4

在这里插入图片描述

在这里插入图片描述

tr "A-C" "[Z*]" < alph.txt

在这里插入图片描述

6.wc命令

在这里插入图片描述

wc命令的常用选项

选项描述
-c 或 --bytes显示字节数
-l 或 --lines显示行数
-L 或 --max-linc-length显示最长 行的长度
-w 或 --words显示单词数
–help显示帮助信息

7.substr命令

在这里插入图片描述

在这里插入图片描述

8.seq命令

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


【定制工具:安全的delete命令】

  1. 在用户的主目录下添加目录.trash 用作“回收站”﹔
  2. 在每次删除文件和目录前向用户确认;
  3. 将需要“删除”的文件和目录移动到~/.trash中。

下面是这个脚本的完整代码

##建立回收站机制
##将需要删除的文件移动到~/.trash中


#!/bin/bash

if [ ! -d ~/.trash ]
then
	mkdir ~/.trash
fi

if [ $# -eq 0 ]
then
	#提示 delete 的用法
	echo "Usage: delete filel [file2 file3 ...]"
else
	echo "You are about to delete these files:"
	echo $@
	
	#要求用户确认是否删除这些文件,回答 N 或 n 放弃删除,其他字符表示确认
	echo -n "Are you sure to do that [Y/n]:"
	read reply

	if [ "$reply" != "n" ] && [ "$reply" != "N" ]
	then 
		for file in $@
		do
			#判断文件或目录是否存在
			if [ -f "$file" ] || [ -d "$file" ]
			then
				mv -b "$file" ~/.trash/
			else
				echo "$file: No such file or directory"
			done
	#如果用户回答 N或n
	else
		echo "No file removed"
	fi
fi
cp delete /bin/

整合不易还请大家一键三连评论一下~在这里插入图片描述

标签:语句,脚本,Shell,学妹,编程,echo,命令,test
来源: https://blog.csdn.net/weixin_45692705/article/details/119989901