Shell编程之特殊变量

本文介绍了Shell脚本中的一些特殊变量,如$0用于显示脚本文件名,$1到$9获取参数值, $#获取参数个数,*$@获取所有参数。通过实例展示了如何使用这些变量,以及在不同情况下它们的行为差异,帮助理解Shell脚本中的参数处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


1、在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量 要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量
  • $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出
  • $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10}
  • $#:获取当前shell脚本后面接的参数的个数
  • $*:获取当前脚本的参数,不加引号和$@是一样的 加了引号;例如"$*" 则表示单个字符串。相当于"$1 $2 $3"
  • $@:同样也是获取当前shell的参数,不加引号和$*是一样的,那么加了引号如:"$@" 表示将所有的参数视为不同独立的字符串,相当于"$1" "$2"..
总结:$*和$@不加双引号 是没有任何区别的,有双引号两者就有区别


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

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

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

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

  1. [root@yankerp src]# cat test.sh  #查看脚本的内容  
  2. #!/bin/bash  
  3. echo $1 $2        定义了$1 $2  
  4. [root@yankerp src]# source test.sh zhangsan lisi #在执行脚本的时候定义了两个字符串  
  5. zhangsan lisi        #说明 zhangsan赋值给了$1 lisi赋值给了$2 输出结果为 zhangsan lisi  
  6. [root@yankerp src]#  
同时也可以这样加双引号 如下:

  1. [root@yankerp src]# cat test.sh #查看脚本的内容  
  2. #!/bin/bash  
  3. echo $1 $2  
  4. [root@yankerp src]# source test.sh "zhangsan lisi" yankai #""表示一个字符串   
  5. zhangsan lisi yankai    #输出结果  
  6. [root@yankerp src]#  
2)当我们一个个的输入echo $1---15时会感觉很慢我们可以使用以下命令来接收命令传递的15个参数

  1. [root@yankerp src]# echo \${1..15}  
  2. $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15  
将输出的内容导入到test.sh文件中

  1. [root@yankerp src]# echo \${1..15} > test.sh   
  2. [root@yankerp src]# cat test.sh   
  3. $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15  
  4. [root@yankerp src]#  
我们在脚本第一行加入echo 

  1. echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15  
3)打印26个字母如下:

  1. [root@yankerp src]# echo {a..z}   
  2. 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个参数

  1. [root@yankerp src]# cat test.sh   
  2. echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 #脚本内容  
  3. [root@yankerp src]# source test.sh {a..z}   #传入26个字母  
  4. a b c d e f g h i a0 a1 a2 a3 a4 a5      #位置参数大于9后,输出的内容就不对了  
  5. [root@yankerp src]#  
当位置参数大于9时 上面已经提到了我们可以使用{}来定义如下:

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

  1. [root@yankerp src]# source test.sh {a..z}  
  2. a b c d e f g h i j k l m n o  
4)$0特殊变量实战

  1. [root@yankerp src]# cat y.sh   
  2. #!/bin/bash  
  3. echo $0  
当我们不带路径运行脚本,它会打印脚本的名称,如下:

  1. [root@yankerp src]# sh y.sh   
  2. y.sh  
当我们带绝对路径来执行脚本时,它会输出路径+脚本名

  1. [root@yankerp src]# sh /usr/local/src/y.sh   
  2. /usr/local/src/y.sh  
介绍dirname ---- basename
  1. [root@yankerp src]# dirname /usr/local/src/y.sh   
  2. /usr/local/src  
  3. [root@yankerp src]# basename /usr/local/src/y.sh   
  4. y.sh  
·dirname功能:获取脚本的路径

·basename:获取脚本的名称

例如:

  1. [root@yankerp src]# cat y.sh   
  2. #!/bin/bash  
  3. dirname $0  
  4. basename $0  
  5. [root@yankerp src]# sh /usr/local/src/y.sh   
  6. /usr/local/src  
  7. y.sh  
  8. [root@yankerp src]#  

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

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

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

  1. [root@yankerp src]# sh p.sh   
  2. 请输出正确的数值  
  3. [root@yankerp src]# sh p.sh zhangsan lisi  
  4. 输入正确  
  5. [root@yankerp src]#  
IF语句判断如下:

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

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

$* $@后续再出!!!


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

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

1、$?特殊变量实践

  1. [root@yankerp ~]# pwd  
  2. /root  
  3. [root@yankerp ~]# echo $?  
  4. 0  
  5. [root@yankerp ~]  
当我们执行每一条命令结束后,echo $? 如果它输出0那么就代表成功

  1. [root@yankerp ~]# sfkljlfsdfsdf  
  2. bash: sfkljlfsdfsdf: 未找到命令...  
  3. [root@yankerp ~]# echo $?  
  4. 127  
  5. [root@yankerp ~]#  
非0则代表失败。

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

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


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

  1. #!/bin/bash  
  2. if [ "$#" -ne "3" ]  
  3.   then  
  4.     echo "/bin/bash $0" 请输出正确字符  
  5.     exit 120    ---<如果以上不成立 并指定120值退出脚本  
  6.   else  
  7.     echo "输入正确"  
  8. fi  
运行如下:

  1. [root@yankerp ~]# sh k.sh   
  2. /bin/bash k.sh 请输出正确字符  
  3. [root@yankerp ~]# echo $?  
  4. 120  
  5. [root@yankerp ~]#   
  6. [root@yankerp ~]# sh k.sh zhangsan lisi wangwu  
  7. 输入正确  
  8. [root@yankerp ~]# echo $?  
  9. 0  
  10. [root@yankerp ~]#   


http://blog.youkuaiyun.com/qq_39591494/article/details/79206282


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值