shell 入参

Shell——函数参数传递 上述 getopts 后面的 “s:k:y:” 是用户可以给函数提供的选项参数,每个参数还都可以含有参数,因为他们后面都加了 “:”,这个参数会被存到 系统变量 $OPTARG 中。getopts 是 bash 内置的一个命令,通过该命令,用户可以获取函数的选项以及参数值,或者是脚本的命令行选项以及参数值。可以发现,上述的变量 var 的值 是另一个变量(name)的变量名,,此时 可以通过两种方法来引用第二个变量。用户可以通过 系统变量 $# 来获取脚本的参数的个数,当然,函数也是。 阅读详情
参数处理-Shell传入参数的处理
1. $# 传递到脚本的参数个数
2. $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
3. $$ 脚本运行的当前进程ID号
4. $! 后台运行的最后一个进程的进程ID号
5. $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
6. $- 显示shell使用的当前选项,与set命令功能相同
7. $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
变量 含义
$0 脚本名字
$1 位置参数 #1
$2 - $9 位置参数 #2 - #9
${10} 位置参数 #10
$# 位置参数的个数
"$*" 所有的位置参数(作为单个字符串) *
"$@" 所有的位置参数(每个都作为独立的字符串)
${#*} 传递到脚本中的命令行参数的个数
${#@} 传递到脚本中的命令行参数的个数
$? 返回值
$$ 脚本的进程ID(PID)
$- 传递到脚本中的标志(使用set)
$_ 之前命令的最后一个参数
$! 运行在后台的最后一个作业的进程ID(PID)


       使用shell处理的时候对参数的处理是个基本模块,所以今天找到一篇简单易懂的文章来进行参考,作为以后shell参数处理的模板,推荐使用getOpts形式进行参数的处理。

0.引言

   写程序的时候经常要处理命令行参数,本文描述在Bash下的命令行处理方式。

   选项与参数:

   如下一个命令行:

./test.sh -f config.conf -v --prefix=/home

   我们称-f为选项,它需要一个参数,即config.conf, -v 也是一个选项,但它不需要参数。

   --prefix我们称之为一个长选项,即选项本身多于一个字符,它也需要一个参数,用等号连接,当然等号不是必须的,/home可以直接写在--prefix后面,即--prefix/home,更多的限制后面具体会讲到。
   在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。

    * 手工处理方式
    * getopts
    * getopt

   下面我们依次讨论这三种处理方式。

1. 手工处理方式

   在手工处理方式中,首先要知道几个变量,还是以上面的命令行为例:

    *    $0 : ./test.sh,即命令本身,相当于C/C++中的argv[0]
    *    $1 : -f,第一个参数.
    *    $2 : config.conf
    *    $3, $4 ... :类推。
    *    $# 参数的个数,不包括命令本身,上例中$#为4.
    *    $@ :参数本身的列表,也不包括命令本身,如上例为 -f config.conf -v --prefix=/home
    *    $* :和$@相同,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组。如下例所示:


1 #!/bin/bash
2
3 for arg in "$*"
4 do
5     echo $arg
6 done
7
8 for arg in "$@"
9 do
10     echo $arg
11 done
12

执行./test.sh -f config.conf -n 10 会打印:

-f config.conf -n 10    #这是"$*"的输出

-f   #以下为$@的输出

config.conf

-n

10


   所以,手工处理的方式即对这些变量的处理。因为手工处理高度依赖于你在命令行上所传参数的位置,所以一般都只用来处理较简单的参数。如

   ./test.sh 10

   而很少使用./test -n 10这种带选项的方式。 典型用法为:

#!/bin/bash

if [ x$1 != x ]
then
    #...有参数
else
then
    #...没有参数
fi


为什么要使用 x$1 != x 这种方式来比较呢?想像一下这种方式比较:


if [ -n $1 ] #$1不为空

但如果用户不传参数的时候,$1为空,这时 就会变成 [ -n ] ,所以需要加一个辅助字符串来进行比较。

手工处理方式能满足大多数的简单需求,配合shift使用也能构造出强大的功能,但在要处理复杂选项的时候建议用下面的两种方法。

2. getopts/getopt

处理命令行参数是一个相似而又复杂的事情,为此,C提供了getopt/getopt_long等函数,
C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt.

getopts和getopt功能相似但又不完全相同,其中getopt是独立的可执行文件,而getopts是由Bash内置的。

先来看看参数传递的典型用法:

    * ./test.sh -a -b -c : 短选项,各选项不需参数
    * ./test.sh -abc   : 短选项,和上一种方法的效果一样,只是将所有的选项写在一起。
    * ./test.sh -a args -b -c :短选项,其中-a需要参数,而-b -c不需参数。
    * ./test.sh --a-long=args --b-long :长选项

我们先来看getopts,它不支持长选项。

使用getopts非常简单:
代码


#test.sh

#!/bin/bash

while getopts "a:bc" arg #选项后面的冒号表示该选项需要参数
do
        case $arg in
             a)
                echo "a's arg:$OPTARG" #参数存在$OPTARG中
                ;;
             b)
                echo "b"
                ;;
             c)
                echo "c"
                ;;
             ?) #当有不认识的选项的时候arg为?
            echo "unkonw argument"
        exit 1
        ;;
        esac
done


现在就可以使用:
./test.sh -a arg -b -c
或
./test.sh -a arg -bc
来加载了。
应该说绝大多数脚本使用该函数就可以了,如果需要支持长选项以及可选参数,那么就需要使用getopt.
下面是getopt自带的一个例子:


#!/bin/bash

# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script language can be found
# as parse.tcsh

# Example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*/?' -cmore -b " very long "
# Option a
# Option c, no argument
# Option c, argument `more'
# Option b, argument ` very long '
# Remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*/?'

# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.

#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
#如-carg 而不能是-c arg
#--long表示长选项
#"$@"在上面解释过
# -n:出错时的信息
# -- :举一个例子比较好理解:
#我们要创建一个名字为 "-f"的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir -- -f 这样-f就不会被作为选项。

TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: /
     -n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"

#经过getopt的处理,下面处理具体选项。

while true ; do
        case "$1" in
                -a|--a-long) echo "Option a" ; shift ;;
                -b|--b-long) echo "Option b, argument /`$2'" ; shift 2 ;;
                -c|--c-long)
                        # c has an optional argument. As we are in quoted mode,
                        # an empty parameter will be generated if its optional
                        # argument is not found.
                        case "$2" in
                                "") echo "Option c, no argument"; shift 2 ;;
                                *) echo "Option c, argument /`$2'" ; shift 2 ;;
                        esac ;;
                --) shift ; break ;;
                *) echo "Internal error!" ; exit 1 ;;
        esac
done
echo "Remaining arguments:"
for arg do
   echo '--> '"/`$arg'" ;
done


比如我们使用
./test -a -b arg arg1 -c
你可以看到,命令行中多了个arg1参数,在经过getopt和set之后,命令行会变为:
-a -b arg -c -- arg1
$1指向-a,$2指向-b,$3指向arg,$4指向-c,$5指向--,而多出的arg1则被放到了最后。


3.总结
一般小脚本手工处理也许就够了,getopts能处理绝大多数的情况,getopt较复杂,功能也更强大。

******************************************************************************************************************************

shift其实很简单的,就是左移参数列表,shift一次就将最左边的参数$1移出去了,然后
原来的$2现在就变成了$1。

shift后面还可以带上一个数字,指明要移出多少个参数(默认只移出一个),比如说
shift 3 就是移出3个参数,之后原来的$4就变成了现在的$1。

eval就是先将后面的参数执行一遍,将必要的置换都做了,再来执行命令。举个例子:
MYFILE="cat myfile"
echo $MYFILE   # output: cat myfile
eval $MYFILE   # output: contents of myfile

再举个详细点儿的例子:
#!/bin/bash
# evalit
echo " Total number of arguments passed: $#"
echo " The process ID: $$"
echo " Last argument: " $(eval echo /$$#)
运行脚本:
$ ./evalit alpha bravo charlie
output as follows:
Total number of arguments passed: 3
The process ID: 780
Last argument:   charlie

读取文件
for i in `cat abc.txt`
do
echo $i
done

转自:http://blog.youkuaiyun.com/qzwujiaying/article/details/6371246

入理解Bash中的参数、数组及其高级用法 Bash是Unix/Linux系统中常用的命令行解释器,它为开发者提供了强大的功能,包括处理参数、数组以及更复杂的命令执行方式。在这篇文章中,我们将深入探讨Bash中的参数传递、数组操作以及一些高级用法,帮助你写出更强大、更灵活的Shell脚本。 在Bash脚本中,参数是传递给命令或脚本的输入数据。理解如何使用参数是编写有效脚本的基础。位置参数: 在命令行中执行脚本时,传递的参数会被自动赋值给位置参数 , , 等。例如: 运行脚本时,传递给 的值就会被打印出来。获取所有参数: 使用 和 可以获取所有 阅读详情

相关推荐

Shell脚本接收位置参数,变量的定义和运算、流程控制语句演示

本文系统介绍了Shell脚本编程中的变量使用和流程控制语句。主要内容包括: 变量部分: 变量获取方式($符号、read命令) 变量类型(局部/全局变量、字符串/整数/数组变量) 变量运算方法($(())、let、expr、bc等) 字符串处理技巧(截取、替换、删除等) 流程控制部分: if语句(单分支/多分支) for循环(常用格式、九九乘法表示例) while循环 case语句(分数等级判断示例) 文章通过大量实例代码演示了Shell脚本编程的核心语法要素,适合作为Shell编程的入门参考。

树下一少年的博客 5649

参数处理-Shell传入参数的处理

原帖来自于http://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html另外一个参考文章:http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html,其中关于getOpts的解释比较基础。       使用shell处理的时候对参数的处理是个基本模块,所以

刘红星的专栏 3634

OnlyOffice Docker部署实战:解除20连接限制+500M文件上传配置(附中文字体解决方案)

本文详细介绍了OnlyOffice企业级Docker部署的全过程,包括解除20并发连接限制、提升文件上传大小至500MB以及解决中文字体显示问题。通过定制镜像、优化配置和字体安装,帮助技术团队快速搭建高性能的文档协作平台,适用于企业级应用场景。

weixin_26850069的博客 443

如何给shell脚本传入参数小结

大家都知道普通的bash命令后边可以跟任意的参数,那我们自己编写的脚本是否也支持传递参数呢?答案当然是肯定的 执行“vim test.sh”创建一个新的shell脚本。脚本test.sh的内容如下: #!/bin/sh name=$1 echo "the ${name} are great man!" 给新创建的test.sh的脚本赋可执行权限,命令为“chmod +x test.sh”

AlexYBB的专栏 1万+

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4319

避坑指南:MTK平台Widevine L1密钥安装全流程详解(含SP META工具使用与Log分析)

本文详细解析了MTK平台实现Widevine L1认证的全流程,涵盖密钥申请、格式转换、安全烧录等关键步骤,特别针对Trustonic TEE环境下的SP META工具使用与日志分析提供实用指南。帮助开发者规避常见错误,确保DRM密钥安全部署,满足高端内容保护需求。

weixin_27219587的博客 476

shell 函数 入参说明

1. 入参个数: $# 2. 入参:  $0  脚本名    $1第一个参数 3.  $@ 和 $*:        "$@"  "$*"  都是所有入参       $@  将入参变成一个数组     $*将入参变成一个字符串 4. 数组作为入参: fucn2  ${arr[*]} ,函数内部获取入参数组:   arr=` echo "$@" ` demo :

putaoxiangqi的专栏 4085

【异常】解决JDK21升级中的SecurityException: JCE无法验证BC提供者问题

本文详细解析了JDK21升级中常见的SecurityException: JCE无法验证BC提供者问题的根源与解决方案。核心在于JDK21强化了JCE安全验证,导致签名不合规的老版本Bouncy Castle库被拒绝。文章提供了通过Maven依赖树精准定位、排除旧版本并引入兼容的bcprov-jdk18on新库的完整步骤,以及清理缓存等实战技巧,帮助开发者彻底解决此兼容性问题。

weixin_29197051的博客 490

shell中将数组作为入参

参考文章: https://www.coder.work/article/2566787 https://www.codenong.com/1063347/ 网上直接搜的文章要么太绕,要么很有局限(数组元素中含有空格或者*时候无效),这里总结了几种方法: 0. 如果只传递一个数组,没有其他参数,那么直接用local_array=("$@")即可搞定,其余的方法都是多参数的 function func { local_array=("$@") for str in "${local_arra..

killwho的专栏 1040

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2906

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3446

linux 脚本含参,linux shell脚本文件的入参

几个特殊变量:$0 : 指本脚本文件的文件名$1及以后: 脚本文件的入参$# : 入参个数$* : 所有入参,将所有变量当作单个单词保存,基本上,将所有参数当作一个参数,而不是多个对象。如./tmp.sh a b c d,如果用$*遍历的话,则认为$1是 a b c d$@ : 所有入参,将命令行上提供的所有参数当作同一个字符串中的多个独立的单词,允许遍历所有的值。如./tmp.sh a b c ...

weixin_35881620的博客 1249

在 SAP ECC 中定义 ledger 时遇到 “Define exactly one leading ledger“(消息号 FAGL_LEDGER_CUST012)的错误

摘要:SAP系统要求必须且只能定义一个主导分类账(Leading Ledger)。当出现错误消息FAGL_LEDGER_CUST012时,需通过事务码FINSC_LEDGER或SPRO路径检查分类账配置,确保仅有一个分类账被标记为"LeadingLedger",其余设为"Non-leadingLedger"。主导分类账是SAP默认用于标准报表的核心分类账,修改配置需谨慎以免影响已有数据。若问题未解决,建议检查未完成配置或查阅SAP Notes获取解决方案。

金牌架构师 802

shell多入参函数

shell多入参函数 实例: #!/bin/sh check_third_url() { THIRD_REFER_URL="aaa/bbb/ccc" THIRD_SSO_URL="https://aaa.com.cn/#/login?callback=https://bbb.com\&cc=true" check_url $THIRD_REFER_URL $THIRD_SSO_URL export THIRD_REFER_URL export THIRD_SS

weixin_38370441的博客 555

【2025国赛A题】A题烟幕干扰弹的投放策略思路+代码+论文

【2025国赛A题】A题烟幕干扰弹的投放策略思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 866

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

shell 脚本入参介绍

$*表示所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2 $@表示所有这些参数都分别被双引号引住,若一个脚本接收到两个参数,$@等价于$1$2 $#表示提供给脚本的参数号

duan19056的专栏 1175

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

入参的Shell script

 #!/bin/ksh#ident  "%W%"OPTDIR=/opt/gpf/SubLedgercd $OPTDIR/bin. ./setEnv.kshCLASSPATH=$CLASSPATH:$OPTDIR/etcCLASSPATH=$CLASSPATH:$OPTDIR/lib/commons-collections.jarCLASSPATH=$CLASSPATH:$OPTDI

windforcecn的专栏 724

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

shell 脚本中的入参获取与判断

1、获取shell脚本的入参个数: $# 2、获取shell脚本的第n个入参的字符个数/字符串长度(注意这里的n需要替换为具体的数字,如果这个数字超过实际的入参个数,结果为0): ${#n}

huangmr的专栏 3338

shell脚本的入参

shell脚本参数可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制。参数从第一个开始,在第九个结束。$0 程序名字$n 第n个参数值,n=1..9$* 所有命令行参数$@ 所有命令行参数,如果它被包含在引号里,形如”$@”,则每个参数也各自被引号包括$# 命令行参数个数$$ 当前进程的进程ID(PID)$!最近后台进程的进程ID$?最近使用命令的退...

weixin_30697239的博客 347

[LINUX]shell设置入参默认值

设置传入参数的默认值: v=${1:-‘默认值字符串’}

小蜗牛之家 1598

shift妙用之解决shell编程中的入参问题

shell编程经常会遇到参数个数不定的这种情况,这种情况怎么处理呢?shift就要闪亮登场了 我说过了,shell是我的常规武器,目前虽然还不纯熟,但是我爱shell这门语言,在Linux下面混,总要写脚本。程序员是有基因,对编程语言是有偏好的,你让我写C代码,我会觉得很爽,会有困难,会有痛苦的摸索和学习,但是,我愿意;学习shell/python,我也很乐意,甚至Lisp这种冷门的语言我也充满

转角遇到她的专栏 1762

shell编程总结10(入参)

为什么80%的码农都做不了架构师?>>> ...

weixin_34356138的博客 259

shell脚本中字符和文件的判断及字符串入参的注意事项

<br />1、在shell脚本中判断字符串为空  if [ -z "$str"] then......<br />2、在shell脚本中判断字符串不为空 if[ "$str"] then.....<br />3、在shell脚本中判断文件是否存在 if [ -f  "$var" ] then......<br />4、字符串入参的注意事项<br />      将字符串当做入参时,要用""引起来。在脚本中使用字符串入参时,有两种方式(脚本如下:实现在屏幕指定位置输出字符串的功能)<br />       

wyjlhf的专栏 2221

shell脚本依据入参分别执行之expect解析器下

#!/usr/bin/expect set ACTION_RESTART_DHCP_SERVICE "1"        set ACTION_STOP_DHCP_SERVICE "2" set ACTION_UPDATE_DHCP_CONF "3" #puts $ACTION_RESTART_DHCP_SERVICE switch $argv {   "1"

小饼仙子的专栏 909

tauri中shell的特殊字符

官网例子:https://tauri.app/plugin/shell/中的入参是 \S+ 入参,但如果入参存在空格等特殊字符串,将无法传入。,shell的cmd命令将可以传入任意字符。

凌康的博客 464
上一篇: shell if
下一篇: linux 创建多级目录 mkdir -p
依栏听风雨
博客等级 码龄15年 24粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值