linux下的大同小异

做为运维人员,经常使用linux的都知道,在linux下面,很多命令、关键字,看起来长的很像,但实际应用起来就能够发现有时候还是有区别的,当然不仔细的人或许你是永远也不会明白,到底什么时候该使什么招。今天做为菜鸟的我,就给大家简单的分享几个,不全之处,希望大家留言指出,本博主随时更新,以方便大家紧急查阅。

菜鸟的发现:    
       一、$vra_name与"$var_name"
       二、"$*"与"[email protected]"
       三、[  ]与[[  ]]

一、$vra_name与"$var_name"
大多数情况下,$vra_name与"$var_name"没什么区别,但是就因如此,所以我们写脚本的时候,经常会遇到一些另人费解的报错,很多人就感觉我写的没错啊,语法没错,命令拼写也没有问题,就不知道究竟错在哪里。殊不知就是这个引号让你绞尽脑汁,如果你能看到我这个小菜鸟的博文,或许你也彻底明白并记住它了。
接下来,我们用一个简短的示例演示一下
[[email protected] test]# cat test.sh  展示测试环境
#!/bin/bash

#Author:wangjun
#Version:1.0
#Create time:2016-08-14 21:07:38
#Description:

if [ $1 = start ];then   这脚本咋一看,相当简单,语法、拼写各方面也都没问题吧
  echo start
elif [ $1 = stop ];then   好的,接下来,就让我们带上参数来亲测一下
  echo stop
elif [ $1 = restart ];then
  echo restart
else
  echo "Unknown parameter"
fi
[[email protected] test]# test.sh start  带上正确的参数一点问题也没有
start
[[email protected] test]# test.sh rest
Unknown parameter
[[email protected] test]# test.sh   可为什么没带参数,就报了一大串的错误了,没带参数,不也是属于else分支吗
./test.sh: line 8: [: =: unary operator expected
./test.sh: line 10: [: =: unary operator expected
./test.sh: line 12: [: =: unary operator expected
Unknown parameter
[[email protected] test]#

仔细看看,前三个判断的分支都报错了,错误提示大概意思是期待一元表达式,那我们就要思考一下,接下来,我们给$1包上一个引号再来看看

[[email protected] test]# vim test.sh
[[email protected] test]# cat test.sh
#!/bin/bash

#Author:wangjun
#Version:1.0
#Create time:2016-08-14 21:07:38
#Description:

if [ "$1" = start ];then
  echo start
elif [ "$1" = stop ];then
  echo stop
elif [ "$1" = restart ];then
  echo restart
else
  echo "Unknown parameter"
fi
[[email protected] test]# test.sh stop
stop
[[email protected] test]# test.sh restart
restart
[[email protected] test]# test.sh hello    
Unknown parameter
[[email protected] test]# test.sh    头痛的问题消失了,即使不带参数,也不会报错,正常走到了else分支
Unknown parameter
[[email protected] test]#

这回应该能够明白这个大多数情况都一样的$vra_name与"$var_name"之间一个引号的威力了吧。所以小菜还是建议大家养成一个良好的编程习惯,不惯它俩大多数情况是不是效果等同,我们不要去偷那个懒,只要是引用变量的时候,我们就把那个该死的引号给带上不就得了。免得头痛了还不知何故。

二、"$*"与"[email protected]"
接下来我们就再来一个也和这个引号有一点关系的"$*"与"[email protected]",写过脚本的都知道,脚本里面涉及到了位置变量,$*与[email protected]都表示变量列表,可谁知道用小菜建议的以不变应万变的规律这回就掉大了。

测试环境:
[[email protected] test]# cat script1.sh   测试环境展示("$var-name")
#!/bin/bash

#Author:wangjun
#Version:1.0
#Create time:2016-08-14 15:18:57
#Description:

script2.sh "$*"        特殊变量(参数列表)加引号调用的
echo ==============================
script2.sh "[email protected]"        特殊变量(参数列表)加引号调用的
[[email protected] test]# cat script2.sh
#!/bin/bash

#Author:wangjun
#Version:1.0
#Create time:2016-08-14 15:12:52
#Description:

echo "The first parameter is:$1"
echo "The second parameter is:$2"
echo "The third parameter is:$3"
echo "All parameters is:[email protected]"

[[email protected] test]# script1.sh a ab abc  $*和[email protected]用引号时的执行效果
The first parameter is:a ab abc
The second parameter is:    "$*"表示的是把整个列表当成一个参数$1
The third parameter is:     所以$2和$3都为空值
All parameters is:a ab abc
==============================
The first parameter is:a
The second parameter is:ab     "[email protected]"表示的还是分散的整个列表
The third parameter is:abc     所以$2和$3都能正常得到赋值
All parameters is:a ab abc
[[email protected] test]#
正常加了引号,这回也掉大了,两个都是表示参数列表的变量,调用的同样参数还有区别了,仔细查阅相关资料,终于发现$*和[email protected]确实是双胞胎,但它们还是有区别的:
"$*"(用双引号时): 传递给脚本的所有参数,全部参数合为一个字符串
"[email protected]"(用双引号时): 传递给脚本的所有参数,每个参数为独立字符串

接下来我们看一下不用引号时的示例:
[[email protected] test]# cat script1.sh   测试环境展示($var-name不用引号)
#!/bin/bash

#Author:wangjun
#Version:1.0
#Create time:2016-08-14 15:18:57
#Description:

script2.sh $*
echo ==============================
script2.sh [email protected]
[[email protected] test]# cat script2.sh
#!/bin/bash

#Author:wangjun
#Version:1.0
#Create time:2016-08-14 15:12:52
#Description:

echo "The first parameter is:$1"
echo "The second parameter is:$2"
echo "The third parameter is:$3"
echo "All parameters is:[email protected]"

[[email protected] test]# script1.sh a ab abc  $*和[email protected]不用引号时的执行效果
The first parameter is:a
The second parameter is:ab    因为$*和[email protected]不用引号时,两个表示的都是分散的整个列表
The third parameter is:abc   所以$2和$3都能正常得到赋值
All parameters is:a ab abc
==============================
The first parameter is:a
The second parameter is:ab
The third parameter is:abc
All parameters is:a ab abc
[[email protected] test]#

$*和[email protected]不用引号时:两个表示的都是分散的整个列表(也即每个参数都是独立的字符串),能看得出来,这次没用引号反而还不会出岔子。所以只能得出一个结论,任何事务都不是绝对的,一定是有前提或环境的。当然对于我们使用linux系统的运维人员来说,这些知识你是必须掌握的,否则出了这些情况你真会抓狂的。

三、[  ]与[[  ]]
大多数情况下,[  ]与[[  ]]也都差不多,那么今天小菜再你来看一幅伤脑筋的画卷
[[email protected] test]# A=good
[[email protected] test]# echo $A
good
[[email protected] test]# [ -n $A ] && echo "A is nonespace" || echo "A is space" 
A is nonespace                 测试字符串是否非空,没加引号调用变量,也没报错

[[email protected] test]# [ -z $A ] && echo "A is space" || echo "A is nonespace" 
A is nonespace                  走运了(这是属于大多数情况之列的)

[[email protected] test]# [ $A =~ go ] && echo "Matching" || echo "Not matching"  
-bash: [: =~: binary operator expected    再来一个用右边的模式去匹配左边,错误报告来了

Not matching
[[email protected] test]# [ "$A" =~ go ] && echo "Matching" || echo "Not matching" 
-bash: [: =~: binary operator expected    使法宝——加一个引号,结果失效了

Not matching
[[email protected] test]# [[ "$A" =~ go ]] && echo "Matching" || echo "Not matching" 
Matching                           双中括号的大救星从天而降,妖怪终于压到了五指山下

[[email protected] test]# [[ $A =~ god ]] && echo "Matching" || echo "Not matching"  
Not matching            此时发现摘掉它的紧箍咒——双引号,它也无力翻身

[[email protected] test]# [[ $A =~ go ]] && echo "Matching" || echo "Not matching"
Matching
[[email protected] test]#

通过这一次的测试我们又可以发现,[  ]与[[  ]]也是孪生兄弟,但有时候它们的性格也还是有点小区别的,所以我们在用的时候,同样需要把好关了。
好的,今天的分享也就至此为此,不全之处,希望读者及时留言补充。

时间: 2024-10-14 06:08:24

linux下的大同小异的相关文章

Linux下FFMPEG--H264--编码&&解码的C实现与相关原理详解

FFMPEG是很强大的一套视频音频处理库,不过,强大的功能一般免不了复杂的实现,或者更加现实地说,"麻烦"的部署和使用流程 关于"FFMPEG怎么部署"这事就放在另一篇文章啦,下面入正题.. 编码encoder模块和解码decoder模块都有init初始化方法和资源free方法 init初始化方法主要是进行ffmpeg所必需的编解码器的初始化和部分功能方法的参数配置,而free资源释放方法则是相应地进行必要的回收 Encoder模块的实现和细节分析 #include

Linux下修改ssh端口和禁止root远程登录

我们都知道,ssh默认端口号是22,要更改端口号为9688,需要编辑/etc/ssh/ssh_config和/etc/ssh/sshd_config两个文件即可: 禁止root远程登录,则需要编辑/etc/ssh/sshd_config.(可能部分Linux目录为/etc/sshd,请根据实际情况修改) 操作步骤如下: 1.编辑/etc/ssh/ssh_config文件: [root[email protected] ~]# cat /etc/ssh/ssh_config |grep Port

Linux下配置Tomcat,及JDK

Redhat Linux安装JDK 1.7 本篇主要介绍在Redhat Linux(Red Hat Enterprise Linux Server release 5.7 (Tikanga))系统上安装JDK 1.7,其它Linux平台安装也大同小异,可能略有差别. 步骤1:下载JDK 1.7 安装包 JDK 1.7 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 在

Docker折腾手记-linux下安装

Docker折腾手记-linux下安装 Linux下的安装方法 博主用的是centos7,其它也是大同小异 我根据的是官网的教程进行的操作,地址是 https://docs.docker.com/engine/installation/linux/centos/#install-using-the-repository 刚开始他们balabala了一大堆,要注意的就是在x64的centos才可以安装docker 官方提供了两种方式一种是使用存儲库进行安装 ,一种是从包中进行安装 ,两种方式都可以

linux下一个网卡配置多个ip【虚拟ip】

Linux下配置网卡ip别名何谓ip别名? 用windows的话说,就是为一个网卡配置多个ip. 什么场合增加ip别名能派上用场? 布网需要.多ip访问测试.特定软件对多ip的需要...and so on. 下面通过几个例子简单介绍一下如何使用ifconfig命令给网卡配置ip别名. 一.首先为服务器网卡配置静态ip地址 #ifconfig eth0 192.168.6.99 netmask 255.255.255.0 up eth0                     //机器的第一个网卡

DHCP服务介绍及Linux下DHCP服务的管理配置

1. DHCP服务简介 DHCP是Dynamic Host Configuration Protocol,动态主机配置协议,是用来在物理网络给主机分配ip地址的一种方式,区别于bootp,一次分配终身使用的缺点. DHCP提出的租约的概念,使得可以根据需要动态确定主机需要的IP地址,并且IP地址可以循环使用. 2. DHCP结构 DHCP是典型的C/S结构,需要服务端启动守护进程来保证来自client段的请求能被响应,DHCP的工作原理如下: 可以通过DORA来记忆: Client: DHCP

linux下mysql常用命令

转自:http://www.jb51.net/LINUXjishu/36171.html 一.总结一下: 1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令: mysqladmin restart /ect/init.d/mysql restart (前面为mysql的安装路径) 3.linux下关闭mysql的命令: mysqladmin shutdown

64位linux下安装ps模拟器ePSxe

早就想在爱机上玩ps游戏,特别是彩京的1945一代和非常经典的实况足球2002版.在ubuntu64位下可以通过wine模拟的方式运行windows版的ePSxe,但是总觉得差些呢?非原生啊!网上搜了一下,ePSxe也有linux版本,从官网上 epsxe官网(www.epsxe.com/)下载了linux通用bin文件,于是折腾从此开始. 这个绿色的ePSxe版本里很多东西没有,比如没有bios和各种插件,更要命的是64位的linux缺少32位的库,如果是32位的linux直接就可以运行了.而

Linux下的AT&T语法(即GNU as 汇编语法)入门

http://blogold.chinaunix.net/u3/105209/showart_2085748.html 学习这么长时间,一直在C语言这一层面上钻研和打拼,日积月累,很多关于C的疑惑在书本和资料中都难以找到答案.程序员是追求完美的一个种群,其头 脑中哪怕是存在一点点的思维黑洞都会让其坐卧不宁.不久前在itput论坛上偶得<Computer Systems A Programmer's Perspective>(以下称CS.APP)这本经典好书,遂连夜拜读以求解惑.虽说书中没有能正