shell(三)

声明!

学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](https://space.bilibili.com/350329294)

参数传递&数学运算

参数传递

在Shell脚本中,参数传递是通过命令行参数来实现的

  1. $0:当前脚本的文件名。

  2. 2, :传递给脚本的参数。1表示第一个参数,$2表示第二个参数,依此类推。

  3. $#:传递给脚本的参数个数。

  4. $@:传递给脚本的所有参数,以空格分隔。

  5. :传递给脚本的所有参数,以单空格分隔。如果参数中包含空格,*会将整个参数当作一个字符串。

    echo 执行文件名是: 0 echo 第一个参数是: 1
    echo 传递的参数作为一个字符串显示: * echo 传递的参数独立作为每一个字符串显示: @
    echo 传递到脚本的参数个数是: # echo 最后命令的退出状态: ?
    echo 脚本运行的当前进程ID是: $$

将上述脚本保存为myscript.sh,并赋予执行权限:

复制代码
chmod +x myscript.sh

运行脚本并传递参数:

复制代码
./myscript.sh arg1 arg2 "arg 3"

输出结果:

复制代码
Script name: ./myscript.sh
First argument: arg1
Second argument: arg2
All arguments: arg1 arg2 arg 3
Number of arguments: 3

传递多个参数

复制代码
#!/bin/bash

# 输出参数信息
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Third argument: $3"
echo "All arguments: $@"
echo "Number of arguments: $#"

将上述脚本保存为myscript.sh,并赋予执行权限:

复制代码
chmod +x myscript.sh

运行脚本并传递多个参数:

复制代码
./myscript.sh arg1 arg2 arg3

输出结果:

复制代码
Script name: ./myscript.sh
First argument: arg1
Second argument: arg2
Third argument: arg3
All arguments: arg1 arg2 arg3
Number of arguments: 3

如果传递一个包含空格的参数,需要用双引号将其括起来

复制代码
./myscript.sh arg1 "arg 2 with spaces" arg3

这将确保参数被正确识别,输出结果:

复制代码
Script name: ./myscript.sh
First argument: arg1
Second argument: arg 2 with spaces
Third argument: arg3
All arguments: arg1 arg 2 with spaces arg3
Number of arguments: 3

数组处理参数

在Shell脚本中,可以使用数组来处理多个参数

复制代码
#!/bin/bash

# 创建一个数组来存储参数
params=("$@")

# 获取参数个数
num_params=${#params[@]}

# 输出参数信息
echo "Script name: $0"
echo "Number of arguments: $num_params"
echo "All arguments:"

# 遍历数组并输出每个参数
for (( i=0; i<$num_params; i++ )); do
  echo "Argument $(($i+1)): ${params[$i]}"
done

将上述脚本保存为myscript.sh,并赋予执行权限:

复制代码
chmod +x myscript.sh

运行脚本并传递多个参数:

复制代码
./myscript.sh arg1 arg2 "arg 3 with spaces"

参数组合

在Shell脚本中实现参数组合,通常意味着根据不同的参数组合执行不同的操作。这可以通过检查传递给脚本的参数并使用条件语句来实现。

复制代码
#!/bin/bash

# 检查参数个数
if [ "$#" -lt 1 ]; then
    echo "Usage: $0 [option1] [option2] [option3]"
    exit 1
fi

# 根据参数执行不同操作
while getopts ":a:b:c" opt; do
  case $opt in
    a)
      echo "Option A selected"
      # 在此处执行选项A的操作
      ;;
    b)
      echo "Option B selected"
      # 在此处执行选项B的操作
      ;;
    c)
      echo "Option C selected"
      # 在此处执行选项C的操作
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

# 如果没有提供任何参数,显示帮助信息
if [ "$OPTIND" -eq 1 ]; then
    echo "No options provided. Use -a, -b, or -c."
fi

循环使用参数

在Shell脚本中,可以使用for循环来遍历并处理传递给脚本的参数

复制代码
#!/bin/bash

# 获取参数个数
num_params=$#

# 输出参数信息
echo "Script name: $0"
echo "Number of arguments: $num_params"

# 使用for循环遍历并处理每个参数
for (( i=1; i<=$num_params; i++ )); do
  echo "Processing argument $i: ${!i}"
done

$#获取传递给脚本的参数个数。for循环遍历参数。${!i}访问当前循环索引对应的参数。

参数组合的嵌套

在Shell脚本中实现参数组合的嵌套,意味着根据多个参数的组合执行不同的操作,并且这些参数可以嵌套使用。

复制代码
#!/bin/bash

# 定义一个函数来处理参数组合
process_args() {
    local option_a=false
    local option_b=false
    local option_c=false

    while getopts ":a:b:c" opt; do
        case $opt in
            a)
                option_a=true
                ;;
            b)
                option_b=true
                ;;
            c)
                option_c=true
                ;;
            \?)
                echo "Invalid option: -$OPTARG" >&2
                exit 1
                ;;
            :)
                echo "Option -$OPTARG requires an argument." >&2
                exit 1
                ;;
        esac
    done

    # 根据参数组合执行不同操作
    if $option_a; then
        echo "Option A selected"
        # 在此处执行选项A的操作
    fi

    if $option_b; then
        echo "Option B selected"
        # 在此处执行选项B的操作
    fi

    if $option_c; then
        echo "Option C selected"
        # 在此处执行选项C的操作
    fi

    # 嵌套参数组合
    if $option_a && $option_b; then
        echo "Option A and B selected"
        # 在此处执行选项A和B的组合操作
    fi

    if $option_a && $option_c; then
        echo "Option A and C selected"
        # 在此处执行选项A和C的组合操作
    fi

    if $option_b && $option_c; then
        echo "Option B and C selected"
        # 在此处执行选项B和C的组合操作
    fi

    if $option_a && $option_b && $option_c; then
        echo "Option A, B, and C selected"
        # 在此处执行选项A、B和C的组合操作
    fi
}

# 调用函数处理参数
process_args "$@"

参数传递的映射

在Shell脚本中,可以使用关联数组(associative arrays)来实现参数传递的映射

复制代码
#!/bin/bash

# 声明一个关联数组
declare -A param_map

# 定义映射关系
param_map=(
  ["arg1"]="value1"
  ["arg2"]="value2"
  ["arg3"]="value3"
)

# 获取参数个数
num_params=$#

# 使用for循环遍历并处理每个参数
for (( i=1; i<=$num_params; i++ )); do
  arg_name=${!i}
  echo "Processing argument $arg_name: ${param_map[$arg_name]}"
done

数学运算

方法1:使用expr命令

expr是一个用于数学运算的外部命令。

复制代码
#!/bin/bash

a=10
b=20

# 加法
sum=$(expr $a + $b)
echo "Sum: $sum"

# 减法
difference=$(expr $a - $b)
echo "Difference: $difference"

# 乘法
product=$(expr $a \* $b)
echo "Product: $product"

# 除法(注意:结果为整数)
quotient=$(expr $b / $a)
echo "Quotient: $quotient"

# 取余
remainder=$(expr $b % $a)
echo "Remainder: $remainder"

方法2:使用$((...))$(())

这种方法允许在Shell脚本中直接进行数学运算,无需调用外部命令。

复制代码
#!/bin/bash

a=10
b=20

# 加法
sum=$((a + b))
echo "Sum: $sum"

# 减法
difference=$((a - b))
echo "Difference: $difference"

# 乘法
product=$((a * b))
echo "Product: $product"

# 除法(注意:结果为整数)
quotient=$((b / a))
echo "Quotient: $quotient"

# 取余
remainder=$((b % a))
echo "Remainder: $remainder"

方法3:使用bc命令

bc是一个用于任意精度数学运算的外部命令。它可以处理浮点数运算。

复制代码
#!/bin/bash

a=10.5
b=20.7

# 加法
sum=$(echo "$a + $b" | bc)
echo "Sum: $sum"

# 减法
difference=$(echo "$a - $b" | bc)
echo "Difference: $difference"

# 乘法
product=$(echo "$a * $b" | bc)
echo "Product: $product"

# 除法
quotient=$(echo "scale=2; $b / $a" | bc)
echo "Quotient: $quotient"

在使用bc命令时,可以通过scale变量设置结果的小数位数。

条件判断

在Shell脚本中,可以使用if语句进行条件判断

示例1:基本条件判断

复制代码
#!/bin/bash

num=10

if [ $num -gt 5 ]; then
    echo "Number is greater than 5"
elif [ $num -lt 5 ]; then
    echo "Number is less than 5"
else
    echo "Number is equal to 5"
fi

示例2:判断文件是否存在

复制代码
#!/bin/bash

file="example.txt"

if [ -e "$file" ]; then
    echo "File exists"
else
    echo "File does not exist"
fi

示例3:判断字符串是否为空

复制代码
#!/bin/bash

str="Hello, World!"

if [ -z "$str" ]; then
    echo "String is empty"
else
    echo "String is not empty"
fi

示例4:使用逻辑运算符组合条件

复制代码
#!/bin/bash

num=10
flag=true

if [ $num -gt 5 ] && [ "$flag" = true ]; then
    echo "Number is greater than 5 and flag is true"
elif [ $num -lt 5 ] || [ "$flag" = false ]; then
    echo "Number is less than 5 or flag is false"
else
    echo "Number is equal to 5 and flag is neither true nor false"
fi

示例5:使用case语句进行多条件判断

复制代码
#!/bin/bash

day_of_week="Monday"

case $day_of_week in
    "Monday")
        echo "Today is Monday"
        ;;
    "Tuesday")
        echo "Today is Tuesday"
        ;;
    "Wednesday")
        echo "Today is Wednesday"
        ;;
    "Thursday")
        echo "Today is Thursday"
        ;;
    "Friday")
        echo "Today is Friday"
        ;;
    *)
        echo "Weekend!"
        ;;
esac

循环计算

在Shell脚本中实现循环计算,可以使用for循环和while循环。以下是两种循环结构的示例:

使用for循环

for循环通常用于遍历一个序列(例如,数字范围、数组元素等)并对每个元素执行一定的操作。

复制代码
#!/bin/bash

start=1
end=5

# 使用for循环计算1到5的和
sum=0
for ((i=start; i<=end; i++)); do
  sum=$((sum + i))
done

echo "The sum of numbers from $start to $end is: $sum"

使用while循环

while循环在给定条件为真时重复执行一段代码。

复制代码
#!/bin/bash

start=1
end=5

# 使用while循环计算1到5的和
sum=0
i=$start
while [ $i -le $end ]; do
  sum=$((sum + i))
  i=$((i + 1))
done

echo "The sum of numbers from $start to $end is: $sum"
相关推荐
jllllyuz9 分钟前
matlab实现蚁群算法解决公交车路径规划问题
服务器·前端·数据库
山师第一深情14 分钟前
ssh connect to remote gitlab without authority
服务器·ssh·gitlab
下雨天u41 分钟前
maven dependencyManagement标签作用
java·数据库·maven
代码配咖啡1 小时前
国产数据库工具突围:SQLynx如何解决Navicat的三大痛点?深度体验报告
数据库
敖云岚1 小时前
【Linux】基于虚拟机实现网络的管理
linux·服务器·网络
luck_me51 小时前
如何远程执行脚本不留痕迹
linux·运维·服务器
清酒伴风(面试准备中......)1 小时前
小白学编程之——数据库如何性能优化
数据库·oracle·性能优化
-SGlow-1 小时前
Linux相关概念和易错知识点(40)(HTML资源交互、网页管理、搜索引擎)
linux·运维·服务器·网络·html·交互
默心1 小时前
centos7部署mysql5.7
linux·运维·mysql·centos
-SGlow-1 小时前
Linux相关概念和易错知识点(39)(URL、HTTP)
linux·运维·http