「Linux系列」说说Shell参数传递、参数处理方法

一、Shell参数传递

在Shell脚本中,你可以使用特殊变量 $1$2$3 等来接收传递给脚本的参数。$0 是脚本的名称,$1 是第一个参数,$2 是第二个参数,以此类推。$# 表示传递给脚本的参数个数,$* 表示所有参数。

下面是一个简单的示例,演示如何在Shell脚本中传递参数:

#!/bin/bash

echo "脚本名称: $0"
echo "参数个数: $#"
echo "所有参数: $*"
echo "第一个参数: $1"
echo "第二个参数: $2"

# 使用参数
sum=$(( $1 + $2 ))
echo "参数之和: $sum"

保存这个脚本为 script.sh,然后在命令行中运行它并传递参数:

chmod +x script.sh  # 添加执行权限
./script.sh 5 10    # 传递两个参数 5 和 10

输出将会是:

脚本名称: ./script.sh
参数个数: 2
所有参数: 5 10
第一个参数: 5
第二个参数: 10
参数之和: 15

在这个示例中,脚本首先打印出脚本的名称、参数个数、所有参数以及每个单独的参数。然后,它计算并打印出前两个参数的和。

二、Shell参数处理方法

在Shell脚本中,处理参数的方法多种多样,可以包括基本的参数传递、默认值设置、参数个数检查以及更复杂的逻辑判断等。以下是一些常见的Shell参数处理方法及其案例代码:

1. 基本参数传递

#!/bin/bash

echo "第一个参数: $1"
echo "第二个参数: $2"
echo "第三个参数: $3"

2. 检查参数个数

#!/bin/bash

if [ $# -ne 2 ]; then
  echo "错误:需要两个参数。"
  exit 1
fi

echo "第一个参数: $1"
echo "第二个参数: $2"

3. 设置参数默认值

#!/bin/bash

# 如果第一个参数未设置,则使用默认值"default"
first_param=${1-"default"}

echo "第一个参数: $first_param"

4. 使用shift处理多个参数

#!/bin/bash

echo "第一个参数: $1"
shift  # 将位置参数左移一位,原来的$2变成$1,$3变成$2,以此类推
echo "现在的第一个参数(原第二个参数): $1"

5. 遍历所有参数

#!/bin/bash

for param in "$@"; do
  echo "参数: $param"
done

6. 使用getopts处理带选项的参数

#!/bin/bash

while getopts ":a:b:" opt; do
  case $opt in
    a)
      arg_a=$OPTARG
      echo "选项 -a 的参数: $arg_a"
      ;;
    b)
      arg_b=$OPTARG
      echo "选项 -b 的参数: $arg_b"
      ;;
    \?)
      echo "无效选项: -$OPTARG"
      exit 1
      ;;
    :)
      echo "选项 -$OPTARG 需要一个参数。"
      exit 1
      ;;
  esac
done

shift $((OPTIND - 1))  # 移除已处理的选项和参数

# 处理剩下的非选项参数(如果有的话)
for param in "$@"; do
  echo "非选项参数: $param"
done

运行上述脚本时,可以使用带有选项和非选项参数的命令行,例如:

./script.sh -a value_a -b value_b arg1 arg2

7. 综合示例:一个简单的计算器脚本

#!/bin/bash

# 检查参数个数
if [ $# -ne 3 ]; then
  echo "用法: $0 操作符 数值1 数值2"
  echo "支持的操作符: +, -, *, /"
  exit 1
fi

operator=$1
num1=$2
num2=$3

# 根据操作符计算结果
case $operator in
  +)
    result=$((num1 + num2))
    ;;
  -)
    result=$((num1 - num2))
    ;;
  *)
    result=$((num1 * num2))
    ;;
  /)
    # 检查除数是否为0
    if [ $num2 -eq 0 ]; then
      echo "错误:除数不能为0。"
      exit 1
    fi
    result=$(bc <<< "scale=2; $num1 / $num2")  # 使用bc进行浮点除法
    ;;
  *)
    echo "错误:不支持的操作符 $operator"
    exit 1
    ;;
esac

echo "结果: $result"

这个脚本接受一个操作符和两个数值作为参数,根据操作符执行相应的计算,并输出结果。注意,在处理除法时,我们使用了bc命令来处理浮点数的除法,并设置了精度为两位小数。

三、$* 与 $@ 区别

在Shell脚本中,$*$@ 都用于表示所有的位置参数,但它们在使用时有一些细微的差别。

$* 将所有的位置参数作为一个单一的字符串来处理,参数之间由空格分隔。当$*被双引号"包围时,它仍然会将所有的参数视为一个整体,但其中的每个参数仍然保持其原有的引号。

$@ 将每个位置参数作为独立的字符串来处理,当$@被双引号"包围时,它会将每个参数作为独立的字符串,并且会保留每个参数原有的引号。

下面是一个简单的示例,演示$*$@的区别:

#!/bin/bash

echo "使用 \$* (无引号): $*"
echo "使用 \$* (有引号): \"$*\""
echo "使用 \$@ (无引号): $@"
echo "使用 \$@ (有引号): \"$@\""

# 假设传递了如下带空格和引号的参数
./script.sh "arg1 with space" "arg2" "arg3 with \"quote\""

假设上述脚本被命名为 script.sh,并赋予执行权限,运行脚本并传递带有空格和引号的参数,输出可能是:

使用 $* (无引号): arg1 with space arg2 arg3 with "quote"
使用 $* (有引号): "arg1 with space arg2 arg3 with "quote""
使用 $@ (无引号): arg1 with space arg2 arg3 with "quote"
使用 $@ (有引号): "arg1 with space" "arg2" "arg3 with \"quote\""

从上面的输出可以看出:

  • $*无引号时,它会把所有参数当作一个字符串打印,参数之间用空格分隔。
  • $*有引号时,它会把所有参数当作一个整体字符串打印,但参数中的空格和引号都被保留。
  • $@无引号时,它的行为与无引号的$*类似,但更明显地显示出它是多个独立的参数。
  • $@有引号时,它会为每个参数添加引号,并保持原有的引号,这在参数中包含空格或特殊字符时非常有用。

因此,在编写需要处理带空格或特殊字符的参数的脚本时,通常推荐使用"$@"来确保每个参数都被正确处理。

四、相关链接

  1. Linux官网
  2. Linux常用命令
  3. CentOS官网下载地址
  4. 「Linux系列」Linux简介及常见的Linux系统
  5. 「Linux系列」Linux 系统启动过程
  6. 「Linux系列」Linux 系统目录结构/忘记密码解决方法
  7. 「Linux系列」Linux 远程登录/文件基本属性
  8. 「Linux系列」Linux 文件与目录管理
  9. 「Linux系列」Linux 如何学习用户和用户组管理
  10. 「Linux系列」聊聊Linux磁盘管理的事
  11. 「Linux系列」聊聊vi/vim的3种命令模式
  12. 「Linux系列」了解下Linux yum(包管理工具)

相关推荐

  1. Linux系列说说Shell参数传递参数处理方法

    2024-03-22 09:02:01       44 阅读
  2. Linuxshell——传递参数

    2024-03-22 09:02:01       22 阅读
  3. python中的fire和Linux shell中的参数传递

    2024-03-22 09:02:01       20 阅读
  4. shell处理用户输入——移动参数

    2024-03-22 09:02:01       23 阅读
  5. WPF 两个程序之间传递参数shell32.dll)

    2024-03-22 09:02:01       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 09:02:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 09:02:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 09:02:01       87 阅读
  4. Python语言-面向对象

    2024-03-22 09:02:01       96 阅读

热门阅读

  1. DeepLearning in Pytorch|手写数字识别器_minst_convnet

    2024-03-22 09:02:01       34 阅读
  2. Pytorch: torch.mean()

    2024-03-22 09:02:01       39 阅读
  3. pytorch与大语言模型直接偏好优化DPO方法

    2024-03-22 09:02:01       45 阅读
  4. 【Python】Pycharm 的 python_stubs

    2024-03-22 09:02:01       39 阅读
  5. PYTorch训练和推理 指定GPU

    2024-03-22 09:02:01       39 阅读
  6. Visual Studio工程升级QT产生的问题及解决

    2024-03-22 09:02:01       44 阅读
  7. WPF —— ToolTip详解

    2024-03-22 09:02:01       45 阅读
  8. 设计模式(行为型设计模式——备忘录模式)

    2024-03-22 09:02:01       45 阅读
  9. 【Django】CORS跨域问题

    2024-03-22 09:02:01       40 阅读