当前位置: 首页 > news >正文

shift 命令学习

文章目录

  • shift 命令学习
    • 1. shell 几个特殊变量
    • 2. shift 使用
      • 2.1 每次移动一个参数
      • 2.2 每次移动多个参数
      • 2.3 与 case 配合使用

shift 命令学习

参考连接:https://www.cnblogs.com/w-j-q/p/14863580.html

1. shell 几个特殊变量

#!/bin/bash
echo "\$0:$0"    # 当前脚本的文件名(间接运行时还包括绝对路径)。
echo "\$n:$n"    # 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1 。
echo "\$#:$#"    # 传递给脚本或函数的参数个数。
echo "\$*:$*"    # 传递给脚本或函数的所有参数。
echo "\$@:$@"    # 传递给脚本或函数的所有参数。被双引号 (" ") 包含时,与 $* 不同,下面将会讲到。
echo "\$?:$?"    # 上个命令的退出状态,或函数的返回值。
echo "\$$:$$"    # 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
echo "\$_:$_"    # 上一个命令的最后一个参数。
echo "\$!:$!"    # 后台运行的最后一个进程的 ID 号。

$*$@ 都表示传递给函数或脚本的所有参数,不被双引号 (“”) 包含时,都以 “$1"“ 2 " … " 2" … " 2""n” 的形式输出所有参数。但是当它们被双引号 (”“) 包含时,”$*"会将所有的参数作为一个整体,以 "$1 $2 … n " 的形式输出所有参数; " ‘ n" 的形式输出所有参数; "` n"的形式输出所有参数;"‘@`"会将各个参数分开,以 “$1”、“ 2 " 、 … 、 " 2"、…、" 2""n” 的形式输出所有参数。

  • 示例
[root@localhost myself]# sh test.sh A B B D E
$0:test.sh
$n:
$#:5
$*:A B B D E
$@:A B B D E
$?:0
$$:109424
$_:$$:109424
$!:

2. shift 使用

shift 命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理,常见于 Linux 中各种程序的启动脚本。

2.1 每次移动一个参数

  • 示例
#!/bin/bash
while [ $# != 0 ]
doecho -e "参数值为 $1, 参数个数为 $#"shift
done# 每次运行 shift(不带参数的),销毁一个参数(变量的个数($#)减一),后面的参数前移(不管参数之间相隔一个或者多个空格)。
[root@localhost myself]# sh shift1.sh a b c d e
参数值为 a, 参数个数为 5
参数值为 b, 参数个数为 4
参数值为 c, 参数个数为 3
参数值为 d, 参数个数为 2
参数值为 e, 参数个数为 1# 注意:上述脚本,如果 shift 移动参数变为 2 ,在参数个数为奇数时则会出现死循环,如果是偶数则没问题。
# 脚本示例:
#!/bin/bash
while [ $# != 0 ]
doecho -e "参数值为 $1, 参数个数为 $#"shift 2		# 这里移动位数变为2
done

2.2 每次移动多个参数

shift 命令一次移动参数的个数由其所带的参数指定。例如,现在有 $1, $2, $3, …,$9 个参数,当 shell 程序处理完前 4 个命令行参数后(即还剩下后面 5 个参数),可以使用 shift 4 命令把 $9 移到 $1。

  • 示例:自定义 shift 每次移动的参数个数。
#!/bin/bash
while [ $# -gt 5 ]
doecho -e "参数值为 $1, 参数个数为 $#"shift
done
shift 4
echo -e "参数值为 $1, 参数个数为 $#"[root@localhost myself]# sh shift2.sh a1 b2 c3 d4 e5 f6 g7 h8 i9
参数值为 a1, 参数个数为 9
参数值为 b2, 参数个数为 8
参数值为 c3, 参数个数为 7
参数值为 d4, 参数个数为 6
参数值为 i9, 参数个数为 1

2.3 与 case 配合使用

case 简介

case ..... esacif ... then ... fi 一样,都是条件判断式的语句结构,它们用倒序的字母单词和正序的单词配对,比如 if 语句,结束时用 fi 来配对, esaccase 配对

case $参数变量 in	# 以关键字 case 作为开始
"变量值1")			# 变量值用双引号括起来,关键字用小括号括起来程序段1		# 对应的逻辑;;              # 每个类别结尾使用两个连续的分号来处理
"变量值2")程序段2;;
"变量值3")程序段3;;
*)                 # 最后一个位置参数值会用*来代替所有其他值程序段4;;
esac               # 关键字 esac(case 的反写) 结束
  • 示例: shift 搭配 case ... esac 实现 shell 脚本手动传递参数处理
#!/bin/bash
while [ -n "$1" ]
docase "$1" in-a)echo "发现 -a 选项";;-b)echo "发现 -b 选项"echo "-b 选项的参数值是:$2"shift;;-c)echo "发现 -c 选项"echo "-c 选项的参数值是:$2"shift;;*)echo "$1 是一个未知选项";;esacshift
done[root@localhost myself]# sh shift3.sh -a -b 200 -c 300 -d 400
发现 -a 选项
发现 -b 选项
-b 选项的参数值是:200
发现 -c 选项
-c 选项的参数值是:300
-d 是一个未知选项
400 是一个未知选项

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库客户端自定义驱动和数据源:以 HighGo-瀚高为例子
  • 如何分析软件测试中发现的Bug!
  • 快速掌握 ==== js 正则表达式
  • Unity 资源 之 战斗魔法咒语 - 第二卷(Combat Magic Spells - Volume II)
  • 2024年最新PyCharm保姆级安装教程
  • 算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 通过手机供网、可修改WIFI_MAC的网络设备
  • 相机光学(三十)——N5-N7-N8中性灰
  • UI图标库推荐网站
  • C++继承保姆级讲解下
  • 使用嵌入式知识打造智能手环:nRF52蓝牙开发实战(C++/BLE/传感器)
  • 超声波清洗机哪家好?家用超声波眼镜清洗机推荐
  • 关于共享盘(文件夹)
  • Hi3861鸿蒙开发环境搭建
  • Java设计模式---(创建型模式)工厂、单例、建造者、原型
  • python3.6+scrapy+mysql 爬虫实战
  • Android Volley源码解析
  • Bootstrap JS插件Alert源码分析
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript的使用你知道几种?(上)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • React-Native - 收藏集 - 掘金
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 从零开始的无人驾驶 1
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 记录:CentOS7.2配置LNMP环境记录
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 力扣(LeetCode)22
  • 前端技术周刊 2019-01-14:客户端存储
  • 探索 JS 中的模块化
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信小程序实战练习(仿五洲到家微信版)
  • 无服务器化是企业 IT 架构的未来吗?
  • 一些关于Rust在2019年的思考
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 我们雇佣了一只大猴子...
  • ​​​​​​​​​​​​​​Γ函数
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Apache SeaTunnel 究竟是什么?
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 数据结构
  • #{}和${}的区别是什么 -- java面试
  • #Linux(make工具和makefile文件以及makefile语法)
  • (1) caustics\
  • (52)只出现一次的数字III
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (补)B+树一些思想
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)PySpark3:SparkSQL编程
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (每日一问)基础知识:堆与栈的区别
  • (三十)Flask之wtforms库【剖析源码上篇】