Shell脚本基础——实训项目任务
项目一 项目实训 (初始Shell脚本)
项目一 项目实训 (初始Shell脚本)项目实施任务一 输入输出重定向任务二 数据输入输出操作任务三 Shell变量操作任务四 算术运算符操作任务五 设置环境变量
【实训任务】
本实训的主要任务是通过编写简单的shell脚本,完成使用数据输入输出命令获取用户输入,将脚本输出写入文件,以及重定向脚本的输入输出操作,并通过设置变量存储不同类型的数据,以便在脚本中处理数据。
【实训目的】
(1)掌握shell脚本的基本格式。
(2)掌握输入输出重定向和管道符的使用方法。
(3)掌握数据输入输出命令的使用方法。
(4)掌握变量的定义和调用方法。
(5)掌握运算符的使用方法。
【实训内容】
(1)使用输入输出重定向,将Shell脚本的输出重定向到文件。
(2)编写shell脚本,使用echo、printf、read命令实现数据的输入输出。
(3)编写shell脚本,定义和调用变量,并在配置文件中永久设置环境变量。
(4)编写shell脚本,进行算数运算。
【实训环境】
在进行本项目的实训操作前,提前准备好Linux操作系统环境,RHEL、CentOS Stream、Debian、Ubuntu、华为openEuler、麒麟openKylin等常见Linux发行版本都可以进行项目实训。
项目实施
任务一 输入输出重定向
1.任务描述
编写简单的shell脚本,使用输入输入重定向及管道符将脚本的信息重定向到文件。
2.任务实施
(1)创建shell脚本firstscript.sh,使用vim文本编辑器在用户家目录下创建一个新的文本文件,将其命名为firstscript.sh,插入以下文本并保存文件,将输入重定向到文件中。
[root@redhat01 ~]# vim input.txt [root@redhat01 ~]# cat input.txt 2021 2022 2023 2024 2035 2025 1999 2000 2001 [root@redhat01 ~]# vim firstscript.sh [root@redhat01 ~]# cat firstscript.sh #!/bin/bash # 从文件中读取输入 sort < input.txt [root@redhat01 ~]#
(2)使用bash命令执行脚本。
[root@redhat01 ~]# chmod +x firstscript.sh [root@redhat01 ~]# bash firstscript.sh 1999 2000 2001 2021 2022 2023 2024 2025 2035 [root@redhat01 ~]# cat input.txt 2021 2022 2023 2024 2035 2025 1999 2000 2001 [root@redhat01 ~]#
(3)将输出写入文件中。
[root@redhat01 ~]# ls -l > output.txt
(4)追加输出到文件中。
[root@redhat01 ~]# ls -l >> output.txt
(5)将标准错误输出重定向到文件中。
[root@redhat01 ~]# ls -l /non-existent-dir 2>error.log
(6)使用输入重定向忽略read命令的输入。
[root@redhat01 ~]# vim file.sh [root@redhat01 ~]# cat file.sh #!/bin/bash # 忽略read命令的输入 read -p "Enter your name: " name < /dev/null echo "Your name is : $name"
(7)从标准输入中读取多行文本。
[root@redhat01 ~]# vim file.sh [root@redhat01 ~]# cat file.sh #!/bin/bash echo "Enter some text (Ctrl+D to finish):" cat << EOF This is line 1 This is line 2 This is line 3 EOF
(8)将多行文本输入到文件。
[root@redhat01 ~]# vim file.sh [root@redhat01 ~]# cat file.sh #!/bin/bash cat << EOF > output.txt This is new line 1 This is new line 2 This is new line 3 EOF
(9)将多行文本追加到文件。
[root@redhat01 ~]# vim file.sh [root@redhat01 ~]# cat file.sh #!/bin/bash cat << EOF >> output.txt This is line 4 This is line 5 This is line 6 EOF
任务二 数据输入输出操作
1.任务描述
编写shell脚本,通过数据输入输出与用户交互,使用户输入数据或输出信息;通过数据输入输出读取文件中的数据或写入数据到文件中;通过数据输入输出可以与其他程序或系统交互,以获取或输出数据。使用read命令读取用户输入的数据,使用echo或printf命令输出信息。
2.任务实施
(1)使用read命令读取用户输入的数据。
[root@redhat01 ~]# vim printf01.sh [root@redhat01 ~]# cat printf01.sh #!/bin/bash # 读入用户输入的数字 read -p "Enter a number: " num # 输出用户输入的数字 echo "You entered: $num" # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x printf01.sh [root@redhat01 ~]# bash printf01.sh Enter a number: 100 You entered: 100
(2)使用read命令读取多个数据。
[root@redhat01 ~]# vim printf02.sh [root@redhat01 ~]# cat printf02.sh #!/bin/bash # 读取多个数据 read -p "Enter your name, age and gender: " name age gender # 输出数据 echo "Name: $name" echo "Age: $age" echo "Gender: $gender" # 执行脚本并查看输出结果 [root@redhat01 ~]# bash printf02.sh Enter your name, age and gender: Tom 18 male Name: Tom Age: 18 Gender: male [root@redhat01 ~]#
(3)使用read命令读取文件中的每一行内容。
[root@redhat01 ~]# vim file.txt [root@redhat01 ~]# cat file.txt www.opencloud.fun www.redhat.com Linux Shell and Ansible [root@redhat01 ~]# vim printf03.sh [root@redhat01 ~]# cat printf03.sh #!/bin/bash # 读取文件中的每一行内容 while read line; do# 输出读取的每一行内容echo $line done < file.txt # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x printf03.sh [root@redhat01 ~]# bash printf03.sh www.opencloud.fun www.redhat.com Linux Shell and Ansible
(4)使用printf命令格式化输出数字。
[root@redhat01 ~]# vim printf04.sh [root@redhat01 ~]# cat printf04.sh #!/bin/bash printf "%.2f\n" 3.14159265 printf "%.4f\n" 3.14159265 printf "%d\n" 123456 printf "%x\n" 255 # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x printf04.sh [root@redhat01 ~]# bash printf04.sh 3.14 3.1416 123456 ff
(5)使用printf命令格式化输出字符串。
[root@redhat01 ~]# vim printf05.sh [root@redhat01 ~]# cat printf05.sh #!/bin/bash printf "%-10s %-8s %-4s\n" Name Gender Age printf "%-10s %-8s %-4d\n" John Male 30 printf "%-10s %-8s %-4d\n" Mary Female 25 # 执行脚本并查看输出结果 [root@redhat01 ~]# bash printf05.sh Name Gender Age John Male 30 Mary Female 25
(6)使用printf命令输出多个字符和字符串。
[root@redhat01 ~]# vim printf06.sh [root@redhat01 ~]# cat printf06.sh #!/bin/bash printf "%s %s %s\n" A B C printf "%s %s %s\n" A B C D E F G # 定义字符变量 char='a' # 使用%c格式化输出字符 printf "The character is %c.\n" $char # 定义字符串 string="Hello,World!" # 使用%s格式化输出字符串 printf "The string is %s.\n" "$string" # 使用%-10s格式化输出左对齐的字符串 printf "%-10s\n" "$string" # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x printf06.sh [root@redhat01 ~]# bash printf06.sh A B C A B C D E F G The character is a. The string is Hello,World!. Hello,World!
(7)使用printf命令输出变量值。
[root@redhat01 ~]# vim printf07.sh [root@redhat01 ~]# cat printf07.sh #!/bin/bash name="John" age=30 printf "My name is %s, and I am %d years old.\n" "$name" "$age" # 上面的脚本中定义两个变量:name 和 age # 使用printf命令输出字符串,并使用%s和%d占位符引用变量 # printf命令可以使用多个参数,使用变量时需要使用$调用变量 # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x printf07.sh [root@redhat01 ~]# bash printf07.sh My name is John, and I am 30 years old.
任务三 Shell变量操作
1.任务描述
在shell中,变量主要用于保存和引用各种类型的数据,可以用于存储各种信息,如字符串、数字等。变量在shell中非常常用, 可以用于存储用户输入的数据、存储程序运行过程中产生的数据、存储程序执行结果,还可以用于条件判断和循环控制、存储文件名和路径、文件处理、存储环境变量、程序的配置和运行等。
2. 任务实施
(1)编写shell脚本,使用变量获取主机的内存信息、网络互联网协议(Internet Protocol ,IP)地址、CPU负载等信息。
[root@redhat01 ~]# vim systeminfo-output.sh [root@redhat01 ~]# cat systeminfo-output.sh #!/bin/bash # 获取内存信息 memory=$(free -m | awk 'NR==2{printf "Total: %sMB, Used: %sMB, Free: %sMB", $2, $3, $4}') # 获取网络IP地址 ip=$(ip addr | grep 'inet' | grep -v 'inet6' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d '/' -f 1) # 获取CPU负载 cpu=$(top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | cut -d '%' -f 1) # 输出信息 echo "Memory: $memory" echo "IP: $ip" echo "CPU: $cpu%" # 注意,在使用变量获取信息时,需要使用$(...)语法来执行命令并将结果赋给变量 # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x systeminfo-output.sh [root@redhat01 ~]# bash systeminfo-output.sh Memory: Total: 1923MB, Used: 943MB, Free: 509MB IP: 192.168.10.10 172.17.0.1 CPU: 0.0%
(2)编写shell脚本,输出$0、$1、$2、$3、$@、$#、$!、$?、$*、$$等位置参数的变量信息。
[root@redhat01 ~]# vim location-output.sh [root@redhat01 ~]# cat location-output.sh #!/bin/bash # 提示用户输入他们的姓名 echo "Please enter your name: " read name # 输出各变量的值 echo "\$0 is: $0" echo "\$1 is: $1" echo "\$2 is: $2" echo "\$3 is: $3" echo "\$@ is: $@" echo "\$# is: $#" echo "\$! is: $!" echo "\$? is: $?" echo "\$* is: $*" echo "\$\$ is: $$" echo "Name is: $name" # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x location-output.sh [root@redhat01 ~]# bash location-output.sh one two three Please enter your name: one two three $0 is: location-output.sh $1 is: one $2 is: two $3 is: three $@ is: one two three $# is: 3 $! is: $? is: 0 $* is: one two three $$ is: 1906 Name is: one two three [root@redhat01 ~]#
(3)输出当前目的的日历信息,并使用printf命令格式化输出。
[root@redhat01 ~]# vim date-output.sh [root@redhat01 ~]# cat date-output.sh #!/bin/bash # 获取当前月份和年份 month=$(date +%m) year=$(date +%Y) # 使用cal命令获取当前月的日历 calendar=$(cal $month $year) # 使用printf命令格式化输出 printf "Calendar for %s %s:\n\n" $month $year printf "%s\n" "$calendar" # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x date-output.sh [root@redhat01 ~]# bash date-output.sh Calendar for 09 2024: 九月 2024 一 二 三 四 五 六 日12 3 4 5 6 7 89 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [root@redhat01 ~]#
(4)编写shell脚本,使用变量并结合printf命令格式化输出当前系统的磁盘分区、swap分区、逻辑卷等信息。
[root@redhat01 ~]# vim disk-output.sh [root@redhat01 ~]# cat disk-output.sh #!/bin/bash # 使用df命令获取磁盘分区信息 disk_partitions=$(df -h) # 使用swapon命令获取swap分区信息 swap_partitions=$(swapon -s) # 使用lvdisplay命令获取逻辑卷信息 logical_volumes=$(lvdisplay) # 使用printf命令格式化输出 printf "Disk Partitions:\n\n" printf "%s\n" "$disk_partitions" printf "\nSwap Partitions:\n\n" printf "%s\n" "$swap_partitions" printf "\nLogical Volumes:\n\n" printf "%s\n" "$logical_volumes" # 执行脚本并查看结果 [root@redhat01 ~]# chmod +x disk-output.sh [root@redhat01 ~]# bash disk-output.sh Disk Partitions: 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 962M 0 962M 0% /dev/shm tmpfs 385M 6.2M 379M 2% /run /dev/mapper/rhel-root 17G 4.9G 12G 30% / /dev/nvme0n1p2 960M 260M 701M 27% /boot /dev/sr0 9.9G 9.9G 0 100% /mnt /dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi tmpfs 193M 52K 193M 1% /run/user/42 tmpfs 193M 36K 193M 1% /run/user/0 Swap Partitions: Filename Type Size Used Priority /dev/dm-1 partition 2097148 0 -2 Logical Volumes: --- Logical volume ---LV Path /dev/rhel/swapLV Name swapVG Name rhelLV UUID jc19F4-wvpM-m1yp-dHIL-G1hi-ZHMW-DfYr3XLV Write Access read/writeLV Creation host, time redhat01, 2024-05-27 15:54:27 +0800LV Status available# open 2LV Size 2.00 GiBCurrent LE 512Segments 1Allocation inheritRead ahead sectors auto- currently set to 256Block device 253:1--- Logical volume ---LV Path /dev/rhel/rootLV Name rootVG Name rhelLV UUID E8Ircp-j40I-wBqh-5Zcu-OwyB-419p-311plVLV Write Access read/writeLV Creation host, time redhat01, 2024-05-27 15:54:27 +0800LV Status available# open 1LV Size 16.41 GiBCurrent LE 4201Segments 1Allocation inheritRead ahead sectors auto- currently set to 256Block device 253:0[root@redhat01 ~]#
任务四 算术运算符操作
1.任务描述
在shell中,算术运算主要用于执行各种数学计算。常见的算术运算包括加法、减法、乘法、除法、求余数、幂运算等。
2.任务实施
(1)编写shell脚本,计算三角形的面积、圆的面积和周长,输出结果。
[root@redhat01 ~]# vim calculate01.sh [root@redhat01 ~]# cat calculate01.sh #!/bin/bash # 定义三角形的底和高 triangle_base=6 triangle_height=8 # 计算三角形的面积 triangle_area=$(echo "scale=2; $triangle_base * $triangle_height / 2" | bc) # 定义圆的半径 circle_radius=10 # 计算圆的面积 circle_area=$(echo "scale=2; 3.14 * $circle_radius * $circle_radius" | bc) # 计算圆的周长 circle_circumference=$(echo "scale=2; 2 * 3.14 * $circle_radius" | bc) # 输出三角形的面积、圆的面积和周长 echo "三角形面积:$triangle_area" echo "圆的面积:$circle_area" echo "圆的周长:$circle_circumference" # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x calculate01.sh [root@redhat01 ~]# bash calculate01.sh 三角形面积:24.00 圆的面积:314.00 圆的周长:62.80
(2)编写shell脚本,使用bc命令进行算术运算。
[root@redhat01 ~]# vim calculate02.sh [root@redhat01 ~]# cat calculate02.sh #!/bin/bash # 定义变量 a=10 b=20 c=30 # 使用bc命令进行算术运算 result1=$(echo "$a + $b" | bc) result2=$(echo "$a * $b" | bc) result3=$(echo "scale=2; $a / $b" | bc) result4=$(echo "$c % $a" | bc) result5=$(echo "scale=3; $a ^ $b" | bc) result6=$(echo "$a + $b * $c" | bc) result7=$(echo "$a * $b + $c" | bc) result8=$(echo "$c % $a + $b" | bc) # 输出结果 echo "a + b = $result1" echo "a * b = $result2" echo "a / b = $result3" echo "c % a = $result4" echo "a ^ b = $result5" echo "a + b * c = $result6" echo "a * b + c = $result7" echo "c % a + b = $result8" # 执行脚本并查看输出结果 [root@redhat01 ~]# bash calculate02.sh a + b = 30 a * b = 200 a / b = .50 c % a = 0 a ^ b = 100000000000000000000 a + b * c = 610 a * b + c = 230 c % a + b = 20 [root@redhat01 ~]#
(3)编写shell脚本,使用let命令进行算术运算。
[root@redhat01 ~]# vim calculate03.sh [root@redhat01 ~]# cat calculate03.sh #!/bin/bash # 定义变量 a=10 b=20 c=30 # 使用let命令进行算术运算 let result1=a+b let result2=a*b let result3=c%a let result4=a**b let result5=a+b*c let result6=a*b+c let result7=c%a+b # 输出结果 echo "a + b = $result1" echo "a * b = $result2" echo "c % a = $result3" echo "a ^ b = $result4" echo "a + b * c = $result5" echo "a * b + c = $result6" echo "c % a + b = $result7" # 执行脚本并查看结果 [root@redhat01 ~]# chmod +x calculate03.sh [root@redhat01 ~]# bash calculate03.sh a + b = 30 a * b = 200 c % a = 0 a ^ b = 7766279631452241920 a + b * c = 610 a * b + c = 230 c % a + b = 20 [root@redhat01 ~]#
(4)编写shell脚本,使用expr命令进行算术运算。
[root@redhat01 ~]# vim calculate04.sh [root@redhat01 ~]# cat calculate04.sh #!/bin/bash # 定义变量 a=10 b=20 c=30 # 使用expr命令进行算术运算 result1=`expr $a + $b` result2=`expr $a \* $b` result3=`expr $c % $a` result4=`expr $a \* $a \* $a` result5=`expr $a + $b \* $c` result6=`expr $a \* $b + $c` result7=`expr $c % $a + $b` # 输出结果 echo "a + b = $result1" echo "a * b = $result2" echo "c % a = $result3" echo "a ^ 3 = $result4" echo "a + b * c = $result5" echo "a * b + c = $result6" echo "c % a + b = $result7" # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x calculate04.sh [root@redhat01 ~]# bash calculate04.sh a + b = 30 a * b = 200 c % a = 0 a ^ 3 = 1000 a + b * c = 610 a * b + c = 230 c % a + b = 20 [root@redhat01 ~]#
(5)编写shell脚本,使用$((...))表达式进行算术运算。
[root@redhat01 ~]# vim calculate05.sh [root@redhat01 ~]# cat calculate05.sh #!/bin/bash # 定义变量 a=10 b=20 c=30 # 计算结果 result1=$((a + b)) result2=$((a * b)) result3=$((a / b)) result4=$((a % b)) result5=$((a ** b)) result6=$((a + b * c)) result7=$((a * b + c)) result8=$((c % a + b)) # 输出结果 echo "a + b = $result1" echo "a * b = $result2" echo "a / b = $result3" echo "a % b = $result4" echo "a ^ b = $result5" echo "a + b * c = $result6" echo "a * b + c = $result7" echo "c % a + b = $result8" # 执行脚本并查看输出结果 [root@redhat01 ~]# chmod +x calculate05.sh [root@redhat01 ~]# bash calculate05.sh a + b = 30 a * b = 200 a / b = 0 a % b = 10 a ^ b = 7766279631452241920 a + b * c = 610 a * b + c = 230 c % a + b = 20 [root@redhat01 ~]#
任务五 设置环境变量
1.任务描述
在Linux操作系统中,设置java环境变量涉及JAVA_HOME和PATH两个主要的环境变量,将环境变量写入配置文件,可以确保在系统重启或用户重新登录后环境变量依然有效。
2.任务实施
(1)安装OpenJDK 11。
[root@redhat01 ~]# dnf -y install java-11-openjdk java-11-openjdk-devel 正在更新 Subscription Management 软件仓库。 无法读取客户身份 本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。 上次元数据过期检查:0:16:44 前,执行于 2024年09月26日 星期四 21时16分51秒。 依赖关系解决。 =======================================================================================================软件包 架构 版本 仓库 大小 ======================================================================================================= 安装:java-11-openjdk x86_64 1:11.0.20.0.8-3.el9 AppStream 441 kjava-11-openjdk-devel x86_64 1:11.0.20.0.8-3.el9 AppStream 3.3 M 安装依赖关系:copy-jdk-configs noarch 4.0-3.el9 AppStream 29 kjava-11-openjdk-headless x86_64 1:11.0.20.0.8-3.el9 AppStream 40 Mjavapackages-filesystem noarch 6.0.0-4.el9 AppStream 17 klksctp-tools x86_64 1.0.19-2.el9 BaseOS 98 klua x86_64 5.4.4-4.el9 AppStream 192 klua-posix x86_64 35.0-8.el9 AppStream 155 kmkfontscale x86_64 1.2.1-3.el9 AppStream 34 kttmkfdir x86_64 3.0.9-65.el9 AppStream 55 ktzdata-java noarch 2023c-1.el9 AppStream 234 kxorg-x11-fonts-Type1 noarch 7.5-33.el9 AppStream 509 k 事务概要 ======================================================================================================= 安装 12 软件包 总计:45 M 安装大小:187 M 下载软件包: 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务运行脚本: copy-jdk-configs-4.0-3.el9.noarch 1/1 运行脚本: java-11-openjdk-headless-1:11.0.20.0.8-3.el9.x86_64 1/1 准备中 : 1/1 安装 : lksctp-tools-1.0.19-2.el9.x86_64 1/12 安装 : tzdata-java-2023c-1.el9.noarch 2/12 安装 : ttmkfdir-3.0.9-65.el9.x86_64 3/12 安装 : mkfontscale-1.2.1-3.el9.x86_64 4/12 安装 : xorg-x11-fonts-Type1-7.5-33.el9.noarch 5/12 运行脚本: xorg-x11-fonts-Type1-7.5-33.el9.noarch 5/12 安装 : lua-posix-35.0-8.el9.x86_64 6/12 安装 : lua-5.4.4-4.el9.x86_64 7/12 安装 : copy-jdk-configs-4.0-3.el9.noarch 8/12 安装 : javapackages-filesystem-6.0.0-4.el9.noarch 9/12 安装 : java-11-openjdk-headless-1:11.0.20.0.8-3.el9.x86_64 10/12 运行脚本: java-11-openjdk-headless-1:11.0.20.0.8-3.el9.x86_64 10/12 安装 : java-11-openjdk-1:11.0.20.0.8-3.el9.x86_64 11/12 运行脚本: java-11-openjdk-1:11.0.20.0.8-3.el9.x86_64 11/12 安装 : java-11-openjdk-devel-1:11.0.20.0.8-3.el9.x86_64 12/12 运行脚本: java-11-openjdk-devel-1:11.0.20.0.8-3.el9.x86_64 12/12 运行脚本: copy-jdk-configs-4.0-3.el9.noarch 12/12 运行脚本: java-11-openjdk-headless-1:11.0.20.0.8-3.el9.x86_64 12/12 运行脚本: java-11-openjdk-1:11.0.20.0.8-3.el9.x86_64 12/12 运行脚本: java-11-openjdk-devel-1:11.0.20.0.8-3.el9.x86_64 12/12 验证 : copy-jdk-configs-4.0-3.el9.noarch 1/12 验证 : java-11-openjdk-1:11.0.20.0.8-3.el9.x86_64 2/12 验证 : java-11-openjdk-devel-1:11.0.20.0.8-3.el9.x86_64 3/12 验证 : java-11-openjdk-headless-1:11.0.20.0.8-3.el9.x86_64 4/12 验证 : javapackages-filesystem-6.0.0-4.el9.noarch 5/12 验证 : lua-5.4.4-4.el9.x86_64 6/12 验证 : lua-posix-35.0-8.el9.x86_64 7/12 验证 : mkfontscale-1.2.1-3.el9.x86_64 8/12 验证 : ttmkfdir-3.0.9-65.el9.x86_64 9/12 验证 : tzdata-java-2023c-1.el9.noarch 10/12 验证 : xorg-x11-fonts-Type1-7.5-33.el9.noarch 11/12 验证 : lksctp-tools-1.0.19-2.el9.x86_64 12/12 已更新安装的产品。 已安装:copy-jdk-configs-4.0-3.el9.noarch java-11-openjdk-1:11.0.20.0.8-3.el9.x86_64 java-11-openjdk-devel-1:11.0.20.0.8-3.el9.x86_64 java-11-openjdk-headless-1:11.0.20.0.8-3.el9.x86_64javapackages-filesystem-6.0.0-4.el9.noarch lksctp-tools-1.0.19-2.el9.x86_64 lua-5.4.4-4.el9.x86_64 lua-posix-35.0-8.el9.x86_64 mkfontscale-1.2.1-3.el9.x86_64 ttmkfdir-3.0.9-65.el9.x86_64 tzdata-java-2023c-1.el9.noarch xorg-x11-fonts-Type1-7.5-33.el9.noarch 完毕! [root@redhat01 ~]#
(2)创建Java环境变量脚本/etc/profile.d/java.sh。
[root@redhat01 ~]# cat > /etc/profile.d/java.sh <<'EOF' > export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which java))))) > export PATH=$PATH:$JAVA_HOME/bin > EOF
(3)执行source命令,使Java环境变量生效。
[root@redhat01 ~]# source /etc/profile.d/java.sh
相关文章:
Shell脚本基础——实训项目任务
项目一 项目实训 (初始Shell脚本) 项目一 项目实训 (初始Shell脚本)项目实施任务一 输入输出重定向任务二 数据输入输出操作任务三 Shell变量操作任务四 算术运算符操作任务五 设置环境变量 【实训任务】 本实训的主要任务是通过编写简单的shell脚本,完成使用数据…...

Eclipse Memory Analyzer (MAT)提示No java virtual machine was found ...解决办法
1,下载mat后安装,打开时提示 jdk版本低,需要升级到jdk17及以上版本,无奈就下载了jdk17,结果安装后提示没有jre环境,然后手动生成jre目录,命令如下: 进入jdk17目录:执行&…...

【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
文章目录 C list 容器详解:从入门到精通前言第一章:C list 容器简介1.1 C STL 容器概述1.2 list 的特点 第二章:list 的构造方法2.1 常见构造函数2.1.1 示例:不同构造方法2.1.2 相关文档 第三章:list 迭代器的使用3.1 …...

植物大战僵尸杂交版V2.5.1下载(最新版)
2.5.1版本更新公告: 在最新的2.5.1版本中,游戏对“两面夹击”关卡进行了多项重要调整。出怪倍率和种类均有所降低,部分关卡的初始阳光量也得到了调整,以增强玩家的策略性。同时,玩家可以在这些关卡中使用投手类植物&a…...

基于nodejs+vue的游戏陪玩系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...

SVN文件不显示修改状态图标
今天安装试用SVN时发现文件不显示修改状态 以下为解决方法: 1,在有.svn的文件夹中右键--tortoiseSvn--setting 2,选中icon Overlays,右侧的status cache 选shell 3,点击icon set 如下图所示 4,修改icon…...

GB28181语音对讲协议详解
GB28181-2016语音对讲流程如下图1所示: 图1.语音对讲流程。 其中, 信令 1 、2 、 3 、 4 为语音广播通知、 语音广播应答消息流程; 信令 5 、 1 2 、 1 3 、 1 4 、 1 5 、 1 6 为 S I P 服务器接收到客户端的呼叫请求通过 B 2 B UA 代理方式建立语音流接收者与媒…...
JavaScript 数据可视化:前端开发的核心工具
随着互联网和大数据的快速发展,数据呈爆炸式增长,如何有效地展示和理解数据成为了一项关键技能。JavaScript 作为前端开发的主要语言,不仅在构建网页方面无可替代,也在数据可视化领域发挥了重要作用。从简单的图表到复杂的交互式展…...

[Redis][哨兵][上]详细讲解
目录 0.前言1.基本概念1.相关名词解释2.主从复制的问题3.人工恢复主节点故障4.哨兵自动恢复主节点故障 0.前言 说明:该章节相关操作不需要记忆,理解流程和原理即可,用的时候能自主查到即可Redis的主从复制模式下,⼀旦主节点由于故…...

如何展开浏览器开发者模式的Fetch/XHR
说明:大多数程序员都用浏览器的F12,开发者模式查看接口,我也不例外。我常用下面这个选项,它会过滤掉掉其他文档、样式请求,只展示访问服务器的接口请求 有次,不知道点了什么,这个菜单消失找不…...
Pydantic 是一个强大的 Python 库
Pydantic 是一个强大的 Python 库,专门用于数据验证和设置管理。以下是对 Pydantic 的详细介绍: 一、主要功能和特点 数据验证: Pydantic 通过 Python 类型注解来定义数据模型,并自动验证输入数据是否符合预定义的类型和结构。提…...

每日OJ题_牛客_NC40链表相加(二)_链表+高精度加法_C++_Java
目录 牛客_NC40链表相加(二)_链表高精度加法 题目解析 C代码 Java代码 牛客_NC40链表相加(二)_链表高精度加法 链表相加(二)_牛客题霸_牛客网 题目解析 模拟⾼精度加法的过程,只不过是在链表中模拟。 C代码 /*…...

Dubbo快速入门(一):分布式与微服务、Dubbo基本概念
文章目录 一、分布式与微服务概念1.大型互联网架构目标2.集群和分布式(1)集群 (Cluster)(2)分布式计算 (Distributed Computing)(3)集群与分布式的关系(4)实践中的应用案例 3.架构演…...

jmeter性能测试---csv数据文件设置
(1)什么时候使用CSV数据文件设置? 当不同的用户,或者同一用户多次循环时,都可以获取到不同的值 (2)使用CSV数据文件设置进行参数化的步骤? 实例: 请求:htt…...
交换基础【计算机网络】
交换基础 1、交换机的工作原理有哪4项操作,地址表如何建立的? 4项基本操作 丢弃 当本端口下的主机访问已知本端口下的主机时丢弃 转发 当某端口下的主机访问已知某端口下的主机时转发 扩散 当某端口下的主机访问未知端口下的主机时要扩散 广播 当某…...
Android12的netd分析
1.文件位置 system/netd/server/目录下的main.cpp和Android.bp 可知编译会生成netd的可执行程序。 2.main函数的流程 int main() {Stopwatch s; 。。。。。。。 // 启动NetlinkManager服务NetlinkManager *nm NetlinkManager::Instance();if (nm nullptr) {ALOGE("Una…...
OpenCV图像文件读写(6)将图像数据写入文件的函数imwrite()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像保存到指定的文件中。 函数 imwrite 将图像保存到指定的文件中。图像格式是根据文件名扩展名选择的(参见 cv::imread 获取扩展…...

JVM(HotSpot):方法区(Method Area)
文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后,方法区是JVM内存的一个逻辑结构,真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。 …...
JWT的基础与使用
JWT(JSON Web Token) 是一种用于在各方之间传输信息的紧凑、安全的方式,常用于身份验证和授权。它以令牌的形式将用户信息编码后传输,可以确保数据的完整性和安全性。 1.JWT的结构 JWT 是一个基于 JSON 的令牌,由三部…...

处理 VA02修改行项目计划行(SCHEDULE LINES )报错:不可能确定一个消耗帐户
用户修改销售订单行项目 计划行(SCHEDULE LINES) ,从 “CN”改为“CB”时候发生报错提示:不可能确定一个消耗帐户。 Not possible to determine a consumption account Message No. 06138 Diagnosis The system was not able to determine a consumpti…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...