shell处理用户输入传递参数的实现

 更新时间:2024年11月01日 09:43:03   作者:pineapple rong  
本文主要介绍了shell处理用户输入传递参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

向shell脚本传递数据的最基本方法是使用命令行参数。命令行参数允许运行脚本时在命令行中添加数据:

$ ./addem 10 30

本例向脚本addem传递了两个命令行参数(10和30)。脚本会通过特殊的变量来处理命令行参数。接下来将介绍如何在bash shell脚本中使用命令行参数。

读取参数

bash shell会将所有的命令行参数都指派给称作位置参数(positional parameter)的特殊变量。这也包括shell脚本名称。位置变量的名称都是标准数字:$0对应脚本名,$1对应第一个命令行参数,$2对应第二个命令行参数,以此类推,直到$9。

下面是在shell脚本中使用单个命令行参数的简单例子:

$ cat positional1.sh
#!/bin/bash
# Using one command-line parameter
#
factorial=1
for (( number = 1; number <= $1; number++ ))
do
    factorial=$[ $factorial * $number ]
done
echo The factorial of $1 is $factorial
exit
$
$ ./positional1.sh 5
The factorial of 5 is 120

在shell脚本中,可以像使用其他变量一样使用$1变量。shell脚本会自动将命令行参数的值分配给位置变量,无须做任何特殊处理。

如果需要输入更多的命令行参数,则参数之间必须用空格分开。shell会将其分配给对应的位置变量:

$ cat positional2.sh
#!/bin/bash
# Using two command-line parameters
#
product=$[ $1 * $2 ]
echo The first parameter is $1.
echo The second parameter is $2.
echo The product value is $product.
exit
$
$ ./positional2.sh 2 5
The first parameter is 2.
The second parameter is 5.
The product value is 10.

在上面的例子中,用到的命令行参数都是数值。你也可以在命令行中用文本字符串作为参数:

$ cat stringparam.sh
#!/bin/bash
# Using one command-line string parameter
#
echo Hello $1, glad to meet you.
exit
$
$ ./stringparam.sh world
Hello world, glad to meet you.

shell将作为命令行参数的字符串值传给了脚本。但如果碰到含有空格的字符串,则会出现问题:

$ ./stringparam.sh big world
Hello big, glad to meet you.

记住,参数之间是以空格分隔的所以shell会将字符串包含的空格视为两个参数的分隔符。要想在参数值中加入空格,必须使用引号(单引号或双引号均可)。

$ ./stringparam.sh 'big world'
Hello big world, glad to meet you.
$
$ ./stringparam.sh "big world"
Hello big world, glad to meet you.

注意        将文本字符串作为参数传递时,引号并不是数据的一部分,仅用于表明数据的起止位置。

 如果脚本需要的命令行参数不止9个,则仍可以继续加入更多的参数,但是需要稍微修改一下位置变量名。在 第9个位置变量之后,必须在变量名两侧加上花括号,比如${10}。来看一个例子:

$ cat positional10.sh
#!/bin/bash
# Handling lots of command-line parameters
#
product=$[ ${10} * ${11} ]
echo The tenth parameter is ${10}.
echo The eleventh parameter is ${11}.
echo The product value is $product.
exit
$
$ ./positional10.sh 1 2 3 4 5 6 7 8 9 10 11 12
The tenth parameter is 10.
The eleventh parameter is 11.
The product value is 110.

这样你就可以根据需要向脚本中添加任意多的命令行参数了。

读取脚本名

可以使用位置变量$0获取在命令行中运行的shell脚本名。这在编写包含多种功能或生成日志消息的工具时非常方便。

$ cat positional0.sh
#!/bin/bash
# Handling the $0 command-line parameter
#
echo This script name is $0.
exit
$
$ bash positional0.sh
This script name is positional0.sh.

但这里有一个潜在的问题。如果使用另一个命令来运行shell脚本,则命令名会和脚本名混在一起,出现在位置变量$0中:

$ ./positional0.sh
This script name is ./positional0.sh.

这还不是唯一的问题。如果运行脚本时使用的是绝对路径,那么位置变量$0就会包含整个路径:

$ $HOME/scripts/positional0.sh
This script name is /home/christine/scripts/positional0.sh.

如果你编写的脚本中只打算使用脚本名,那就得做点儿额外工作,剥离脚本的运行路径。好在有个方便的小命令可以帮到我们。basename命令可以返回不包含路径的脚本名:

$ cat posbasename.sh
# Using basename with the $0 command-line parameter
#
name=$(basename $0)
#
echo This script name is $name.
exit
$
$ ./posbasename.sh
This script name is posbasename.sh.

现在好多了。你可以使用此技术编写一个脚本,生成能标识运行时间的日志消息:

$ cat checksystem.sh
#!/bin/bash
# Using the $0 command-line parameter in messages
#
scriptname=$(basename $0)
#
echo The $scriptname ran at $(date) >> $HOME/scripttrack.log
exit
$
$ ./checksystem.sh
$ cat $HOME/scripttrack.log
The checksystem.sh ran at Wed 17 Jul 2024 19:00:53 AM EDT

拥有一个能识别自己的脚本对于追踪脚本问题、系统审计和生成日志信息是非常有用的。

参数测试

在shell脚本中使用命令行参数时要当心。如果运行脚本时没有指定所需的参数,则可能会出问题:

$ ./positional1.sh
./positional1.sh: line 5: (( number <= : syntax error:
operand expected (error token is "<= ")
The factorial of is 1

当脚本认为位置变量中应该有数据,而实际上根本没有的时候,脚本很可能会产生错误消息。这种编写脚本的方法并不可取。在使用位置变量之前一定要检查是否为空:

$ cat checkpositional1.sh
#!/bin/bash
# Using one command-line parameter
#
if [ -n "$1" ]
then
    factorial=1
    for (( number = 1; number <= $1; number++ ))
    do
        factorial=$[ $factorial * $number ]
    done
    echo The factorial of $1 is $factorial
else
    echo "You did not provide a parameter."
fi
exit
$
$ ./checkpositional1.sh
You did not provide a parameter.
$
$ ./checkpositional1.sh 3
The factorial of 3 is 6

上面这个例子使用了-n测试来检查命令行参数$1中是否为空。

到此这篇关于shell处理用户输入传递参数的实现的文章就介绍到这了,更多相关shell 用户输入传递参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Shell脚本导入导出数据的项目示例

    Shell脚本导入导出数据的项目示例

    在工作中,很多场景都会涉及到数据的导入导出,本文就介绍一下使用Shell脚本导入导出数据的项目示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Bash EOF的使用小结

    Bash EOF的使用小结

    本文主要介绍了Bash EOF的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • shell中if-then的高级使用

    shell中if-then的高级使用

    在Shell脚本编程中,if-then语句是基本的逻辑控制结构,用于根据条件执行代码,本文介绍了if-then的基本语法、条件表达式、使用单双括号的区别及高级特性,感兴趣的可以了解一下
    2024-11-11
  • Shell命令批量修改图片文件名

    Shell命令批量修改图片文件名

    这篇文章主要介绍了Shell命令批量修改图片文件名,本文使用for循环、awk、sed等命令实现批量修改图片文件名,需要的朋友可以参考下
    2014-12-12
  • 检查Linux系统中文件大小的方法总结

    检查Linux系统中文件大小的方法总结

    在Linux操作系统中,掌握如何高效检查文件大小是每位开发者和系统管理员的必备技能,本文详细介绍了四种检查Linux文件大小的方法,感兴趣的朋友可以参考下
    2024-03-03
  • linux 驱动之Kconfig文件和Makefile文件实例

    linux 驱动之Kconfig文件和Makefile文件实例

    这篇文章主要介绍了linux 驱动之Kconfig文件和Makefile文件实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • 如何解决 shell 脚本重复执行的问题

    如何解决 shell 脚本重复执行的问题

    假如执行备份脚本消耗的时间远大于设置的备份间隔的话,系统会出现多个同时在执行脚本的Bash实例,会占用大量的系统资源,进而影响正常业务程序的运行,那如何解决上述shell脚本重复执行的问题呢,本文将要介绍的 flock 命令可以解决这个问题
    2021-05-05
  • Linux 中可重入函数与不可重入函数详解

    Linux 中可重入函数与不可重入函数详解

    这篇文章主要介绍了Linux 中可重入函数与不可重入函数详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • fedora 23 lvm2格式 根目录磁盘空间不足 扩容方法

    fedora 23 lvm2格式 根目录磁盘空间不足 扩容方法

    下面小编就为大家带来一篇fedora 23 lvm2格式 根目录磁盘空间不足 扩容方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • bash脚本如何监控cup/内存/磁盘使用率

    bash脚本如何监控cup/内存/磁盘使用率

    本文主要介绍了bash脚本如何监控cup/内存/磁盘使用率,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论