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"
相关推荐
为思念酝酿的痛5 小时前
POSIX信号量
linux·运维·服务器·后端
ccddsdsdfsdf5 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
隔窗听雨眠6 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
丷丩6 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空996 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
人还是要有梦想的7 小时前
linux下用搜狗输入法,中英文切换
linux·运维·服务器
bush47 小时前
嵌入式linux学习记录二
linux·运维·学习
9分钟带帽7 小时前
linux_通过NFS挂载远程服务器的硬盘
linux·服务器
TheRouter7 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro7 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言