5 Linux 脚本文件shell

Linux

1 基础知识

1.1 shell介绍
1.1.1 学习shell的目的

提升工作效率
减少重复工作
完成批量操作
节省人力成本

1.1.2 学习shell的方法

掌握系统基础命令
掌握系统正则符号
掌握脚本语句用法

1.2 变量
1.2.1 常规变量

临时定义方式
在脚本中或命令行中设置
变量定义是临时的,重新连接主机后临时变量会失效。

num=123
echo $num

永久定义方式
在特殊系统变量文件中设置

/etc/profile  /etc/bashrc  ~/.bashrc
1.2.2 环境变量
export INFO="XXXX"

env|grep INFO

有export定义变量:对当前登录窗口所有shell都生效;
无export定义变量:只对当前shell生效。

1.2.3 特殊变量
$0:	用于获取脚本名称信息,直接显示脚本名称和路径
echo "$0脚本执行失败,请检查脚本逻辑。"

$#:统计出脚本的传入参数的数量
[ $# -eq 2 ] || "此脚本只能传入两个参数。"

$*:输出传入脚本的所有参数

$@:输出传入脚本的所有参数

$?:输出命令执行返回值,利用返回值可以判断命令是否执行成功
echo $?
    0 		表示操作执行成功
	非0		表示操作执行失败

$$  获取一个脚本执行的pid信息

$!  获取上一个程序或脚本后台运行的pid信息
    sh test.sh &    --- 让脚本后台运行

$_  获取脚本的最后一个参数信息
    sh test.sh  a b c 
	echo $_
	c 
1.2.4 变量操作
1.2.4.1 变量设置与调用
  1. 进行字符串设置
name="oldboy" 
name=”123456"  
name="oldboy edu python"
  1. 进行变量调用
info="python" 
name="$info"
  1. 进行命令信息设置
    可以提升脚本文件的跨平台性。
IP_info="$(hostname -i)"  
IP_info=`hostname -i`
1.2.4.2 变量赋值方式
  1. 直接赋值
a=1 
b=2  
echo $a $b
  1. 传参赋值
    以空格区分出各个参数
a=$1 b=$2 ./test.sh oldboy oldgirl
  1. 交互赋值
    需要交互询问信息进行赋值。
read -p "请输入学员姓名: " name age
echo $name >> class.txt
echo $age >> class.txt
1.3 脚本执行方法
  1. 对脚本文件进行授权,直接执行脚本文件。
vim test.sh
#!/bin/bash
定义了脚本文件执行时所需的解释器
chmod +x test.sh
为脚本文件添加执行权限

ll test.sh
-rwxr-xr-x. 1 root root 31 Aug 15 15:21 test.sh

./test.sh
执行脚本文件
  1. 利用命令信息执行脚本
利用命令解释器执行脚本
sh ./test.sh  
bash ./test.sh

加载脚本文件,调用脚本数据信息
source ./test.sh  					
1.4 系统正则知识

使用正则的命令

grep 过滤 
sed 编辑
awk 分析

查看

man grep/sed/awk 
1.4.1 基础正则符号
^  $  ^$  .  *  .*  \  []  [^]

^:可以匹配以指定信息开头的内容
$:可以匹配以指定信息结尾的内容
grep ^o test.txt
grep x$ test.txt

^$:可以匹配空行信息
grep ^$ test.txt
grep -vE "^$|^#" test.txt		--- 排除注释信息(#开头)和空行信息
-v 取反
	
.:匹配任意且只有一个字符信息
*:匹配任意一个字符连续出现0次或多次情况
.*:匹配任意所有字符信息
grep g.d test.txt
gad gbd gcd

grep go*d test.txt
gd god good goood

grep ^g.*d$ test.txt

\:转义符号
将有意义信息变得没有意义,
将没有意义的信息变得有意义。
grep "\.$" test.txt	找出以.结尾的内容
echo -e "a\nb\nc"
	    
[]:批量取出多个字符信息 
取出大写字母
grep "[A-Z]" test.txt

[^]:排除指定多个字符信息,并进行过滤
grep "[^4]" test.txt
1.4.2 扩展正则符号

识别扩展正则符号

grep -E 过滤 
sed -r 编辑
awk 分析
+ | {} () ?

+:匹配任意一个字符连续出现1次或多次情况
grep -E "o+" test.txt

|:可以匹配多个信息,多个信息之间是或者关系
grep  -E "gad|gbd" test.txt 

{}:可以指定连续匹配的次数信息 
    {n} 	正好连续n次
	{n,}	最少连续出现n次,超过n次默认匹配
    {,n}    最多连续出现n次,少于n次默认匹配(贪婪)
	{n.m}   最少连续出现n次,最多匹配连续出现m次
	
grep -E "o{3,}" test.txt

():将多个字符信息当成一个整体进行匹配
grep -E "(god)" test.txt

?:匹配任意一个字符连续出现0次或1次情况
grep -E "go?d" test.txt

2 进阶知识

2.1 计算
  1. 整数运算 $(())
    $(()) 实现数值信息运算,只支持整数运算。
echo $((1+2))
  1. 自增自减运算
echo $((a++))
echo $((a--))
echo $((++a))
echo $((--a))
  1. 整数运算 let
    let 实现数值信息运算,只支持整数运算。
i=2
let i=i+8
echo $i

企业案例: 监控web页面状态信息,失败2次,实现报警功能

#!/bin/bash 
timeout=5
fails=0
success=0
url=$1

while true
do
   wget --timeout=$timeout --tries=1  http:://$url  -q
   if [ $? -ne 0 ]
   then 
       let fails=fails+1
   else
       let success++
   fi
   if [ $fails -eq 2 ]
   then 
       mail 报警信息 xxx
   fi
done
sh monitor.sh  http://www.baidu.com &
  1. 整数运算 expr

expr 实现数值信息运算,只支持整数运算。

expr 1 + 1

i=1
expr $i - 1

expr做整数判断。

a=$1
expr $a + 0 &>/dev/null
[ $? -eq 0 ] && echo 输入的信息是整数 || echo 输入的是非整数信息
  1. 整数/小数运算 bc
    bc 实现数值信息运算,支持整数和小数运算。
echo 3 + 5|bc
echo 3.3 + 5.3|bc
echo 3.3679 + 5.30987|bc
2.2 比较
2.2.1 数值比较

记录学员信息,如果学员年龄信息大于30岁,不能进行录取。

#!/bin/bash
read -p "请输入您的年龄:" age
if [ $age -gt 30 ]
then
  echo 不能进行录取
else
  echo 欢迎加入
fi
-lt  小于
-gt  大于
-eq  等于
-ne  不等于
-le  小于等于
-ge  大于等于
2.2.2 字符串比较

验证员工口令,口令通过可以进入公司。

#!/bin/bash
read -p "请说出口令信息:" age
if [ "$age" == "天王盖地虎" ]
then
  echo 欢迎来到
else
  echo 有入侵人员
fi
==  判断字符串信息是否匹配
!=  判断字符串信息是否不匹配
2.3 判断
2.3.1 if判断语句
  1. 单分支判断语句
if [ 好看 ]
then
  和他/她在一起
fi
  1. 双分支判断语句
if [ 好看 ]
then
  和他/她在一起
else
  培养培养
fi
  1. 多分支判断语句
if [ 好看 ]
then
  和他/她在一起
elif [ 身材好 ]
then
  和他/她在一起
elif [ 家境好 ]
then
  和他/她在一起
else
  先单身
fi 		  
2.3.2 if判断案例

eg01:输入两个数字 判断两个数字是否是整数。

#!/bin/bash 
read -p "请输入第一个数字: "  num1
read -p "请输入第二个数字: "  num2
if [ -z "$num1" ]
then
    echo "输入的第一个数字为空,请重新输入"
	exit 
elif [ -z "$num2" ]
then
    echo "输入的第二个数字为空,请重新输入"	
    exit
elif [[  "$num1" =~ ^[0-9]+$ && "$num2" =~ ^[0-9]+$ ]]
then 
    echo "输入内容均为整数"
else 
    echo "输入内容非整数信息"
	exit
fi

eg02:判断当前网络地址中,有哪些地址是已使用地址,有哪些地址是未使用地址。

并行执行{} &

10.0.0.0/24  10.0.0.1 ~ 10.0.0.254
ping -c 3 -W 3

#!/bin/bash 
for ip in 10.0.0.{1..254}  10.0.0.2
do 
   { ping -c 3 -W 3 $ip &>/dev/null
   if [ $? -eq 0 ]
   then 
       echo $ip is online
   else 
       echo $ip is offline
   fi } &
done 

eg03: 猜商品价格(1-100) 已知鼠标=50 随机

如何生成随机数字:

方法一:通过random变量产生随机数
echo $RANDOM  0-32768
方法二:通过openssl命令产生随机数
openssl rand -base64 10
方法三:通过时间信息获取随机数
date +%S%N
方法四:利用UUID文件生成随机数
cat /proc/sys/kernel/random/uuid
#!/bin/bash 
num=`echo $((RANDOM%100+1))`
echo $num >/tmp/oldboy.txt 
while true  
do 
   let i++
   read -p "请输入一个数字[1-100]: " info 
   if [ $info -gt $num ]
   then 
      echo "你输入的数字大了"
   elif [ $info -lt $num ]
   then 
      echo "你输入的数字小了"
   else
      echo "恭喜你猜对了 总共猜了 $i 次"
      exit
   fi		  
done 
2.3.3 case判断 流程控制语句
case 变量名 in 
   模拟匹配1)
        模式1匹配处理
		;;
   模拟匹配2)
        模式2匹配处理
		;;		
   模拟匹配3)
        模式2匹配处理
		;;		
   *)
        其他匹配处理
esac
2.3.4 case判断案例

eg01:根据学习课程显示报价:

#!/bin/bash 
echo -e "课程说明\npython课程\nlinux课程\n网络安全"
read -p "请选择要学习课程,可以提供价格参考:" name
case $name in 
python|PYTHON)
	echo python 课程 20000 元
	;;
linux|LINUX)
	echo linux  课程 15000 元
	;
网络安全)
	echo 网络安全课程 10000 元
	;;
	*)
	echo 您输入课程参数无法提供
esac

eg02:菜单功能进行自动化管理

#!/bin/bash 
meun() {
cat <<EOF
1. 显示系统负载信息
2. 显示系统磁盘信息
3. 显示系统内存信息
4. 显示系统登录用户
EOF 
}
 
while true 
do 
read -p "请输入想要查看的系统信息编号:" num 
case $num in 
1) 
	uptime
	;;
2)
    df -h 
	;;
3) 
    free -h 
	;;
4) 
    w 
	;;
*)
    echo 请输出选项编号
esac
done 
2.4 循环

循环语句 for while until

2.4.1 for循环 有限循环
for 变量名称 in 循环范围  {1..10} / oldboy oldgirl oldman / `cat user_list.txt`
do 
	循环操作命令 
done
#!/bin/bash 
for user in oldman{01..03}
do
	useradd $user
done 
2.4.2 while循环 无限循环

while循环可用于守护进程。
当设置为有限循环时,只有条件不满足时,循环结束。
while 条件=true 循环就会一直执行;
while 条件=false 循环就会立刻终止。

无限循环
while true
do 
	每次循环做的操作
done 
 
有限循环
while [ 条件表达式 ]
do
	每次循环做的操作 
done
#!/bin/bash 
i=0
while [ $i -le 20 ]
do
	echo oldboy $i
    let i++
done
2.4.3 until循环 无限循环

until循环可用于守护进程。

当设置为有限循环时,只有条件满足时,循环结束
until 条件=true  	循环就会立刻终止
until 条件=false 	循环就会一直执行
 
无限循环:
until false
do 
	每次循环做的操作
done 
 
有限循环:
while [ 条件表达式 ]
do
	每次循环做的操作 
done	 

3 高级知识

3.1 函数
3.1.1 简介

脚本函数:命令的集合或完成特定功能代码块,并且代码块可以重复使用。

函数名称() {
	[ $# -ne 2 ] && echo 输入两个参数
}
3.1.2 函数操作
函数的三种定义方式:
test1() {
	echo '定义第一个函数'
}

function test2() {
	echo '定义第二个函数'
}	 

function test3 {
	echo '定义第三个函数'
}	  

函数调用
test1
test2	 
test3 	  
3.2 数组

将大量不同元素进行整合汇总,整体汇总数据称为数组。

设置一个数组
array=(oldboy oldgirl oldman)	

调用数组中指定元素
echo ${array[0]}
echo ${array[1]}

调用数组中所有元素
echo ${array[*]}

查看数组中元素数量
echo ${#array[*]}

eg:为班级学员依次自动设置学号。

#!/bin/bash 
array=(
oldboy
oldgirl 
oldman
oldwoman
)

for ((i=0;i<${#array[*]};i++))
do 
	echo "我是第$i学号学员,我的姓名是${array[$i]}。"
done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux Shell脚本文件是一种文本文件,包含一系列命令和脚本语句,用于自动化执行一系列操作。你可以使用文本编辑器创建一个扩展名为.sh的文件,并在其中编写Shell脚本代码。然后,你可以通过终端运行这个脚本文件,让系统按照你的脚本指令执行相应的操作。 为了引用外部脚本并将其内容合并到当前脚本中,你可以使用`.`或者`source`命令,后跟外部脚本文件名。例如,你可以使用以下命令来引用名为filename的外部脚本: ``` . filename ``` 或 ``` source filename ``` 显示主目录下以`.bash`开头的文件脚本可以使用以下代码: ```bash #!/bin/bash for FILE in $HOME/.bash* do echo $FILE done ``` 在这个脚本中,`$HOME`代表当前用户的主目录,`$HOME/.bash*`会匹配主目录下以`.bash`开头的文件。然后,使用循环遍历匹配到的文件,并用`echo`命令将文件名打印出来。 关于注释的问题,在Shell脚本中,你可以使用`#`进行单行注释。注意,Shell脚本中没有多行注释的语法,你只能在每一行前加上`#`来实现注释。例如,下面是一个使用了注释的Shell脚本示例: ```bash #!/bin/bash # 这是一个Shell脚本示例 # 用于打印"Hello, world!"到终端 echo "Hello, world!" ``` 在这个示例中,`#`后的内容将被视为注释,不会被脚本执行。 希望这些信息对你有帮助!如果你有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值