项目一 项目实训
项目实施
任务一 输入输出重定向
1、任务描述
编写简单的SHELL脚本,使用输入重定向及管道符将脚本的信息重定向到文件
2、任务实施
(1)创建shell脚本firstscript.sh,使用vim文本编辑器在用户家目录下创建一个新的文本文件,将其命 名为firstscript.sh,插入以下文本并保存文件,
[root@cwf ~]# vim input.txt
[root@cwf ~]# cat input.txt
aaaaaa
bbbbbb
[root@cwf ~]# vim firstscript.sh
[root@cwf ~]# cat firstscript.sh
#!/bin/bash
sort < input.txt
(2)使用bash命令执行脚本。
[root@cwf ~]# chmod +x firstscript.sh \\提升权限
[root@cwf ~]# bash firstscript.sh \\ 执行脚本
aaaaaa
bbbbbb
[root@cwf ~]# cat input.txt \\ 查看脚本
aaaaaa
bbbbbb
(3)将输出写入文件中
[root@cwf ~]# ls -l > output.txt
(4)追加输出到文件中
[root@cwf ~]# ls -l >> output.txt5
(5)将标准错误输出重定向到文件中
[root@cwf ~]# ls -l /non-existent-dir 2>error.log
(6)使用输入重定向忽略read命令的输入
[root@cwf ~]# vim file.sh
[root@cwf ~]# ./file.sh
you name is
[root@cwf ~]# cat file.sh
#!/bin/bash
read -p "enter yuor name:" name < /dev/null
echo "you name is $name"
(7)从标准输入中读取多行文本
[root@cwf ~]# vim file.sh
[root@cwf ~]# cat file.sh
#!/bin/bash
read -p "enter yuor name:" name < /dev/null
echo "you name is $name"
echo “enter some text (Ctrl+D to finshi):"
cat << EOF
hhhhh
uuuuu
iiiii
EOF
(8)将多行文本输入到文件
[root@cwf ~]# vim file.sh
[root@cwf ~]# cat file.sh
#!/bin/bash
cat << EOF > output.txt
new hhhhhhh
new uuuuuuu
new iiiiiii
EOF
(9)将多行文本追加到文件
[root@cwf ~]# vim file.sh
[root@cwf ~]# cat file.sh
#!/bin/bas
cat << EOF >> output.txt
new hhhhhhh
new uuuuuuu
new iiiiiii
EOF
任务二 数据输入输出操作
1、任务描述
编写shell 脚本,通过数据输入输出与用户交互,使用户输入数据或输出信息;通过数据输入输出读取文件中的数据到文件中;通过数据输入输出可以与其他程序或系统交互,以获取或输出数据。 使用read命令读取用户输入的数据,使用echo或printf命令输出信息。
2、任务实施
(1)使用read 命令读取用户输入数据
[root@cwf ~]# vim printf01.sh
[root@cwf ~]# cat printf01.sh
#!/bin/bash
read -p "Enter a number: " num \\读入用户输入数字
echo "you entered: $num" \\输出用户输入数字
[root@cwf ~]# chmod +x printf01.sh \\提升权限
[root@cwf ~]# bash printf01.sh
Enter a number: 45
you entered: 45
[root@cwf ~]#
(2)使用read命令读取多个数据
[root@cwf ~]# vim printf02.sh
[root@cwf ~]# 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@cwf ~]# chmod +x printf02.sh
[root@cwf ~]# bash printf02.sh
Enter your name ,age and gender: hh 3 male
Name: hh
Age: 3
Gender: male
(3)使用read命令读取文件中的每一行内容
[root@cwf ~]# vim file.txt
[root@cwf ~]# cat file.txt
wwww.hhhh.o
ggggg.ttt.f
[root@cwf ~]# vim printf03.sh
[root@cwf ~]# cat printf03.sh
#!/bin/bash
while read line; do
echo $line
done < file.txt
[root@cwf ~]# chmod +x printf03.sh
[root@cwf ~]# bash printf03.sh
wwww.hhhh.o
ggggg.ttt.f
(4)使用printf命令格式化输出数字
[root@cwf ~]# vim printf04.sh
[root@cwf ~]# cat printf04.sh
#!/bin/bash
printf "%.2f\n" 3.76421
printf "%.4f\n" 3.12345
printf "%d\n" 123456
printf "%x\n" 244
[root@cwf ~]# chmod +x printf04.sh \\提升权限
[root@cwf ~]# bash printf04.sh \\执行命令
3.76
3.1235
123456
(5)使用printf命令格式化输出字符串
[root@cwf ~]# vim printf05.sh
[root@cwf ~]# cat printf05.sh
#!/bin/bash
printf "%-10s %-8s %-4s\n" Name Gender Age
printf "%-10s %-8s %-4d\n" hh male 88
printf "%-10s %-8s %-4d\n" yy femal 90
[root@cwf ~]# chmod +x printf05.sh
[root@cwf ~]# bash printf05.sh
Name Gender Age
hh male 88
yy femal 90
(6)使用printf命令输出多个字符和字符串
[root@cwf ~]# vim printf06.sh
[root@cwf ~]# cat printf06.sh
#!/bin/bash
printf "%s %s %s\n" A B C
printf "%s %s %s\n" G H G Y U I
# 定义字符变量
char='a'
# 使用%c 格式化输出字符
printf "The character is %c.\n" "$char"
# 定义字符串
string="hello.world"
# 使用%s 格式化输出字符串
printf "The string is %s.\n" "$string"
# 使用%-10 格式化输出左对齐的字符串
printf "%-10s\n" "$string"
[root@cwf ~]# chmod +x printf06.sh
[root@cwf ~]# bash printf06.sh
A B C
G H G
Y U I
The character is a.
The string is hello.world.
hello.world
[root@cwf ~]#
(7)使用printf命令输出变量值
[root@cwf ~]# vim printf07.sh
[root@cwf ~]# cat printf07.sh
#!/bin/bash
name="hh"
age="90"
printf "his name is %s ,he is %d years old .\n" "$name" "$age"
[root@cwf ~]# chmod +x printf07.sh
[root@cwf ~]# bash printf07.sh
his name is hh ,he is 90 years old .
任务三 Shell变量操作
1、任务描述
在shell中,变量主要用于保存和引用各种类型的数据,可以用于存储各种信息,如字符串、数字等。变量在shell中非常常用, 可以用于存储用户输入的数据、存储程序运行过程中产生的数据、存储程序执行结果,还可以用于条件判断和循环控制、存储文件名和路径、文件处理、存储环境变量、程序的配置运行
2、任务实施
(1)编写shell 脚本。使用变量获取主机的内存信息、网络互联网协(Internet Protocol ,IP)地 址、CPU负载等信息
[root@cwf ~]# vim systeminfo-output.sh
[root@cwf ~]# 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@cwf ~]# chmod +x systeminfo-output.sh
[root@cwf ~]# bash systeminfo-output.sh
Memory: Total: 1923MB, Used: 1343MB, Free: 98MB
IP: 192.168.237.129
172.17.0.1
CPU: 2.9%
(2)编写shell脚本,输出$0、$1、$2、 3 、 3、 3、@、KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲、!、 ? 、 ?、 ?、*、$$等位置参数的变量信息
[root@cwf ~]# vim location-output.sh
[root@cwf ~]# 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@cwf ~]# chmod +x location-output.sh
[root@cwf ~]# bash location-output.sh
please enter your name:
hh
$0 is: location-output.sh
$1 is:
$2 is:
$3 is:
$@ is:
$# is: 0
$! is:
$? is: 0
$* is:
$$ is: 3120
Name is: hh
(3)输出当前目的的日历信息,并使用printf命令格式化输出
[root@cwf ~]# vim date-output.sh
[root@cwf ~]# cat date-output.sh
#!/bin/bash
month=$(date +%m)
year=$(date +%y)
calendar=$(cal $month $year) \\ 条件
printf "calender for %s %s: \n\n"$month $year
printf "%s\n" "$calendar" \\执行命令
[root@cwf ~]# chmod +x date-output.sh
[root@cwf ~]# bash date-output.sh \\ 执行结果
calender for 24 :
10 十月 0024
一 二 三 四 五 六 日
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
[root@cwf ~]#
(4)编写shell脚本,使用变量并结合printf命令格式化输出当前系统的磁盘分区、swap分区、逻辑卷 等信息
[root@cwf ~]# vim disk-output.sh
[root@cwf ~]# cat disk-output.sh
#!/bin/bash
disk_partitions=$(dnf -h) \\使用df 命令获取磁盘信息
swap_partitions=$(swapon -s) \\使用swapon 命令获取区分信息
logical_volumes=$(lvdisplay) \\使用lvdisplay命令获取逻辑卷信息
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@cwf ~]# chmod +x disk-output.sh
Swap Partitions:
Filename Type Size Used Priority
/dev/dm-1 partition 209714826112 -2
Logical Volumes:
--- Logical volume ---
LV Path /dev/rhel/swap
LV Name swap
VG Name rhel
LV UUID ScRcTb-QOCA-Ehq3-rY73-r914-3eC1-ISdF2q
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2024-09-18 18:06:44 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Path /dev/rhel/root
LV Name root
VG Name rhel
LV UUID 3qlZE7-t22T-qeWd-uy1A-HPWR-38Zd-grN37o
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2024-09-18 18:06:44 +0800
LV Status available
# open 1
LV Size 16.41 GiB
Current LE 4201
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
任务四 算数运算符操作
1、任务描述
在shell 中,算数运算主要应用于执行各种数学计算。常见的算数运算包括加法、减法、余数、幂运算。
2、任务实施
(1)编写shell 脚本,计算三角形面积、圆的面积和周长,输出结果。
[root@cwf ~]# vim calculate1.sh
[root@cwf ~]# cat calculate1.sh
#!/bin/bash
# 定义三角形的底和高
base=6
height=8
# 计算三角型面积
triangle_area=$(echo "scale=2; $base * $height /2"| bc)
# 定义圆的半径
redius=6
# 计算圆的面积
circle_area=$(echo "scale=2; 3.14 * $redius * $redius" | bc)
# 计算圆的周长
circle_circumference=$(echo "scale=2; 2 * 3.14 * $redius" | bc)
# 输出三角形的面积、圆的面积、圆的周长
echo "三角形的面积: $triangle_area"
echo "圆的面积: $circle_area"
echo "圆的周长:$circle_circumference"
[root@cwf ~]# bash calculate1.sh三角形的面积: 24.00
圆的面积: 113.04
圆的周长:37.68
(2)编写shell 脚本,使用bc 命令进行算术运算
[root@cwf ~]# vim calculate2.sh
[root@cwf ~]# cat calculate2.sh
#!/bin/bash
a=5
b=4
c=7
result1=$(echo "$a + $b" | bc)
result2=$(echo "$c - $a" | bc)
result3=$(echo "$b * $a" | bc)
result4=$(echo "$c % $a" | bc)
result5=$(echo "scale=3; $a ^ $c" | bc)
result6=$(echo "scale=2; $c / $a" | bc)
result7=$(echo "$a * $b + $c" | bc)
result8=$(echo "$c % $a + $b" | bc) \\使用bc命令进行运算
echo "a + b = $result1"
echo "c - a = $result2"
echo "b * a = $result3"
echo "c % a = $result4"
echo "c / a = $result6"
echo "a * b + c = $result7"
echo "c % a + b = $result8" \\输出结果
[root@cwf ~]# chmod +x calculate2.sh
[root@cwf ~]# bash calculate2.sh
a + b = 9
c - a = 2
b * a = 20
c % a = 2
c / a = 1.40
a * b + c = 27
c % a + b = 6
(3)编写shell脚本,使用let命令进行算术运算。
[root@cwf ~]# vim calculate03.sh
[root@cwf ~]# cat calculate03.sh
#!/bin/bash
a=10
b=20
c=30
let result1=a+b
let result2=a*b
let result3=c%a
let result4=a**b
let result5=a+b*c
let result6=c%a+b \\使用let命令进行运算
echo "a + b = $result1"
echo "a * b = $result2"
echo "c % a = $result3"
echo "a ** b = $result4"
echo "a + b * c = $result5"
echo "c % a + b = $result6" \\ 输出结果
[root@cwf ~]# bash calculate03.sh
a + b = 30
a * b = 200
c % a = 0
a ** b = 7766279631452241920
a + b * c = 610
c % a + b = 20
(4)编写shell脚本,使用expr命令进行算术运算。
[root@cwf ~]# vim calculate04.sh
[root@cwf ~]# cat calculate04.sha=10
b=20
c=30
result1=`expr $a + $b`
result2=`expr $a \* $b`
result3=`expr $c % $a`
result4=`expr $a \* $a \* $a`
result5=`expr $a + $b \* $c` \\使用expr命计算
echo "a + b = $result1"
echo "a * b = $result2"
echo "c % a = $result3"
echo "a ^ 3 = $result4"
echo "a + b * c = $result5" \\输出结果
[root@cwf ~]# bash calculate04.sh
a + b = 30
a * b = 200
c % a = 0
a ^ 3 = 1000
a + b * c = 610
(5)编写shell脚本,使用$((…))表达式进行算术运算
[root@cwf ~]# vim calulate5.sh
[root@cwf ~]# cat calulate5.sh
#!/bin/bash
a=10
b=30
c=20
result1=$((a + b))
result2=$((a * b))
result3=$((b / c))
result4=$((a % b))
result5=$((a + b % c))
result6=$((a - b + c))
result7=$((a * b % c)) \\计算结果
echo "a + b = $result1"
echo "a * b = $result2"
echo "a / b = $result3"
echo "a % b = $result4"
echo "a + b % c = $result5"
echo "a - b + c = $result6"
echo "a * b % c = $result7" \\输出结果
[root@cwf ~]# chmod +x calulate5.sh
[root@cwf ~]# bash calulate5.sh
a + b = 40
a * b = 300
a / b = 1
a % b = 10
a + b % c = 20
a - b + c = 0
a * b % c = 0
任务五 设置环境变量
1、任务描述
在Linux操作系统中,设置java环境变量涉及JAVA_HOME和PATH两个主要的环境变量,将环境变量写入配置文件,可以确保在系统重启或用户重新登录后环境变量依然有效。
2、任务实施
(1)安装Open JDK11
1、创建yum仓库
[root@cwf ~]# dnf clean all
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
20 个文件已删除
[root@cwf ~]# dnf makecache
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
--- B/s | 0 B --:-- ET --- B/s | 0 B --:-- ET --- B/s | 0 B --:-- ET --- B/s | 0 B --:-- ET 49 kB/s | 58 kB 00:01
--- B/s | 0 B --:-- ET 69 MB/s | 6.5 MB 00:00
--- B/s | 0 B --:-- ET 54 MB/s | 2.0 MB 00:00
元数据缓存已建立。
2、安装
[root@cwf ~]# dnf -y install java-11-openjdk java-11-openjdk-devel
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:01:01 前,执行于 2024年10月12日 星期六 22时56分57秒。
依赖关系解决。
================================
软件包
架构 版本
仓库 大小
================================
安装:
java-11-openjdk
x86_64 1:11.0.20.0.8-3.el9
AppStream 441 k
java-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 k
java-11-openjdk-headless
x86_64 1:11.0.20.0.8-3.el9
AppStream 40 M
javapackages-filesystem
noarch 6.0.0-4.el9
AppStream 17 k
lksctp-tools
x86_64 1.0.19-2.el9
BaseOS 98 k
lua x86_64 5.4.4-4.el9
AppStream 192 k
lua-posix
x86_64 35.0-8.el9
AppStream 155 k
mkfontscale
x86_64 1.2.1-3.el9
AppStream 34 k
ttmkfdir
x86_64 3.0.9-65.el9
AppStream 55 k
tzdata-java
noarch 2023c-1.el9
AppStream 234 k
xorg-x11-fonts-Type1
noarch 7.5-33.el9
AppStream 509 k
事务概要
================================
安装 12 软件包
总计:45 M
安装大小:187 M
下载软件包:
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
运行脚本: copy-jdk-conf 1/1
运行脚本: java-11-openj 1/1
准备中 : 1/1
安装 : lksctp-tool 1/12
安装 : tzdata-java 2/12
安装 : ttmkfdir-3. 3/12
安装 : mkfontscale 4/12
安装 : xorg-x11-fo 5/12
运行脚本: xorg-x11-fo 5/12
安装 : lua-posix-3 6/12
安装 : lua-5.4.4-4 7/12
安装 : copy-jdk-co 8/12
安装 : javapackage 9/12
安装 : java-11-ope 10/12
运行脚本: java-11-ope 10/12
安装 : java-11-ope 11/12
运行脚本: java-11-ope 11/12
安装 : java-11-ope 12/12
运行脚本: java-11-ope 12/12
运行脚本: copy-jdk-co 12/12
运行脚本: java-11-ope 12/12
验证 : copy-jdk-co 1/12
验证 : java-11-ope 2/12
验证 : java-11-ope 3/12
验证 : java-11-ope 4/12
验证 : javapackage 5/12
验证 : lua-5.4.4-4 6/12
验证 : lua-posix-3 7/12
验证 : mkfontscale 8/12
验证 : ttmkfdir-3. 9/12
验证 : tzdata-java 10/12
验证 : xorg-x11-fo 11/12
验证 : lksctp-tool 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_64
javapackages-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
完毕!
(2)创建Java环境变量脚本/etc/profile.d/java.sh
[root@cwf ~]# vim /etc/profile.d/java.sh
[root@cwf ~]# cat /etc/profile.d/java.sh
#!/bin/bash
<<'EOF'
> export JAVA_HOME=$(dirname $(dirname $(readlink $(redlink $(which java)))))
> export PATH=$PATH:$JAVA_HOME/bin
EOF
(3)执行source命令,使Java环境变量生效
[root@cwf ~]# source /etc/profile.d/java.sh