侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Shell编程之特殊变量的笔记小结

技术  /  管理员 发布于 7年前   204

$0 $# $n-->$[1..9] $* $@

1、在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量

  1. $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出
  2. $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10}
  3. $#:获取当前shell脚本后面接的参数的个数
  4. $*:获取当前脚本的参数,不加引号和$@是一样的 加了引号;例如"$*" 则表示单个字符串。相当于"$1 $2 $3"
  5. $@:同样也是获取当前shell的参数,不加引号和$*是一样的,那么加了引号如:"$@" 表示将所有的参数视为不同独立的字符串,相当于"$1" "$2"..

总结:$*和$@不加双引号 是没有任何区别的,有双引号两者就有区别

1)$1 $2 特殊变量实战

[root@yankerp src]# cat test.sh #查看脚本的内容 #!/bin/bash echo $1   ---<定义了$1 [root@yankerp src]# source test.sh yankai #执行的脚本的时候将yankai赋值给脚本中的1 yankai         #输出yankai [root@yankerp src]# 

例2:

[root@yankerp src]# cat test.sh #脚本内容 #!/bin/bash echo $1 [root@yankerp src]# source test.sh zhangsan lisi #zhansgan lisi是两个字符串以空格分割 zhangsan      #只输出了zhangsan,因为脚本中只定义了$1 [root@yankerp src]#  

例3:

[root@yankerp src]# cat test.sh #查看脚本的内容 #!/bin/bash echo $1 [root@yankerp src]# source test.sh "zhangsan lisi" #加双引号表示一个字符串参数 zhangsan lisi    #最后输出结果为zhangsan lisi [root@yankerp src]# 

例4:在脚本中添加$1 $2测试:

[root@yankerp src]# cat test.sh #查看脚本的内容 #!/bin/bash echo $1 $2    定义了$1 $2 [root@yankerp src]# source test.sh zhangsan lisi #在执行脚本的时候定义了两个字符串 zhangsan lisi    #说明 zhangsan赋值给了$1 lisi赋值给了$2 输出结果为 zhangsan lisi [root@yankerp src]# 

同时也可以这样加双引号 如下:

[root@yankerp src]# cat test.sh #查看脚本的内容 #!/bin/bash echo $1 $2 [root@yankerp src]# source test.sh "zhangsan lisi" yankai #""表示一个字符串  zhangsan lisi yankai  #输出结果 [root@yankerp src]# 

2)当我们一个个的输入echo $1---15时会感觉很慢我们可以使用以下命令来接收命令传递的15个参数

[root@yankerp src]# echo \${1..15} $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 

将输出的内容导入到test.sh文件中

[root@yankerp src]# echo \${1..15} > test.sh  [root@yankerp src]# cat test.sh  $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@yankerp src]# 

我们在脚本第一行加入echo

echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 

3)打印26个字母如下:

[root@yankerp src]# echo {a..z}  a b c d e f g h i j k l m n o p q r s t u v w x y z 

传入26个字母a-z 作为26个参数

[root@yankerp src]# cat test.sh  echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 #脚本内容 [root@yankerp src]# source test.sh {a..z}  #传入26个字母 a b c d e f g h i a0 a1 a2 a3 a4 a5   #位置参数大于9后,输出的内容就不对了 [root@yankerp src]# 

当位置参数大于9时 上面已经提到了我们可以使用{}来定义如下:

[root@yankerp src]# cat test.sh  echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} 

再次・执行

[root@yankerp src]# source test.sh {a..z} a b c d e f g h i j k l m n o 

4)$0特殊变量实战

[root@yankerp src]# cat y.sh  #!/bin/bash echo $0 

当我们不带路径运行脚本,它会打印脚本的名称,如下:

[root@yankerp src]# sh y.sh  y.sh 

当我们带绝对路径来执行脚本时,它会输出路径+脚本名

[root@yankerp src]# sh /usr/local/src/y.sh  /usr/local/src/y.sh 

介绍dirname ---- basename

[root@yankerp src]# dirname /usr/local/src/y.sh  /usr/local/src [root@yankerp src]# basename /usr/local/src/y.sh  y.sh 

・dirname功能:获取脚本的路径
・basename:获取脚本的名称

例如:

[root@yankerp src]# cat y.sh  #!/bin/bash dirname $0 basename $0 [root@yankerp src]# sh /usr/local/src/y.sh  /usr/local/src y.sh [root@yankerp src]# 

5)$#特殊变量获取传参个数实践

[root@yankerp src]# cat test.sh  echo $1 $2 $3 $4 $5 $6 $7 $8 $9  < 9个位置参数变量 echo $#  <----加入$# [root@yankerp src]# source test.sh {a..z}  <传入26个字符 a b c d e f g h i  -----<只接收9个变量 26 ----<传入26个字符。因此这里显示26 [root@yankerp src]# 

实例1:条件表达式判断语句如下:

#!/bin/bash [ $# -ne "2" ] && {    #如果用户输入的传参个数不等于2  echo "请输出正确的数值" #那么输出此信息  exit 1         #随后退出脚本 } echo "输入正确"      #如果输入的传参个数是2 那么就输出此信息 

运行脚本如下:

[root@yankerp src]# sh p.sh  请输出正确的数值 [root@yankerp src]# sh p.sh zhangsan lisi 输入正确 [root@yankerp src]# 

IF语句判断如下:

#!/bin/bash if [ $# -ne "2" ]   -------如果输入的传参个数不是2  then         ------那么    echo "/usr/local/src/ $0 请输入正确的值"  --输出一个/usr/local---路径加$0 $0表示输出运行脚本的名称  else    echo "输入正确" fi 

执行如下:

[root@yankerp src]# sh p.sh  /usr/local/src/ p.sh 请输入正确的值 [root@yankerp src]# sh p.sh zhangsan lisi 输入正确 [root@yankerp src]# 

$* $@后续再出!!!

二、shell进程中特殊状态变量

$?    $$(不常用)   $!(不常用)    $_(不常用)$$ 和 $!都是获取脚本进程号PID,但是有所不同这里不在演示

1、$?特殊变量实践

[root@yankerp ~]# pwd /root [root@yankerp ~]# echo $? 0 [root@yankerp ~] 

当我们执行每一条命令结束后,echo $? 如果它输出0那么就代表成功

[root@yankerp ~]# sfkljlfsdfsdf bash: sfkljlfsdfsdf: 未找到命令... [root@yankerp ~]# echo $? 127 [root@yankerp ~]# 

非0则代表失败。

案例:安装Apache判断是否安装成功

[root@yankerp ~]#yum install httpd -y

案例2:通过脚本控制命令及脚本执行返回值

#!/bin/bash if [ "$#" -ne "3" ]  then   echo "/bin/bash $0" 请输出正确字符   exit 120  ---<如果以上不成立 并指定120值退出脚本  else   echo "输入正确" fi 

运行如下:

[root@yankerp ~]# sh k.sh  /bin/bash k.sh 请输出正确字符 [root@yankerp ~]# echo $? 120 [root@yankerp ~]#  [root@yankerp ~]# sh k.sh zhangsan lisi wangwu 输入正确 [root@yankerp ~]# echo $? 0 [root@yankerp ~]#  

声明:以上文章是<<跟着老男孩学Linux运维Shell编程实战>>第四章看完的总结;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    详解Shell编程之变量数值计算(一)
    下一条:
    shell编程实现学生成绩管理系统
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客