【shell script】

news2024/11/17 3:46:11

文章目录

  • 一、基础shell script
  • 二、脚本运行方式的差异
  • 三、判断式
    • 1.利用test命令
    • 2.利用判断符号[]
  • 四、if,case语句
    • 1.if...then
    • 2.case...esac
  • 五、函数function
  • 六、循环
    • 1.while和until循环
    • 2.for循环


一、基础shell script

在“shell”部分,那是在命令行界面下让我们与系统沟通的一个工具接口。script是“脚本”的意思。整句话是说,shell script是针对shell所写的“脚本”。

操作系统的shell程序,介于用户和操作系统内核(Kernel)之间,负责将用户的命令解释成操作系统可以接受的指令,然后由操作系统来执行这些指令,并将操作系统执行的结果以用户可以了解的方式反馈给用户。

shell程序与C语言等高级语言程序不同,shell程序是通过shell命令解释器解释执行的,不生成二进制的可执行代码。由于bash是Linux下默认提供的shell解释器,并且bash也是使用最广泛、与其他shell兼容性最好的解释器,因此下面介绍的shell程序的知识都是基于bash解释器的。

sh01.sh:打印Hello World!

[root@RHEL7-2 scripts]# vim  sh01.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e “Hello World! \n“   #-e 激活转义字符
exit 0

sh02.sh:使用read命令撰写一个script。让用户输入first name与last name后,在屏幕上显示“Your full name is: ”的内容。

[root@RHEL7-2 scripts]# vim  sh02.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
read -p "Please input your first name: " firstname   	# 提示使用者输入
read -p "Please input your last name:  " lastname   	# 提示使用者输入
echo -e "\nYour full name is: $firstname $lastname"  	# 结果由屏幕输出
[root@RHEL7-2 scripts]# sh  sh02.sh

sh03.sh:利用date创建用日期命名的文件。
创建3个空的文件(通过touch),文件名开头由用户输入决定,假设用户输入“filename”,而今天的日期是2024/06/30,若想要以前天、昨天、今天的日期来创建这些文件,即filename20240628,filename20240629,filename20240630。
分析:
(1)判断文件名是否存在

1.${变量var:-value}:如果指定的变量var存在,则返回var的值,否则返回value。
2.${变量var:=value}:如果指定的变量var存在,则返回var的值,否则先将value赋给var,然后再返回value。
3.${变量var:+value}:如果指定的变量var存在,则返回value,否则返回空值。
4.${变量var:?value}:如果指定的变量var存在,则返回该var的值,否则将错误提示消息value送到标准错误输出并退出shell程序。
5.${变量var:offset[:length]}:offset和length是整数,中括号表示可选部分。表示返回从变量var的第offset+1个字符开始长度为length的子串。如果中括号部分省略,则表示返回变量var第offset+1个字符后面的子串。

(2)获取日期date
在这里插入图片描述
(3)$符号

$()命令替换
${}指定变量边界
$(())数学运算
$[]数学运算

[root@RHEL7-2 scripts]# vim  sh03.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
#  让使用者输入文件名称,并取得fileuser这个变量
echo -e "I will use 'touch' command to create 3 files." 	# 纯粹显示信息
read -p "Please input your filename: "  fileuser         	# 提示用户输入
 
#  为了避免用户随意按“Enter”键,利用变量功能分析文件名是否设置?
filename=${fileuser:-"filename"}         	# 开始判断是否设置了文件名
#  开始利用date命令来取得所需要的文件名
date1=$(date --date='2 days ago'  +%Y%m%d)	# 前两天的日期,注意+号前面有个空格
date2=$(date --date='1 days ago'  +%Y%m%d)	# 前一天的日期,注意+号前面有个空格
date3=$(date +%Y%m%d)                      	# 今天的日期
file1=${filename}${date1}                  	# 这三行设置文件名
file2=${filename}${date2}
file3=${filename}${date3}
 
#  创建文件
touch "$file1"                             
touch "$file2"
touch "$file3"
[root@RHEL7-2 scripts]# sh  sh04.sh
[root@RHEL7-2 scripts]# ll 

sh04.sh:简单的加减乘除

[root@RHEL7-2 scripts]# vim  sh04.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "You SHOULD input 2 numbers, I will cross them! \n“
read -p "first number:  " firstnu
read -p "second number: " secnu
total=$(($firstnu*$secnu))
echo -e "\nThe result of $firstnu× $secnu is ==> $total"

二、脚本运行方式的差异

在上一篇文章中介绍了三种运行脚本的方式,都会使用一个新的bash环境来运行脚本内的命令。使用这种执行方式时,其实脚本是在子程序的bash内运行的,并且当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回到父程序中。

[root@RHEL7-2 scripts]# echo  $firstname  $lastname <==首先确认变量并不存在
[root@RHEL7-2 scripts]# sh   sh02.sh
Please input your first name: Bobby                <==这个名字是读者自己输入的
Please input your last name: Yang

Your full name is: Bobby Yang      <==看吧!在脚本运行中,这两个变量会生效
[root@RHEL7-2 scripts]# echo   $firstname  $lastname
    <==事实上,这两个变量在父程序的bash中还是不存在

另一种运行方式,利用source运行脚本,在父程序中运行。

[root@RHEL7-2 scripts]# source  sh02.sh
Please input your first name: Bobby <==这个名字是读者自己输入的
Please input your last name: Yang

Your full name is: Bobby Yang      <==在script运行中,这两个变量会生效
 [root@RHEL7-2 scripts]# echo  $firstname  $lastname
Bobby Yang  						<==有数据产生

三、判断式

1.利用test命令

3.1.1 判断文件名及“文件类型”

测试标志含义
-e“文件名”是否存在
-f“文件名”是否存在且为文件file
-d“文件名”是否存在且为目录
-b“文件名”是否存在且为block device设备
-c“文件名”是否存在且为character device设备
-S“文件名”是否存在且为Socket文件
-p“文件名”是否存在且为FIFO(pipe)文件
-L“文件名”是否存在且为连结文档

3.1.2 判断文件的权限

测试标志含义
-r文件名是否存在且具有“可读”权限
-w文件名是否存在且具有“可写”权限
-x文件名是否存在且具有“可执行”权限
-u文件名是否存在且具有“SUID”权限
-g文件名是否存在且具有“SGID”权限
-k文件名是否存在且具有“Sticky bit”权限
-s文件名是否存在且为非空白文件

3.1.3 两个文件之间的比较
test file1 -nt file2

测试标志含义
-ntnewer than 判断file1是否比file2新
-otolder than 判断file1是否比file2旧
-ef判断file1与file2是否为同一文件,可以用于判断硬链接

3.1.4 两个整数之间的比较
test n1 -eq n2

测试标志含义
-eq两个数值相等 equal
-ne两个数值不相等 not equal
-gtn1大于n2 great than
-ltn1小于n2 less than
-gen1大于等于n2 great than or equal
-len1小于等于n2 less than or equal

3.1.5 判断字符串数据

测试标志含义
test -z string判定字符串是否为0?若string为空字符串,则为true
test -n string判定字符串是否非0?若string为空字符串,则为false(-n可省略)
test str1=str2判定str1是否等于str2,若相等,则回传true
test str1!=str2判定str1是否不等于str2,若相等,则回传false

3.1.6 多重条件判断
test -r filename -a -x filename

测试标志含义
-a(and)两状况同时成立。例如test –r file –a –x file,则file同时具有r与x权限时,才回传true
-o(or)两状况任何一个成立。例如test –r file –o –x file,则file同时具有r或x权限时,就可回传true
!反相状态,如test !-x file,当file不具有x时,回传true

sh05.sh:让读者输入一个文件名,然后作如下判断。文件是否存在,若不存在则给出“Filename does not exist”的信息,并中断程序。若这个文件存在,则判断其是文件还是目录,结果输出“Filename is regular file”或“Filename is directory”。判断一下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据。

[root@RHEL7-2 scripts]# vim  sh05.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#  让使用者输入文件名,并且判断使用者是否输入了字符串
echo -e "Please input a filename, I will check the filename's type and permission. \n\n"
read -p "Input a filename : " filename
test -z $filename && echo "You MUST input a filename." && exit 0

#  判断文件是否存在,若不存在则显示信息并结束脚本
test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0
# 开始判断文件类型与属性
test -f $filename && filetype="regulare file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable“

# 开始输出信息
echo "The filename: $filename is a $filetype"
echo "And the permissions are : $perm"

2.利用判断符号[]

[□"$HOME"□==□"$MAIL"□]

  • 在中括号 [] 内的每个组件都需要有空格键来分隔。
  • 在中括号内的变量,最好都以双引号括起来。 [□“$name” □==□“yang”□]
  • 在中括号内的常数,最好都以单或双引号括起来。

sh06.sh:当运行一个程序的时候,这个程序会让用户选择Y或N。
如果用户输入Y或y时,就显示“OK, continue”。
如果用户输入n或N时,就显示“Oh, interrupt!”
如果不是Y/y/N/n之内的其他字符,就显示“I don’t know what your choice is”。
分析:需要利用中括号、&&与 ||。

[root@RHEL7-2 scripts]# vim  sh06.sh
read -p "Please input (Y/N): " yn
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK, continue" && exit 0
[ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh, interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0

四、if,case语句

1.if…then

单层、简单条件判断式
if [条件判断式]; then
  当条件判断式成立时,可以进行的命令工作内容;
fi <==将if反过来写,就成为fi了,结束if之意

多重、复杂条件判断式
if [条件判断式]; then
  当条件判断式成立时,进行的命令工作内容;
else
  当条件判断式不成立时,进行的命令工作内容;
fi

多个条件判断多个条件判断 (if…elif…elif… else)
分多种不同情况运行
if [条件判断式一]; then
  当条件判断式一成立时,进行的命令工作内容;
elif [条件判断式二]; then
  当条件判断式二成立时,进行的命令工作内容;
else
   当条件判断式一与二均不成立时,进行的命令工作内容;
fi

sh07.sh:编写一个shell脚本,以一个普通文件作为参数。其功能是:判断文件的大小是否为0,如果是则删除它;否则将该文件的内容输出到标准输出。

#!/bin/bash

read -p "input a filename:" filename
if [ -f "$filename" ];then
        if [ -s "$filename" ];then
                cat $filename
        else
                rm -f $filename
        fi
else
        echo "$filename is not a file."
fi

sh08.sh:如果用户输入Y或y时,就显示“OK, continue”。
如果用户输入n或N时,就显示“Oh, interrupt!”
如果不是Y/y/N/n之内的其他字符,就显示“I don’t know what your choice is”

#!/bin/bash
read -p "Please input (Y/N): " yn
if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
  echo "OK, continue"
elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
      echo "Oh, interrupt!"
else
      echo "I don't know what your choice is"
fi

sh09.sh:判断$1是否为hello,如果是的话,就显示“Hello, how are you ?”。
如果没有加任何参数,就提示用户必须要使用的参数。
而如果加入的参数不是hello,就提醒用户仅能使用hello为参数。

[root@RHEL7-2 scripts]# vim  sh09.sh
if [ "$1" == "hello" ]; then
      echo "Hello, how are you ?"
elif [ "$1" == "" ]; then
      echo "You MUST input parameters, ex> {$0 someword}"
else
      echo "The only parameter is 'hello', ex> {$0 hello}"
fi

sh10.sh:假设需要检测的是比较常见的port 21, 22, 25及80,那么如何去检测当前主机是否开启了这4个主要的网络服务端口?

[root@RHEL7-2 ~]# netstat  -tuln # 获取主机取得的服务
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address     Foreign Address   State
tcp        0      0 0.0.0.0:111       0.0.0.0:*         LISTEN
tcp        0      0 127.0.0.1:631  	   0.0.0.0:*         LISTEN
tcp        0      0 127.0.0.1:25   	   0.0.0.0:*         LISTEN
tcp        0      0 :::22           	   :::*               LISTEN
udp        0      0 0.0.0.0:111   	   0.0.0.0:*
udp        0      0 0.0.0.0:631   	   0.0.0.0:*
#封包格式           本地IP:端口     	 	   远程IP:端口       是否监听
[root@RHEL7-2 scripts]# vim  sh10.sh
echo "Now, I will detect your Linux server's services!"
echo -e "The www, ftp, ssh, and mail will be detect! \n"
#  开始进行一些测试的工作,并且也输出一些信息
testing=$(netstat -tuln | grep ":80 ")   # 检测port 80存在否
if [ "$testing" != "" ]; then
      echo "WWW is running in your system."
fi
testing=$(netstat -tuln | grep ":22 ")   # 检测port  22存在否
if [ "$testing" != "" ]; then
 echo "SSH is running in your system."
fi
testing=$(netstat -tuln | grep ":21 ")   # 检测port 21存在否
if [ "$testing" != "" ]; then
      echo "FTP is running in your system."
fi
testing=$(netstat -tuln | grep ":25 ")   # 检测port 25存在否
if [ "$testing" != "" ]; then
      echo "Mail is running in your system."
fi

sh11.sh:有个军人想要计算自己还有多长时间会退伍,让用户输入他的退伍日期,从而帮他计算还有多少天会退伍?
分析:由于日期是要用相减的方式来处置,通过使用date显示日期与时间,将其转为由1970-01-01累积而来的秒数,通过秒数相减来取得剩余的秒数后,再换算为天数即可。

#!/bin/bash
#  告诉使用者这个程序的用途,并且告诉应该如何输入日期格式
echo "This program will try to calculate :"
echo "How many days before your demobilization date..."
read -p "Please input your demobilization date (YYYYMMDD ex>20120401): " date2

#  利用正则表达式测试一下这个输入的内容是否正确,
date_d=$(echo $date2 |grep '[0-9]\{8\}')   # 看看是否有8个数字
if [ "$date_d" == "" ]; then
      echo "You input the wrong date format...."
   exit 1
fi
# 开始计算日期
#declare -i date_dem=`date --date="$date2"  +%s`     # 退伍日期秒数,注意+前面的空格
declare -i date_dem=$(date -d "$date2" +%s)

#declare -i date_now=`date  +%s`                     # 现在日期秒数,注意+前面的空格
declare -i date_now=$(date +%s)

declare -i date_total_s=$(($date_dem-$date_now))        # 剩余秒数统计
declare -i date_d=$(($date_total_s/60/60/24)) #转为日数,用除法(一天=24*60*60(秒))
if [ "$date_total_s" -lt "0" ]; then                     # 判断是否已退伍
      echo "You had been demobilization before: " $((-1*$date_d)) " ago"
else
      declare -i date_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))
      echo "You will demobilize after $date_d days and $date_h hours."
fi

2.case…esac

假如有多个既定的变量内容,那么只要针对这几个变量来设置情况就可以了,使用case…in…esac最为方便。

case $变量名称 in #关键字为case,变量前有 $ 符
  “第一个变量内容”) #每个变量内容建议用双引号括起来,关键字则为小括号 )
  程序段
  ;; #每个类别结尾使用两个连续的分号来处理
  “第二个变量内容”)
  程序段
  ;;
 *) #最后一个变量内容都会用 * 来代表所有其他值
  不包含第一个变量内容与第二个变量内容的其他程序运行段
  exit 1
  ;;
esac #最终的case结尾!

sh12.sh:让用户能够输入one、two、three,并且将用户的变量显示到屏幕上,如果不是one、two、three,就告诉用户仅有这3种选择。

[root@RHEL7-2 scripts]# vim  sh12.sh
echo "This program will print your selection !"
case $1 in                              		
  "one")
      echo "Your choice is ONE"
      ;;
  "two")
      echo "Your choice is TWO"
      ;;
  "three")
      echo "Your choice is THREE"
      ;;
  *)
      echo "Usage $0 {one|two|three}"
      ;;
esac

五、函数function

function fname() {
  程序段
}
先定义,后使用。

function printit(){
      echo -n "Your choice is "     # 加上 -n可以不断行继续在同一行显示
}
echo "This program will print your selection !"
case $1 in
  "one")
      printit; echo $1 | tr 'a-z' 'A-Z'  # 将参数做大小写转换
      ;;
  "two")

printit; echo $1 | tr 'a-z' 'A-Z'
      ;;
  "three")
      printit; echo $1 | tr 'a-z' 'A-Z'
      ;;
  *)
      echo "Usage $0 {one|two|three}"
      ;;
esac

注意函数中的传参:

将上面的例子再次改写一下:
function printit(){
      echo "Your choice is $1"   # 这个 $1必须参考下面命令的执行
}
echo "This program will print your selection !"
case $1 in
  "one")
      printit 1  			# 请注意,printit命令后面还有参数
      ;;
  "two")
      printit 2
      ;;
  "three")
      printit 3
      ;;
  *)
      echo "Usage $0 {one|two|three}"
      ;;
esac
#执行
[root@rhel7-2 scripts]# sh sh12-2.sh two
This program will print your selection !
Your choice is 2     					//转换大小写

例:编写两个函数分别为sum()(相加函数)和multi()(相乘函数),输入两个数,分别调用两个函数输出结果。

function sum(){
        sum=$(($1+$2))
        return $sum
}
function multi(){
        multi=$(($1*$2))
        echo "The result of $p1 * $p2 is $multi"
}
read -p "input your operation:ex {+|*}" op
read -p "input your first value:" p1
read -p "input your second value:" p2

if [ "$op" == "+" ];then
        sum $p1 $p2
        sum=$?
        echo "The result of $p1 + $p2 is $sum"
elif [ "$op" == "*" ];then
        multi $p1 $p2
else
        echo "you should input + or *."
fi

六、循环

1.while和until循环

while:当条件满足时执行循环体

while [ condition ] #中括号内的状态就是判断式
do #do是循环的开始!
  程序段落
done #done是循环的结束

until:当条件满足时,退出循环体

until [ condition ]
do
  程序段落
done

sh13.sh:假设要让用户输入yes或者是YES才结束程序的运行,否则就一直运行并告诉用户输入字符。

[root@RHEL7-2 scripts]# vim  sh13.sh
while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
      read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."

或者

[root@RHEL7-2 scripts]# vim  sh13-2.sh
until [ "$yn" == "yes" -o "$yn" == "YES" ]
do
      read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."

sh14.sh:计算1+2+…+100的值

[root@RHEL7-2 scripts]# vim  sh14.sh
s=0  					# 这是累加的数值变量
i=0  					# 这是累计的数值,即1, 2, 3...
while [ "$i" != "100" ]
do
      i=$(($i+1))   		# 每次i都会添加1 
      s=$(($s+$i))  		# 每次都会累加一次
done
echo "The result of '1+2+3+...+100' is ==> $s"

2.for循环

(1)for … do … done固定循环

for var in con1 con2 con3 …
do
  程序段
done

sh15.sh:假设有三种动物,分别是dog、cat、elephant,编写程序,使每一行都按“There are dogs…”之类的样式输出。

[root@RHEL7-2 scripts]# vim  sh15.sh
for animal in dog cat elephant
do
  echo "There are ${animal}s.... "
done

sh16.sh:查找系统中所有的账号,并用id命令显示每个用户的信息。

[root@RHEL7-2 scripts]# vim  sh16.sh
users=$(cut -d ':' -f1 /etc/passwd)  	# 获取账号名称
for username in $users               		# 开始循环
do
        id $username
done

sh17.sh:让用户输入某个目录名,然后找出某目录内的文件的权限。

[root@RHEL7-2 scripts]# vim  sh18.sh
#  先判断这个目录是否存在
read -p "Please input a directory: " dir
if [ "$dir" == ""  -o  ! -d  "$dir" ]; then
      echo "The $dir is NOT exist in your system."
      exit 1
fi

#  开始测试文件
filelist=$(ls $dir)   			     # 列出所有在该目录下的文件名称
for filename in $filelist
do
      perm=""
      test -r "$dir/$filename" && perm="$perm readable"
      test -w "$dir/$filename" && perm="$perm writable"
      test -x "$dir/$filename" && perm="$perm executable"
      echo "The file $dir/$filename's permission is $perm "
done

(2)seq对数字循环
seq 用于产生从某个数到另外一个数之间的所有整数

seq … 尾数
seq … 首数 尾数
seq … 首数 增量 尾数

sh18.sh:利用ping这个可以判断网络状态的命令来进行网络状态的实际检测,要侦测的域是本机所在的192.168.10.1~192.168.10.100。

[root@RHEL7-2 scripts]# vim  sh17.sh
network="192.168.10"              	# 先定义一个网络号(网络ID)
for sitenu in $(seq 1 100)       	# seq为sequence(连续) 的缩写之意
do
      # 下面的语句取得ping的回传值是正确的还是失败的
    ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0  ||  result=1
                 # 开始显示结果是正确的启动(UP)还是错误的没有连通(DOWN)
    if [ "$result" == 0 ]; then
            echo "Server ${network}.${sitenu} is UP."
    else
            echo "Server ${network}.${sitenu} is DOWN."
    fi
done

(3)(())对数字循环

for (( 初始值; 限制值; 执行步长 ))
do
  程序段
done

sh19.sh:输入一个数值nu,计算1+2+3+…+nu的值。

[root@RHEL7-2 scripts]# vim  sh19.sh
read -p "Please input a number, I will count for 1+2+...+your_input: " nu
s=0
for (( i=1; i<=$nu; i=i+1 ))
do
  s=$(($s+$i))
done
echo "The result of '1+2+3+...+$nu' is ==> $s"

sh20.sh:设计一个shell程序,在/root目录下建立10个目录,即user1~user10,如果存在,则输出“the directory exists”,并设置每个目录的权限,其中其他用户的权限为读;文件所有者的权限为读写执行;文件所有者所在组的权限为读执行。

i=1
while [ "$i" -le 10 ]
do
        if [ -d "user$i" ];then
                echo "the user$i directory exists."
        else
                mkdir user$i
        fi
        chmod 754 user$i
        i=$(($i + 1))
done

sh21.sh:打印9*9乘法表

for ((i=1;i<=9;i=i+1))
do
        for ((j=1;j<=i;j++))
        do
                result=$(($i*$j))
                echo -n "$i*$j=$result "
        done
        echo ""
done

(4)break和continue语句
break和continue命令用于中断循环体的执行;
break命令将控制转移到done后面的命令,循环提前结束;
continue命令将控制转移到done,接着再次计算条件的值,以决定是否继续循环。

break[n]
n:表示要跳出几层循环,默认值是1
continue[n]
从continue语句的最内层循环向外跳出第n层循环,默认值为1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1891493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Socket编程用到的函数TCP UDP实例

最基本的 Socket 模型 参考这次答应我&#xff0c;一举拿下 I/O 多路复用&#xff01; (qq.com) Socket编程详解-CSDN博客 Socket是一种通信机制&#xff0c;通过它可以在不同主机之间进行数据交换。在Socket编程中&#xff0c;有两种常见的通信模式&#xff1a;客户端-服务…

采煤机作业3D虚拟仿真教学线上展示增强应急培训效果

在化工行业的生产现场&#xff0c;安全永远是首要之务。为了加强从业人员的应急响应能力和危机管理能力&#xff0c;纷纷引入化工行业工艺VR模拟培训&#xff0c;让应急演练更加生动、高效。 化工行业工艺VR模拟培训软件基于真实的厂区环境&#xff0c;精确还原了各类事件场景和…

读人工智能全传02图灵测试

1. 图灵测试 1.1. 模仿游戏 1.2. 20世纪40年代末至50年代初&#xff0c;第一台计算机的出现引发了一场公开辩论&#xff0c;辩论主题就是这一现代科学奇迹的潜力如何 1.2.1. 这场辩论中最瞩目的贡献当归属于一本名叫《控制论》的书&#xff0c;由麻省理工学院数学教授诺伯特…

Java | Leetcode Java题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution {public String shortestPalindrome(String s) {int n s.length();int[] fail new int[n];Arrays.fill(fail, -1);for (int i 1; i < n; i) {int j fail[i - 1];while (j ! -1 && s.charAt(j 1) ! s.charAt…

PostgreSQL的pg_filedump工具

PostgreSQL的pg_filedump工具 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777pg_filedump 是一个工具&#x…

【docker】运行阶段遇到的问题

目录 1、查询docker 下挂载了哪些工具 2、docker中的简单命令 3、实际场景应用&#xff08;redis&#xff09; 目前工作中仅用到了redis,所以没有太多经验可以交流&#xff0c;暂时仅将我目前遇到的进行发布。还请见谅。 1、查询docker 下挂载了哪些工具 docker ps -a 或者…

10.SQL注入-http header利用案例

SQL注入-http header利用案例 首先通过登录http头界面,如图所示:登录的信息会被记录到数据库中去&#xff0c;同时使用bp进行抓包分析 将抓包的数据发送repeater里面进行调试 通过useragent进行注入 将useragent对应的数据信息删除掉,输入单引号测试被后台执行报错sql语法…

《安富莱嵌入式周报》第339期:单片机运行苹果早期Mac系统模拟器,2GHz示波器有源探头,下一代矩阵开关面包板,卡片式声音分贝器,HP经典示波器,ReRAM

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版 https://www.bilibili.com/video/BV1Kf421Q7Lh 《安富莱嵌入式周报》第339期&#xff1a;单片机运行苹果早期Ma…

Newport太阳光模拟器MSOL-UV-X使用说明手侧

Newport太阳光模拟器MSOL-UV-X使用说明手侧

如何在《中国科学报》报刊上发表论文?

如何在《中国科学报》报刊上发表论文&#xff1f; 《中国科学报》征稿 中国科学院、中国工程院、国家自然科学基金委员会、中国科学技术协会共同主办报纸 【级别】&#xff1a;国家级 【版面】&#xff1a;不指定版面&#xff0c;理论稿件&#xff0c;无广告字眼 【方向】&…

尚品汇-(十一)

&#xff08;1&#xff09;spu保存 这个页面选择了手机之后&#xff0c;会调用查询分类品牌的接口&#xff0c;显示品牌&#xff0c;在分类品牌中添加了两个品牌后也会在这里显示出来 销售属性名称需要查询base_sale_attr表&#xff1a; 实体类&#xff1a;BaseSaleAttr pac…

前端三件套开发模版——产品介绍页面

今天有空&#xff0c;使用前端三件套html、css、js制作了一个非常简单的产品制作页面&#xff0c;与大家分享&#xff0c;希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍&#xff0c;同时可以安排一张产品的高清大图&#xff0c;我也加入了页面的背…

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…

Golang | Leetcode Golang题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; func _rob(nums []int) int {first, second : nums[0], max(nums[0], nums[1])for _, v : range nums[2:] {first, second second, max(firstv, second)}return second }func rob(nums []int) int {n : len(nums)if n 1 {return nums[0]}…

Tekla Structures钢结构详图设计软件下载;Tekla Structures高效、准确的合作平台

Tekla Structures&#xff0c;它不仅集成了先进的三维建模技术&#xff0c;还融入了丰富的工程实践经验&#xff0c;为设计师、工程师和建筑商提供了一个高效、准确的合作平台。 在建筑项目的整个生命周期中&#xff0c;Tekla Structures都发挥着举足轻重的作用。从规划阶段开始…

部署nginx服务用于浏览服务器目录并实现账号密码认证登录

1、背景&#xff1a; 因公司业务需求&#xff0c;部署一套数据库备份中心服务&#xff0c;但是因为备份的数据库很多&#xff0c;有项目经理要求能经常去查看备份数据库情况及下载备份数据文件的需求。根据该需求&#xff0c;需要在备份数据库的服务器上部署一个nginx服务&…

mac中如何恢复因为破解脚本导致的IDEA无法启动的问题

问题 为了在mac中安装免费的2024版idea&#xff0c;导致下载了一个脚本&#xff0c;使用这个脚本后&#xff0c;但是发现idea还没有破解&#xff0c;相反导致idea无法启动&#xff0c;每次点击&#xff0c;都会弹出“cannot start IDE…” 问题排查 在访达中点击mac的应用程…

实时数仓Hologres OLAP场景核心能力介绍

作者&#xff1a;赵红梅 Hologres PD OLAP典型应用场景与痛点 首先介绍典型的OLAP场景以及在这些场景上的核心痛点&#xff0c;OLAP典型应用场景很多&#xff0c;总结有四类&#xff1a;第一类是BI报表分析类&#xff0c;例如BI报表&#xff0c;实时大屏&#xff0c;数据中台等…

java项目总结2

3.了解Java的内存分配 4.重载 定义&#xff1a;在一个类中&#xff0c;有相同名的&#xff0c;但是却是不同参数&#xff08;返回类型可以不一样&#xff09; 重载的优点&#xff1a; 1.减少定义方法时使用的单词 2.减少调用方法时候的麻烦&#xff08;比如sum的返回两个数的…

云计算【第一阶段(22)】Linux的进程和计划任务管理

目录 一、查看进程 1.1、程序和进程的关系 1.2、查看进程 1.2.1、静态查看进程信息ps ​编辑 1.2.1.1、实验 1.2.2、动态查看进程信息top 1.2.2.1、实验 1.2.2.2、top 命令全屏操作界面快捷键 1.2.3、pgrep根据特定条件查询进程pid信息 1.2.4、pstree命令以树形结构列出…