特殊变量

Linux 同时被 2 个专栏收录
120 篇文章 0 订阅

$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 特殊变量实战

 

[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编程实战>>第四章看完的总结;
再见~~~


 

 

展开阅读全文
  • 1
    点赞
  • 7
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值