shift 命令学习

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 ]
do
    echo -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 ]
do
    echo -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 ]
do
    echo -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" ]
do
  case "$1" in
    -a)
        echo "发现 -a 选项"
        ;;
    -b)
        echo "发现 -b 选项"
        echo "-b 选项的参数值是:$2"
        shift
        ;;
    -c)
        echo "发现 -c 选项"
        echo "-c 选项的参数值是:$2"
        shift
        ;;
    *)
        echo "$1 是一个未知选项"
        ;;
  esac
  shift
done

[root@localhost myself]# sh shift3.sh -a -b 200 -c 300 -d 400
发现 -a 选项
发现 -b 选项
-b 选项的参数值是:200
发现 -c 选项
-c 选项的参数值是:300
-d 是一个未知选项
400 是一个未知选项

相关推荐

  1. shift 命令学习

    2024-07-12 04:50:06       25 阅读
  2. swift学习小结

    2024-07-12 04:50:06       39 阅读
  3. swift语言学习总结

    2024-07-12 04:50:06       24 阅读
  4. IOS-闭包学习-Swift

    2024-07-12 04:50:06       60 阅读
  5. Swift学习笔记第三节:Set类型

    2024-07-12 04:50:06       43 阅读
  6. Swift学习笔记第二节:数组类型

    2024-07-12 04:50:06       50 阅读
  7. SWIFT介绍和学习(简单入门级别)

    2024-07-12 04:50:06       37 阅读
  8. 机器学习(四十九):Mean-Shift 聚类

    2024-07-12 04:50:06       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 04:50:06       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 04:50:06       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 04:50:06       57 阅读
  4. Python语言-面向对象

    2024-07-12 04:50:06       68 阅读

热门阅读

  1. FPGA(1)--什么是布局与布线

    2024-07-12 04:50:06       25 阅读
  2. Django ORM中的F 对象

    2024-07-12 04:50:06       22 阅读
  3. 产线工控安全怎么做

    2024-07-12 04:50:06       22 阅读
  4. Python爬虫并输出

    2024-07-12 04:50:06       22 阅读
  5. html5和css3入门知识点概括

    2024-07-12 04:50:06       24 阅读
  6. 使用 Audio Toolbox 的 Audio Services 播放 AAC

    2024-07-12 04:50:06       22 阅读
  7. 力扣2434.使用机器人打印字典序最小的字符串

    2024-07-12 04:50:06       27 阅读
  8. IT专业入门,高考假期预习指南

    2024-07-12 04:50:06       18 阅读
  9. 简谈设计模式之设计原则

    2024-07-12 04:50:06       28 阅读