技圈网

当前位置»首页 » Linux

Shell脚本传递参数得4种方式实例说明

目录

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/bashif [ $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 $idone# while语句【使用了变量】i=0while [ $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 nameecho "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、1、1、2、$3等来访问它们。例如:

#!/bin/bashecho "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/bashecho "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/bashecho "The value of HOME is $HOME"echo "The value of PATH is $JAVA_HOME"

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

$ ./script.shThe value of HOME is /rootThe 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/bashwhile getopts n:a:g: optdo 	case "${opt}" in		n) name=${OPTARG};;		a) age=${OPTARG};;		g) gender=${OPTARG};;	esacdoneecho "NameVal: $name";echo "AgeVal: $age";echo "GenderVal: $gender";
# 调用./script.sh -n Kite -a 18 -g fNameVal: KiteAgeVal: 18GenderVal: 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 ;;  esacdone# 检查变量if [ -z "$age" ]; then    echo "Error: age is required"    exit 1fiif [ -z "$name" ]; then    echo "Error: name is required"    exit 1fiif [ -z "$gender" ]; then    echo "Error: gender is required"    exit 1fi# 判断开关选项if [ "$print" = true ]; then    echo "NameVal: $name; AgeVal: $age; GenderVal: $gender";fi
# 调用(长选项)./script.sh --name Kite --age 18 --gender f -pNameVal: Kite; AgeVal: 18; GenderVal: f# 调用(单字符选项)./script.sh -n Kite -a 18 -g f -pNameVal: Kite; AgeVal: 18; GenderVal: f

3.总结

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

以上就是Shell传递参数得4种方式实例说明得详细内容,更多关于Shell传参方式得资料请关注之家其它相关内容!