首页 > 系统相关 >shell编程五

shell编程五

时间:2024-09-29 20:22:30浏览次数:7  
标签:shell Kylin V10 sp3 echo array root 编程

10.循环

10.1 循环概述

循环类型 说明
for循环 最常用的循环,2种格式
while循环 当型循环 while可以加入条件死循环, 读取文件
do until 循环 直到循环 极少用

10.2 for循环

10.2.1 最常用的for循环格式

# 最常用的一种
for 变量 in 候补清单(列表)
do
命令
done

for n in 1 2 4 5 6 79 81
do
echo $n
done
第1次循环 变量n的值就是 1
第2次循环 变量n的值就是 2
第3次循环 变量n的值就是 4
第4次循环 变量n的值就是 5
.。。。。。

for n in {1..10} `seq 10` `ls /etc/`

 10.2.2 c语言格式for循环

for((i=1;i<=3;i++))
do
echo $i
done
1
2
3
i=1 变量i初始化是1.(第1次循环的时候)
i<=3 i的值小于等于10的时候运行循环语句。(条件)
每次循环后执行i++ i=i+1
1.执行循环
2.i初始值是1
3.进行判断i<=3,满足条件,运行循环。
4.运行命令,运行完成后。
5.执行i++,然后进行下次循环。
6.循环3-5步骤

10.2.3 for循环格式及应用场景

for循环格式 格式 应用场景
⭐ 通用格式

for n in {1..10}

do

echo $n

done

通用,大部分场景可用。
c语言格式

for((i=1;i<=10;i++))

do

echo $i

done

对数组循环使用。

10.2.4 生成随机字符

# 第1种方法
# debian/ubunt软件包叫:libstring-mkpasswd-perl 命令 mkpasswd.pl
# 红帽系列 软件包叫:   expect                  命令 mkpasswd
-l 密码长度
-d 数字数量
-s special 特殊字符
-C 大写字母
-c 小写字母
[root@Kylin-V10-sp3 ~]# mkpasswd -l 10 -d 0 -s 0 -C 0
elpamozizp
[root@Kylin-V10-sp3 ~]# 

# 第2种方法
tr
-c取反,
-d删除
/dev/urandom 字符设备,生成随机字符。
# 生成随机数不会停,用head -c10(取前10个)
[root@Kylin-V10-sp3 ~]# tr -cd 'a-z' </dev/urandom |head -c10
kmzclqoijt[root@Kylin-V10-sp3 ~]#

[root@Kylin-V10-sp3 ~]# tr -cd 'a-zA-Z0-9' </dev/urandom |head -c10
0Jn26Y83cp[root@Kylin-V10-sp3 ~]# 

# 第3种方法
uuidgen
[root@Kylin-V10-sp3 ~]# uuidgen
cb8080b6-f2ae-4f6d-a705-be4cd70d5dee

# 第4种方法
date +%N |md5sum
%N纳秒
[root@Kylin-V10-sp3 ~]# date +%N |md5sum
322cdee250bc439e704ae651e86609c5  -

# 第5种方法
$RANDOM 取值范围 0-32767
[root@Kylin-V10-sp3 ~]# echo $((RANDOM+100))
17996
[root@Kylin-V10-sp3 ~]# echo $((RANDOM+100)) | md5sum
9ee516054c3b4eaf7e7369ea37e61b84  -
[root@Kylin-V10-sp3 ~]#

10.2.5 批量创建文件

面试题: 使用for循环在root/test目录下通过随机小写10个字母加固定字符串xk批量创建10个html文件

#!/bin/bash
##############################################################
# File Name:random_file.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

dir=/root/test/

# 命令检查
check_cmd(){
    if ! which mkpasswd >/dev/null 2>&1;then
	    echo "mkpasswd 命令不存在,请安装"
		echo "debian mkpasswd.pl,红帽mkpasswd"
		exit 1
	fi
}

# 检查目录
check_dic(){
    [ ! -d $dir ] && {
	    mkdir -p /root/test/
	}
}

# 创建文件
touch_files(){
    for i in {01..10}
	do
	    random_str=`mkpasswd  -l 10  -d 0 -s 0 -C 0`
		filename=${random_str}_xk.html
		touch $dir${random_str}
	done
}

main(){
    check_cmd
    check_dic
    touch_files	
}

main

10.3 while循环

10.3.1 概述

  • while循环(当型循环,当条件满足后才能执行循环内容)
    • 加入条件(条件测试语句)
    • 死循环
    • 读取文件,管道内容

10.3.2 while循环通用格式

while 条件 #[]条件 命令
do
命令
done
# 温馨提示:
while循环只会在满足条件后运行。

10.3.3 输出1+2+3+4+5+...+10的结果

#!/bin/bash
##############################################################
# File Name:while_sum.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

# 1.while
i=1
sum=0
while [ $i -le 10 ]
	do
	    let sum=sum+i
	    let i++
	done
echo $sum

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash while_sum.sh 
55

# 2.for
sum=0
for i in {1..10} 
    do
        let sum=sum+i
    done
echo $sum

# 3.awk
[root@Kylin-V10-sp3 ~/test]# seq 10 | awk '{i+=$1} END {print i}'
55

10.3.3 while循环-死循

  • 含义:一直循环,直到用户手动中止或满足指定条件后退出。
  • 应用场景:
    • 一般与用户交互的时候或脚本在系统后台持续运行。
    • 书写一个5秒钟运行1次的任务.

面试题: 每5秒钟检查下jd.com(网站是否可以访问)curl/wget,失败超过5次则输出警告信息(重启)

check_url_while.sh
 #!/bin/bash
##############################################################
# File Name:check_url_while.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################
# 调用函数库
func_include=/server/scripts/shell-pro/func_color.sh
if [ -f $func_include ];then 
    . $func_include
else
    echo "函数库 $func_include 不存在,请检查路径"
    exit 1
fi

# 参数
url=$1
count=0
pid=$$  # 脚本进程id

# 判断参数是否为空
check_param(){
	[ -z "${url}" ] && {
		echo "请输入域名$0 url"
		exit 1
	}
}

# 记录pid
write_pid(){
    echo "$0 $pid" >/run/scripts.pid
    [ $? -ne 0 ] && {
        echo "pid 写入失败"
        exit 1
    }
}

# 检查命令
check_cmd() {
    which curl >/dev/null 2>&1
    if [ $? -ne 0 ];then
       redecho 命令curl不存在
       exit 2
    fi
}

# 检查网站
check_url(){
    while true
	    do
			curl -L $url >/dev/null 2>&1
			if [ $? -ne 0 ];then
				let $count++
				[ $count -ge 5 ] && {
					echo "网站访问失败"
					$count=0
				}
			else
				echo "网站访问成功"
			fi
			sleep 5
		done
}

main(){
    check_param
	write_pid
	check_cmd
	check_url
}

main

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_url_while.sh qq.com
网站访问成功
网站访问成功

10.3.4 while循环-读取文件内容

  • 应用场景:
    • 需要在脚本中读取文件内容,多行。
    • 此时可以选择3剑客或while循环.

使用while + read的形式去读取文件或管道内容.

查看代码
 read line #变量名字

#方式1:采用exec读取文件后,然后进入while循环处理。
exec<FILE文件
while read line
do
cmd
echo $line
done

#方式2:使用cat读取文件内容,然后通过管道进入 不适用于有变量传递场景使用。
while循环处理。
cat FILE|while read line
do
cmd
echo $line
done

# 方式3:在while循环结尾done通过输
#重定向指定读取的文件。 推荐使用.
while read line
do
cmd
done<FILE

#使用建议
如果前面是命令使用方式2即可管道形式.
如果是文件一般使用方式3即可.

通过while read方式,统计ip.txt文件,次数大于5,ping下.

while_read_total_ip.sh
 # 准备数据
cat >/server/files/ip.txt<<EOF
10.0.0.2 5
10.0.0.36  6
10.0.0.37  8
baidu.com  10
jd.com  5
EOF

#!/bin/bash
##############################################################
# File Name:while_read_total_ip.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################
src_path="/server/files/ip.txt"
func_include="/server/scripts/shell-pro/func_color.sh"

# 判断文件是否存在
file_isexist(){
	if [ -f $func_include ];then 
		. $func_include
	else
		echo "函数库 $func_include 不存在,请检查路径"
		exit 1
	fi
}

# 读取文件
read_line(){
	while read line
		do
          #ip=`echo $line+awk取列`
		  ip=`echo $line| awk '{print $1}'`
		  count=`echo $line| awk '{print $2}'`
		  if [ $count -gt 5 ];then
		      ping -c1 $ip >/dev/null 2>&1
			  [ $? -eq 0 ] && greenecho "$ip 可以访问" || redecho "$ip 不可以访问"
		  fi
		done <$src_path
}

main(){
    file_isexist
    read_line
}
main

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash while_read_total_ip.sh 
10.0.0.36 可以访问
10.0.0.37 不可以访问
baidu.com 可以访问

# 如果文件列数较少,while读文件也可以用如下方法
while read ip count
do
#ip=`echo $line+awk取列`
if [ $count -ge 5 ];then
    ping -c 1 $ip &>/dev/null
    if [ $? -eq 0 ];then
        greenecho "$ip 可以访问"
    else
        redecho "$ip 不可以访问"
    fi
fi
done <$src_file

while读取文件的方法2 vs 方法3 区别

while_read_dif.sh
 #!/bin/bash
##############################################################
# File Name:while_read_dif.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################
file=/server/files/ip.txt

i=0
j=0
#01
echo "方法2:while + cat"
cat $file |while read ip
do 
     echo $ip
     let i++
done
echo "次数 $i"

#02 
echo "方法3:while + 输入"
while read ipaddr
do
     echo $ipaddr
     let j++
done<$file
echo "次数  $j"

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash while_read_dif.sh 
方法2:while + cat
10.0.0.2 5
10.0.0.36 6
10.0.0.37 8
baidu.com 10
jd.com 5
次数 0
方法3:while + 输入
10.0.0.2 5
10.0.0.36 6
10.0.0.37 8
baidu.com 10
jd.com 5
次数  5

# 方法2(while read+管道)在运行的时候因为管道,创建1个子shell,变量都存放在子shell中,子shell运行完成,消失了,变量也没了。
# 方法3运行的时候是与当前脚本在同一个shell中,所以变量都保持了,可以继续使用。

 案例42(学了iptables后可以解决):分析ngx访问日志找出访问量最高前5ip及他们的访问次数,IP访问次数大于200,通过防火墙屏蔽ip

防DOS,拒绝式服务攻击.

DDOS分布式拒绝式服务攻击.

CC 基于http请求攻击.

10.3.5 小结

  • while循环
    • 一个场景就是while :或true死循环.
    • 一个场景就是while read 读取文件内容.

10.4 do-until循环

#直到型循环: 条件不满足后结束循环
until 条件
do
命令
命令
....
done
i=1
until [ $i -gt 10 ]
do
echo $i
let i++
done

10.5 循环小结

循环 格式 应用场景
for 循环 for 变量 in 清单(列表 ) ;do 命令 ;done 大部分使用
  for((i=1;i<=10;i++)) ;do echo $i ;done 数组循环
while while 条件 ;do 命令 ;done 死循环,读文件
until循环 until 条件 ;do 命令;done 很少用.

10.6 循环控制语句

流程控制语句

10.6.1 概述

语句

含义 应用场景

exit

 

终止执行脚本,退出返回值. exit n  范围:0-255

基础用法,判断后加上exit

脚本结束加上exit

用于脚本中检查部分(参数个数,检查格

式,adv: rc=0 ,可以放在脚本最后 exit $rc)

return

 

放在函数中,终止`,函数返回值

写在函数中,检查函数命令运行是否成功。方便调试.

返回值:最后1个命令或函数中关键命令.

循环控制语句

   

break

终止循环(退出循环),不会继续运行剩余循环

要在循环中表示退出循环

continue

 跳过本次循环,进入下一次循环

要在循环中跳过某一次循环。

return

function check_wget() {
#$url 是for循环中创建的
wget --spider $url >/dev/null 2>&1
rc=$?
if [ $rc -eq 0 ];then
    greenecho $url可以访问
else
    redecho $url 无法访问
fi
return $rc
}

10.6.2 实战

# continue
for n in {1..10}
    do
        [ $n -eq 5 ] && continue
        echo $n
    done

# break
for n in {1..10}
    do
        [ $n -eq 5 ] && break
        echo $n
    done

10.6.3 猜测数字

  • 生成随机数字,判断数字是什么(1-100)
  • 如果输入的数字比随机数大,提示大了,
  • 如果输入数字比随机数小,提示小了,
  • 如果等于提示恭喜并退出脚本
  • 如果输入错误则提示错误并让用户重新输入(continue)
  • 如果猜的次数超过10次则结束并输出数字(这里用下break退出)
guess_num.sh
 #!/bin/bash
##############################################################
# File Name:guess_num.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

guess_num=$((RANDOM%100+1))
count=0

# 检查数字
check_num(){
    read -p "请输入1-100内的数字:"  num
	[[ $num =~ ^[0-9]+$ ]] || {
	    echo "请输入数字"
		exit 1
	}
}

# 比较
compare(){
	while true
		do
		    check_num
			let count++
			if [ $num -ne $guess_num ];then
				[ $count -gt 7 ] &&{
					echo "次数用完了"
					break
				}
				if [ $num -gt $guess_num ] ;then
					echo "猜测的数比随机数大"
				else
					echo "猜测的数比随机数小"
				fi
				continue
			else
				echo "猜对了,数字为 $guess_num"
				break
			fi
		done
		total
    }
	
# 总结
total(){
    #conut1=`awk -vn=$count 'BEGIN {print n - 1}'`
    count1=`echo $count -1 | bc`
    echo "一共猜测了 $count 次, 猜错了 $count1 次"
}

main(){
    compare
}
main

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash guess_num.sh 
请输入1-100内的数字:50
猜测的数比随机数小
请输入1-100内的数字:75
猜测的数比随机数大
请输入1-100内的数字:62
猜测的数比随机数大
请输入1-100内的数字:56
猜测的数比随机数大
请输入1-100内的数字:53
猜测的数比随机数大
请输入1-100内的数字:52
猜测的数比随机数大
请输入1-100内的数字:51
猜对了,数字为 51
一共猜测了 7 次, 猜错了 6 次

10.6.4 案例

10.6.4.1 return

start_stop_nginx
 start_nginx() {
# Start the daemon/service
#
# Returns:
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null || return 1
start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS 2>/dev/null || return 2
}
stop_nginx() {
# Stops the daemon/service
#
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
RETVAL="$?"
sleep 1
return "$RETVAL"
}

10.6.4.2 break&continue

break n 结束多少层循环

continue n 结束当前循环,并从第几层运行

for i in {1..5}
 for i in {1..5}
    do
        for j in {a..c}
        do
            echo $i $j
        done
    done
    
for i in {1..5}
    do
        for j in {a..c}
        do
            [ $j = b ] && continue
            echo $i $j
        done
    done
    
for i in {1..5}
    do
        for j in {a..c}
        do
        [ $j = b ] && continue 2
        echo $i $j
        done
    done
for i in {1..5}
    do
        for j in {a..c}
        do
            [ $j = b ] && break
            echo $i $j
        done
    done
    
for i in {1..5}
    do
        for j in {a..c}
            do
                [ $j = b ] && break 2
                echo $i $j
            done
    done

10.6.5 小结

要求 熟练掌握breakcontinue 含义即可。

熟练使用exit

逐渐在函数中使用return.

11.数组

11.1 概述

  • 数组也是一种变量. 一组数据
  • 数组可以存放多个 相关联内容 ,通过访问数组调用结果(值)
  • 应用场景:
    • 用于存放相关的数据。
    • 获取用户连续的输入.
  • 如何创建数组(手动)
# 创建数组
[root@Kylin-V10-sp3 ~]# ip_array=(10.0.0.61 10.0.0.71 10.0.0.81)
# 输出数组中的内容(ip_array[0] 数组中的某个元素 0表示下标,元素名称.)
[root@Kylin-V10-sp3 ~]# echo ${ip_array[0]}
10.0.0.61
[root@Kylin-V10-sp3 ~]# echo ${ip_array[2]}
10.0.0.81
# 输出数组中所有值。
[root@Kylin-V10-sp3 ~]# echo ${ip_array[*]}
10.0.0.61 10.0.0.71 10.0.0.81
[root@Kylin-V10-sp3 ~]# echo ${ip_array[@]}
10.0.0.61 10.0.0.71 10.0.0.81
# 计算数组的元素的个数
[root@Kylin-V10-sp3 ~]# echo ${#ip_array[*]}
3
[root@Kylin-V10-sp3 ~]# echo ${#ip_array[@]}
3
[root@Kylin-V10-sp3 ~]

shell数组,下标或元素名字,默认只能是数字。
要在shell数字中,下标中使用字符串,需要创建关联数组。(awk中使用更多,默认就是这个) 

shell数组的循环

# 推荐的形式 ⭐
[root@Kylin-V10-sp3 ~]# names=(jd.com baidu.com taobao.com 12306.cn)
[root@Kylin-V10-sp3 ~]# for n in ${names[@]}
> do
> ping -c 1 -W 1 $n
> done
PING jd.com (211.144.24.218) 56(84) bytes of data.
64 bytes from 211.144.24.218 (211.144.24.218): icmp_seq=1 ttl=128 time=7.30 ms

--- jd.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 7.302/7.302/7.302/0.000 ms
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=11.7 ms

--- baidu.com ping statistics ---
...
[root@Kylin-V10-sp3 ~]# 

#其他形式
names=(jd.com baidu.com taobao.com 12306.cn)
for((i=0;i<${#names[@]};i++))
    do
        ping -c 1 -W 1 ${names[i]}
    done

11.2 shell数组赋值

shell数组 创建(赋值)

具体形式 应用场景

批量直接赋

 

 

array=(ip01 ip02 ip03 ip04 )

⭐ array=( 命令结果 ) # cat ip.txt 三剑客命令获取指定内容

应用最多.

逐个元素赋值

 

array[0]=a

array[1]=b

array[2]=c ......

几乎不会使用.

read命令赋值

read -p "输入数组中内容:" -a array 可以创建数组,空格分割即可.

用于连续读取数据,用户输入3个数

赋值

[root@Kylin-V10-sp3 /server/files]# cat >/server/files/ip2.txt<<EOF
> 10.0.0.5
> 10.0.0.6
> 10.0.0.7
> 10.0.0.8
> 10.0.0.9
> EOF
[root@Kylin-V10-sp3 /server/files]# ip_list=(`cat ip2.txt`)
[root@Kylin-V10-sp3 /server/files]# echo ${ip_list[0]}
10.0.0.5
[root@Kylin-V10-sp3 /server/files]# echo ${ip_list[*]}
10.0.0.5 10.0.0.6 10.0.0.7 10.0.0.8 10.0.0.9
[root@Kylin-V10-sp3 /server/files]# echo ${#ip_list[@]}
5
[root@Kylin-V10-sp3 /server/files]# 

11.3 小结

  • 如何赋值(如何创建)(通过命令结果)
  • 如何取值,统计数组元素的个数。
  • 数组与for循环
  • 未来常用的是awk数组

12. 堡垒机

12.1 shell脚本实现

功能:
1. 登录堡垒机的机器,自动运行堡垒机脚本
2. 显示菜单选择功能
    2.1 远程连接
        1 web01
        2 web02
        3 lb01
        4 db01
        5 nfs01
    2.2 测试ping,telnet
        ping
        telnet
        
# 不能给登录堡垒机的用户root权限,给了root权限也要让无法执行命令.

12.2 堡垒机核心功能

环境准备:
先配置好堡垒机到其他机器的密钥认证.
书写脚本:

备注:
整体功能OK:
存在问题:

标签:shell,Kylin,V10,sp3,echo,array,root,编程
From: https://www.cnblogs.com/daofaziran/p/18433763

相关文章

  • Python 面向对象编程基础
    面向对象编程(Object-OrientedProgramming,OOP)是一种编程范式,它将数据和操作数据的方法(函数)组合在一起,形成一个“对象”。Python是一种支持面向对象编程的语言,本文将介绍Python中面向对象编程的基础知识。类与对象在面向对象编程中,类(Class)是创建对象的蓝图或模板。它定......
  • 实验1_C语言输入输出和简单程序应用编程
    task.1//打印一个字符小人#include<stdio.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n");return0;}  task.1-1&1-2#include<stdio.h>intmain(){printf(&qu......
  • 【蓝桥杯】“萌新首秀”全国高校新生编程排位赛2
    一、Hello Lanqiao题目HelloLanqiao 代码#include<iostream>usingnamespacestd;intmain(){cout<<"HelloLanqiao";return0;}二、懒羊羊字符串题目懒羊羊字符串  题目分析1.使用一个for循环去一个一个判断输入的n行字符串2.使用一个if判断,判断......
  • C++的并发编程历史
    多线程环境并非所有的语言都提供了多线程的环境。即便是C++语言,直到C++11标准之前,也是没有多线程支持的。在这种情况下,Linux/Unix平台下的开发者通常会使用POSIXThreads,Windows上的开发者也会有相应的接口。但很明显,这些API都只针对特定的操作系统平台,可移植性较差。如果要同......
  • HarmonyOs DevEco Studio小技巧24--异步编程(Promises、async/await)
    异步编程:调用后耗时,不阻塞代码继续执行,将来完成后,触发回调函数传递结果异步编程的范畴:网络请求(如使用 fetch 或 XMLHttpRequest 发送HTTP请求获取数据)。文件读写操作(读取或写入本地文件)。数据库操作(查询、插入、更新、删除数据)。定时器函数(如 setTimeout 和 setInt......
  • Flink(八)状态编程
    Flink中的状态状态:在处理流数据时,算子(Operators)所维护的随着时间变化而持续或在特定时间点被查询的数据无状态的算子任务:只需要观察每个独立事件,根据当前输入的数据直接转换输出结果有状态的算子任务:除当前数据外,还需要一些其他数据来得到计算结果状态的分类算子状态(Operat......
  • IN612L 超低功耗的射频和系统设计、多模式协作协议栈(蓝牙5和软件无线电)以及简易的编
    IN612L超低功耗的射频和系统设计、多模式协作协议栈(蓝牙5和软件无线电)以及简易的编程工具支持。主要特性•多模协同通信协议栈低功耗蓝牙5.0完全符合低功耗蓝牙5规格高数据速率支持最高2Mbps远距离支持(125Kbps/500Kbps)。扩展广播模式支持SDR(软件定义无线电,用户......
  • 哨兵节点:思想简单,效果很棒的编程算法
    以下文章来源于IOT物联网小镇,作者道哥别人的经验,我们的阶梯!今天和同事一起调代码,定位到一处很耗时的地方。在某个线程中,同步周期需要保证在2毫秒(如果耗时不到2毫秒,那么就让剩下的时间进行sleep)。但是在调用一个模块的内部函数时,时不时的就飘到了3~5毫秒,时间抖动毫无保证。......
  • 基于python+flask框架的少儿编程网站的设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,编程教育在全球范围内日益受到重视,尤其是在基础教育阶段。少儿编程作为培养学生逻辑思维、问题解决能力和创新能力......
  • shell脚本——检索mysql数据库中得用户,如果没有就创建
     #!/bin/bash#author:goujinyangset-eUSER1=mysqlsiUSER2=dbqueryUSER3=dboperUSER4=yyzcUSERS=($USER1$USER2$USER3$USER4)USER_PASS=123123#MySQL用户名和密码MYSQL_USER="root"MYSQL_PASSWORD="Root#123"#MYSQL_HOST="local......