Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >两行 shift 变一行,shell脚本解析参数出现“死循环”

两行 shift 变一行,shell脚本解析参数出现“死循环”

作者头像
程序熵
发布于 2024-11-27 02:32:12
发布于 2024-11-27 02:32:12
14500
代码可运行
举报
文章被收录于专栏:技术汇技术汇
运行总次数:0
代码可运行

前几天发现小伙伴写的 shell 脚本在参数正常时执行正常,在参数异常时执行出现死循环了。

参考前文 在Bash中解析命令行参数的两种样例脚本 代码,将相关代码改为如下 demo 程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

POSITIONAL_ARGS=() #初始化一个空数组,用来存储位置参数

while [[ $# -gt 0 ]]; do  #当命令行参数的数量大于0时,进入循环
  case $1 in
    -e|--extension)  #如果参数是这个,脚本会将紧随其后的参数(文件扩展名)保存在变量 EXTENSIONEXTENSION="$2"
      shift 2 # 跳过参数 和 后面的值
      ;;
    -s|--searchpath)  #如果参数是这个,脚本会将紧随其后的参数(搜索路径)保存在变量 SEARCHPATHSEARCHPATH="$2"
      shift 2 # 跳过参数 和 后面的值
      ;;
    --default)  #如果参数是这个,脚本会将变量 DEFAULT 设置为 YES
      DEFAULT=YES
      shift # 跳过参数
      ;;
    -*|--*)  #如果参数是以 --- 开头且未知的选项,打印错误信息并退出
      echo "Unknown option $1"
      exit 1
      ;;
    *)  #对于所有其他非选项参数(即位置参数),将它们逐一添加到 POSITIONAL_ARGS 数组中,
      POSITIONAL_ARGS+=("$1") # 保存位置参数
      shift
      ;;
  esac
done

set -- "${POSITIONAL_ARGS[@]}" # 将数组里的参数设置为当前 shell 的位置参数

echo "FILE EXTENSION  = ${EXTENSION}"
echo "SEARCH PATH     = ${SEARCHPATH}"
echo "DEFAULT         = ${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)

if [[ -n $1 ]]; then
    echo "The non option arguments are:" $@
fi

不同的点在于将样例代码中连续的两行 shift 合为一行 shift 2

测试效果如下:

于是使用命令 bash -x demo-space-separated.sh -e 调试一下,输出信息如下:

根据打印输出并结合脚本代码可知,程序出现了死循环,参数个数 $# 没能减为0,一直在 while 循环里面跳转。

修改回两行 shift 的代码,再测试效果如下:

没有死循环了,会有相应的提示信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在Bash中解析命令行参数的两种样例脚本
如何解析 v、f 和 d,使它们都被设置为 true,并且 outFile 等于 /fizz/someOtherFile ?
程序熵
2024/05/09
4510
在Bash中解析命令行参数的两种样例脚本
Shell 脚本的参数解析工具
Argbash是一个代码生成器,它为你的脚本生成一个量身定制的解析库。与其他bash模块的通用代码不同,它生成你的脚本所需的最少代码。此外,如果你不需要100%符合那些CLI标准的话,你可以生成更简单的代码。
杰哥的IT之旅
2021/04/20
1.9K0
第三十三章 : 位置参数
One feature that has been missing from our programs is the ability to accept and processcommand line options and arguments. In this chapter, we will examine the shell featuresthat allow our programs to get access to the contents of the command line.
砖业洋__
2023/05/06
9720
Shell脚本的参数和选项
Shell脚本是一种常用的自动化工具,用于编写各种任务和批处理脚本。Shell脚本支持参数和选项,可以让我们更灵活地控制脚本的行为。本文将详细介绍Shell脚本中的参数和选项,包括基本语法、使用方法和示例。
玖叁叁
2023/04/10
2.5K0
Linux: Shell脚本实现支持长选项参数
在Linux Shell脚本中,短选项有时不够用或者不够直观。长选项(如--help、--version)则更加直观且易于理解。本文将详细讲解如何在Shell脚本中实现支持长选项参数的功能。
运维开发王义杰
2024/06/25
4660
Linux: Shell脚本实现支持长选项参数
Shell脚本编程_shell简单脚本
  shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,在用户和内核之间充当翻译官的角色,是一个命令解释器。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 shell。
全栈程序员站长
2022/11/09
8.2K0
Shell脚本编程_shell简单脚本
shell脚本中while 和shift 配和解决变长参数问题
在shell脚本中,我们经常需要根据传递的参数个数来进行相应的处理,那么参数个数不定的情况下如何实现优雅的处理呢?
qsjs
2020/06/09
1.9K0
《Linux命令行与shell脚本编程大全》第十四章 处理用户输入
有时还会需要脚本能够与使用者交互。bash shell提供了一些不同的方法来从用户处获得数据, 包括命令行参数,命令行选项,以及直接从键盘读取输入的能力。 14.1 命令行参数 就是添加在命令后的数据 比如: ./addem  10  30 10  和  30 就是传递的命令行参数 14.1.1 读取参数 bash shell会将一些称为位置参数的特殊变量分配给输入到命令行中的所有参数。 比如: $0:程序名   $1:第一个参数   $2:第2个参数 …… 以此类推直到第九个参数。 每个参数都必须用空格分
xcywt
2018/01/11
1.9K0
《Linux命令行与shell脚本编程大全》第十四章 处理用户输入
linux: 如何高效处理Shell脚本中的大量参数
在编写Shell脚本时,我们常常需要处理大量的参数。为了提高代码的可读性和可维护性,我们需要一些技巧来高效地管理这些参数。本文将探讨几种有效的方法,帮助我们简化Shell脚本中的参数处理。
运维开发王义杰
2024/06/26
5550
linux: 如何高效处理Shell脚本中的大量参数
shell脚本专题(05):传参
最近使用了个自动化平台(详见自动化运维平台Spug测试)进行每周的变更,效果很不错,平台将大量重复繁琐的操作通过脚本分发方式标准化自动化了,平台核心是下发到各个服务器的shell脚本,感觉有必要对shell脚本做个总结,所以有了写本专题的想法。本专题将结合运维实际介绍shell脚本的各项用法,预计10篇左右,将包括系统巡检、监控、ftp上传下载、数据库查询、日志清理、时钟同步、定时任务等,里面会涉及shell常用语法、注意事项、调试排错等。
loong576
2021/03/27
9120
shell 脚本中关于用户输入参数的处理
bash shell 中有一些特殊变量, 被称为 位置参数(positional parameter).
IT工作者
2022/07/03
2.8K0
getopts(1) builtin command
在执行 Shell 脚本时,可以像运行应用程序一样传入相应的参数,在脚本内部根据传入的参数内容执行对应的操作。
恋喵大鲤鱼
2024/09/02
1890
如何编写一个shell脚本
本文结合大量实例阐述如何编写一个shell脚本。  为什么要进行shell编程  在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。  下面,让我们一起来看看shell是如何工作的:  建立一个脚本  Linux中有好多中不同的shell,但是通常我们使用bash (bou
阳光岛主
2019/02/20
1.8K0
这样处理shell脚本参数,爽多了!
只要顺序一变,参数就对应不上了。假设你有时候不需要第二个参数,要使用第三个参数,你是不是还必须得输入第二个参数?
编程珠玑
2020/05/18
21.7K1
bash/shell 解析命令行参数工具:getopts/getopt
bash 脚本中,简单点的参数选项,我们可以直接用位置参数 $1 $2 这样来获取处理了,例如下面这段代码片段: optionParam=$1 baseHdfsPath=$2 echo $optionParam|grep -qE '^(-d|-l)$' || usage echo $baseHdfsPath|grep -qE '^/' || usage if [[ $optionParam == "-l" ]] then echo --------------------$startTime----
用户1177713
2018/02/24
11.2K0
shell脚本的参数传递一例
在shell脚本中,我们也可以像其他编程语言一样处理传递的option以及对应的值,比如: 既支持 --name=<NAME>, 也支持 --name <NAME>, 那么如何才能做到呢? 看下面的例子:
qsjs
2020/06/09
8010
Shell脚本中的while getopts用法小结
getpots是Shell命令行参数解析工具,旨在从Shell Script的命令行当中解析参数。getopts被Shell程序用来分析位置参数,option包含需要被识别的选项字符,如果这里的字符后面跟着一个冒号,表明该字符选项需要一个参数,其参数需要以空格分隔。冒号和问号不能被用作选项字符。getopts每次被调用时,它会将下一个选项字符放置到变量中,OPTARG则可以拿到参数值;如果option前面加冒号,则代表忽略错误;
洗尽了浮华
2019/10/30
9.2K0
shell小技巧–长选项参数getopt用法
在编写shell脚本时,往往需要我们传入相应的参数,来完成我们的一些目的,传入参数大体有三种方法:
dogfei
2020/07/31
10.2K1
一文掌握shell脚本的基本语法
欢迎大家star我的GitHub:https://github.com/SolerHo/geeks-shell,建议直接使用GitHub来查看排版,发现markdown有错位的情况。
阳光罗诺
2022/01/03
4.3K0
一文掌握shell脚本的基本语法
Linux Shell编程入门
如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:
用户7678152
2020/08/19
1.2K0
相关推荐
在Bash中解析命令行参数的两种样例脚本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验