shell-脚本基础

项目一 项目实训

项目实施

任务一 输入输出重定向

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值