返回

**玩转Shell编程中的双重循环:5个实验带你轻松入门**

后端







**实验1:将点分十进制IP地址转换成点分二进制格式** 

* 实验要求:将一个点分十进制格式的IP地址转换成点分二进制格式。
* 创建脚本:

```shell
#!/bin/bash

# 获取IP地址
read -p "请输入IP地址:" ip_address

# 将IP地址拆分为四部分
ip_parts=(`echo $ip_address | tr "." " "`)

# 将每一部分转换成二进制格式
for ip_part in "${ip_parts[@]}"; do
  # 使用printf将十进制数字转换为二进制格式,并用0补齐到8位
  ip_part_binary=$(printf "%08b" $ip_part)
  # 将二进制格式的IP地址部分添加到结果中
  result+="$ip_part_binary"
done

# 在结果中添加点分隔符
result_with_dots=${result:0:8}.${result:8:8}.${result:16:8}.${result:24:8}

# 输出转换后的IP地址
echo "点分二进制格式的IP地址:$result_with_dots"
  • 执行脚本:
$ ./ip_address_conversion.sh
请输入IP地址:192.168.1.1
点分二进制格式的IP地址:11000000.10101000.00000001.00000001

实验2:编写一个逛网上商城选购商品脚本

  • 实验要求:写一个逛网上商城选购商品脚本,每家商店有五种商品选购(衣服500元,裤子400元,鞋子300元,帽子200元,围巾100元)。
  • 创建脚本:
#!/bin/bash

# 定义商品列表及其价格
declare -A products=(
  ["衣服"]=500
  ["裤子"]=400
  ["鞋子"]=300
  ["帽子"]=200
  ["围巾"]=100
)

# 定义商店列表
declare -a stores=(
  "商店1"
  "商店2"
  "商店3"
)

# 循环遍历商店
for store in "${stores[@]}"; do

  # 打印商店名称
  echo "欢迎来到$store!"

  # 打印商品列表
  echo "商品列表:"
  for product in "${!products[@]}"; do
    echo "$product${products[$product]}元"
  done

  # 获取用户选择的商品
  read -p "请选择要购买的商品:" product

  # 检查商品是否有效
  if [[ ! ${products[$product]} ]]; then
    echo "您输入的商品不存在,请重新选择。"
    continue
  fi

  # 获取购买数量
  read -p "请输入要购买的数量:" quantity

  # 检查购买数量是否有效
  if [[ $quantity -le 0 ]]; then
    echo "您输入的购买数量无效,请重新输入。"
    continue
  fi

  # 计算总价
  total_price=$(( ${products[$product]} * $quantity ))

  # 打印购买信息
  echo "您购买了$quantity$product,总价为$total_price元。"

done

# 感谢用户购物
echo "感谢您的购物!"
  • 执行脚本:
$ ./shopping_script.sh
欢迎来到商店1!
商品列表:
衣服:500元
裤子:400元
鞋子:300元
帽子:200元
围巾:100元
请选择要购买的商品:衣服
请输入要购买的数量:2
您购买了2件衣服,总价为1000元。
欢迎来到商店2!
商品列表:
衣服:500元
裤子:400元
鞋子:300元
帽子:200元
围巾:100元
请选择要购买的商品:鞋子
请输入要购买的数量:3
您购买了3件鞋子,总价为900元。
欢迎来到商店3!
商品列表:
衣服:500元
裤子:400元
鞋子:300元
帽子:200元
围巾:100元
请选择要购买的商品:帽子
请输入要购买的数量:4
您购买了4件帽子,总价为800元。
感谢您的购物!

实验3:编写一个计算组合数的脚本

  • 实验要求:编写一个计算组合数的脚本。
  • 创建脚本:
#!/bin/bash

# 获取n和r
read -p "请输入n的值:" n
read -p "请输入r的值:" r

# 计算组合数
combination=$(( $(factorial $n) / $(( $(factorial $r) * $(factorial $(($n - $r)) ) )) ))

# 输出组合数
echo "组合数:$combination"

# 计算阶乘函数
factorial() {
  local num=$1
  if [[ $num -eq 0 ]]; then
    return 1
  else
    return $(($num * $(factorial $(($num - 1)))))
  fi
}
  • 执行脚本:
$ ./combination_script.sh
请输入n的值:5
请输入r的值:3
组合数:10

实验4:编写一个文本文件排序脚本

  • 实验要求:编写一个文本文件排序脚本。
  • 创建脚本:
#!/bin/bash

# 获取文本文件路径
read -p "请输入要排序的文本文件路径:" file_path

# 检查文件是否存在
if [[ ! -f $file_path ]]; then
  echo "您输入的文件不存在,请重新输入。"
  exit 1
fi

# 读取文本文件内容
file_content=$(cat $file_path)

# 对文本文件内容进行排序
sorted_content=$(echo "$file_content" | sort)

# 将排序后的内容写入临时文件
tmp_file_path="/tmp/sorted_content.txt"
echo "$sorted_content" > $tmp_file_path

# 将临时文件的内容覆盖原文本文件
mv $tmp_file_path $file_path

# 输出排序后的文本文件
echo "排序后的文本文件内容:"
cat $file_path
  • 执行脚本:
$ ./sort_text_file_script.sh
请输入要排序的文本文件路径:text.txt
排序后的文本文件内容:
apple
banana
cherry
grape
orange

实验5:编写一个备份文件脚本

  • 实验要求:编写一个备份文件脚本。
  • 创建脚本:
#!/bin/bash

# 获取要备份的文件路径
read -p "请输入要备份的文件路径:" file_path

# 检查文件是否存在
if [[ ! -f $file_path ]]; then
  echo "您输入的文件不存在,请重新输入。"
  exit 1
fi

# 获取备份文件路径
read -p "请输入备份文件路径:" backup_file_path

# 检查备份文件路径是否有效
if [[ ! -d $(dirname $backup_file_path) ]]; then
  echo "您输入的备份文件路径无效,请重新输入。"
  exit 1
fi

# 备份文件
cp $file_path $backup_file_path

# 输出备份成功信息
echo "文件备份成功!"
  • 执行脚本:
$ ./backup_file_script.sh
请输入要备份的文件路径:file.txt
请输入备份文件路径:backup/file.txt
文件备份成功!