Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明

简介: Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明

Shell脚本是一种命令语言,可以用于自动化执行各种任务。在脚本中,我们可以通过参数来传递信息,这样脚本就可以根据这些信息来执行特定的操作。本文将介绍如何在shell脚本中传递参数,包括位置参数、特殊变量、环境变量和命名参数。

1.Shell基础知识

1.1 解释器

#!/bin/bash 称为shebang或sha-bang、hashbang。是一个特殊的字符序列,由井号“#”和叹号“!”组成,放在脚本文件的第一行开头。在Linux和类Unix操作系统中,这个字符序列用于指定脚本文件的解释器路径。当一个脚本文件的第一行包含了shebang,操作系统在执行该文件时会将该路径后的所有参数传递给指定的解释器,让它来解释执行该脚本。

当系统运行一个脚本时,首先会检查脚本的shebang行,然后找到指定的解释器,并把脚本传递给它执行。如果shebang行不存在或格式不正确,系统会将脚本视为普通文本文件,并无法执行脚本。常见的解释器包括Bash shell、Python、Perl等,可以使用对应的路径来指定解释器。例如,#!/usr/bin/python 表示使用Python解释器来执行脚本。

如果一个文件没有shebang行,系统就不知道用哪个解释器来执行它。此时,如果这个文件具有可执行权限(例如755),系统会把它作为一个shell脚本来执行,使用的是默认的shell解释器(在大多数Unix/Linux系统中,这是Bash shell)。

Shell脚本是一种编程语言,可以用于在Unix/Linux系统上编写自动化任务,批量处理数据,系统管理等。下面是Shell脚本的基础知识:

1.2 变量

用于存储数据,可以使用=来赋值,例如name="kite"

1.3 参数

Shell脚本可以接收命令行传入的参数,使用$1$2等变量来引用,例如$1表示第一个参数。这部分第二章会详细举例。

1.4 条件语句

使用if语句来实现条件判断,例如:

# 脚本内容script.sh【使用位置参数】
#!/bin/bash
if [ $1 -gt 18 ]; then
    echo "You are an adult."
else
    echo "You are not an adult yet."
fi
# 脚本调用
./script.sh 19

1.5 循环语句

使用forwhile语句来实现循环,例如:

# for语句
for i in 1 2 3 4 5; do
    echo $i
done
# while语句【使用了变量】
i=0
while [ $i -lt 10 ]; do
    echo $i
    i=$((i+1))
done

1.6 函数

使用function()定义函数,例如:

# 注意函数的定义和调用都是在脚本内部的
function sayHi {
    echo "Hello, $1!"
}
sayHi "Kite"

1.7 输入输出

使用echo命令输出文本,使用read命令读取用户输入,例如:

# read 命令会等待输入
echo "What's your name?"
read name
echo "Hello, $name!"

1.8 命令执行

使用反引号或美元符来执行命令,并将结果赋值给变量,例如:

today=`date +%Y-%m-%d`
echo "Today is $today"

1.9 运算符

Shell脚本支持算术运算、字符串运算和逻辑运算,例如:

# 算术运算
num=$((1+2))
echo $num
# 字符串运算
if [ "$name" == "John" ]; then
    echo "Hello, John!"
fi
# 逻辑运算
if [ $age -gt 18 ] && [ $gender == "male" ]; then
    echo "You are a man."
fi

以上是Shell脚本的基础知识,掌握了这些知识可以编写简单的脚本来自动化执行任务,进一步学习可以掌握Shell脚本的高级用法,例如正则表达式、管道、重定向、进程控制等。

2. 参数传递

2.1 位置参数

在shell脚本中,可以使用位置参数来传递信息。可以使用$1、$2、$3等来访问它们。例如:

#!/bin/bash
echo "The first argument is $1"
echo "The second argument is $2"

在命令行中执行该脚本时,可以传递两个参数,如下所示:

$ ./script.sh hello world

输出:

The first argument is hello
The second argument is world

2.2 特殊变量

shell提供了许多特殊变量来传递额外的信息,例如:

  • $0:表示脚本名称。
  • $#:表示传递给脚本的参数个数。
  • $@:表示所有传递给脚本的参数的列表。
  • $?:表示上一个命令的返回值。

这也解释了为什么位置参数是从1开始的了,$0经常用在日志里,说明当前执行的脚本名称。

例如:

#!/bin/bash
echo "The script name is $0"
echo "The number of arguments is $#"
echo "The arguments are $@"
echo "The return value of the last command is $?"

在命令行中执行该脚本时,可以传递任意个数的参数,如下所示:

$ ./script.sh a b c

输出:

The script name is ./script.sh
The number of arguments is 3
The arguments are a b c
The return value of the last command is 0

2.3 环境变量

可以使用环境变量来传递信息。在shell脚本中,可以使用$VAR的形式来访问环境变量。例如:

#!/bin/bash
echo "The value of HOME is $HOME"
echo "The value of PATH is $JAVA_HOME"

在命令行中执行该脚本时,输出环境变量的值,如下所示:

$ ./script.sh
The value of HOME is /root
The value of PATH is /usr/local/java/jdk1.8.0_241

在脚本里获取环境变量,可对执行环境进行检验。

2.4 命名参数

2.4.1 getopts

getopts是Bash shell自带的命令行参数处理工具,它的语法比较简单,只支持处理单个字母选项,例如-a-b等。getopts只能处理短选项,也就是只能使用一个字母来表示选项,如果要处理长选项,需要编写更多的代码。另外,getopts处理命令行参数时会把选项和参数分别处理,不能处理连续的选项,例如-abc

# 测试脚本
#!/bin/bash
while getopts n:a:g: opt
do 
  case "${opt}" in
    n) name=${OPTARG};;
    a) age=${OPTARG};;
    g) gender=${OPTARG};;
  esac
done
echo "NameVal: $name";
echo "AgeVal: $age";
echo "GenderVal: $gender";
# 脚本调用
./script.sh -n Kite -a 18 -g f
NameVal: Kite
AgeVal: 18
GenderVal: f
2.4.2 getopt

getopt是GNU工具集中的一个命令行参数处理工具,它支持更多的选项和语法,可以处理短选项和长选项,还可以处理连续的选项。getopt的语法比getopts更加复杂,需要指定一个选项字符串,包含了所有支持的选项和参数。getopt将解析后的选项和参数保存在一个数组中,需要在代码中处理这个数组。

getopt命令有以下几个参数:

  • -o:指定单字符选项。选项之间无需分隔符。
  • --long:指定长选项。长选项之间使用逗号分隔。
  • ::选项后添加冒号说明当前选项需要参数值。
  • --:分割选项和参数。
  • "$@":表示将所有命令行参数作为一个字符串传递给getopt命令。

options=$(getopt -o n:a:g:p --long name:,age:,gender:,print -- "$@")会解析命令行选项和参数,并将转换后的选项和参数存储在变量options中。这个变量通常会传递给一个eval命令进行处理,例如:

eval set -- "$options"
# 测试脚本
#!/bin/bash
# 解析命令行参数
options=$(getopt -o n:a:g:p --long name:,age:,gender:,print -- "$@")
eval set -- "$options"
# 提取选项和参数
while true; do
  case $1 in 
    -a | --age) shift; age=$1 ; shift ;;
    -n | --name) shift; name=$1 ; shift ;;
    -g | --gender) shift; gender=$1 ; shift ;;
    -p | --print) print=true; shift ;;
    --) shift ; break ;;
    *) echo "Invalid option: $1" exit 1 ;;
  esac
done
# 检查变量
if [ -z "$age" ]; then
    echo "Error: age is required"
    exit 1
fi
if [ -z "$name" ]; then
    echo "Error: name is required"
    exit 1
fi
if [ -z "$gender" ]; then
    echo "Error: gender is required"
    exit 1
fi
# 判断开关选项
if [ "$print" = true ]; then
    echo "NameVal: $name; AgeVal: $age; GenderVal: $gender";
fi
# 脚本调用(长选项)
./script.sh --name Kite --age 18 --gender f -p
NameVal: Kite; AgeVal: 18; GenderVal: f
# 脚本调用(单字符选项)
./script.sh -n Kite -a 18 -g f -p
NameVal: Kite; AgeVal: 18; GenderVal: f

3.总结

如果能够灵活运用shell脚本,也是很强大的。

目录
相关文章
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
628 3
Linux系统初始化脚本
|
6月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
560 9
|
6月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
548 4
|
6月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
703 1
二、Linux文本处理与文件操作核心命令
|
6月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
422 137
|
6月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1043 58
|
9月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
786 143
linux命令—tree
|
5月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
971 2
|
6月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
527 0
Linux内存问题排查命令详解