单引号) :
由单引号括起来的字符只能作为普通字符出现,不具有任何命令效应,因此特殊字符由单引号括起来后,也会失去原有的意义。
双引号) :
双引号不同于单引号,部分特殊字符被双引号括起来后任然具有其原有的特性,比如我们最常用的$字符,还有双引号同样也是。
反引号) :
执行的时候,shell首先执行被反引号括起来的部分,然后将执行的结果替换反引号括起来的部分。
例子:
str=“Hello, world!”
echo "the string str is :$str" #------the string str is :Hello,world!
echo 'the string str is :$str' #------the string str is:$str
str1="Current directory is `pwd`"
echo $str1 #------Current directory is /home/peng/scripts
shell中的括号 也是很有特色的,有大括号、中括号、小括号、双小括号等,不同的括号用在不同的场合发挥不同的功效。
大括号) :
通常在我们写变量的时候,会用到$var,但是当在其后紧接着字符时,这样就造成了不便,因此可以加上大括号,${var}指示变量var的原型。
例如:var=“Hello,world!”
echo "output string is $varname"
这个时候输出就会出现错误,因为机器根本找不到varname这个变量。
所以可以将第二句改为:echo “output string is${var}name” 就ok了。
大括号还有功用就是大括号扩展。举个例子:比如我要在/etc/test1/test2/test3目录下建立file1、file2、file3三个文件
#touch /etc/test1/test2/test3/file{1,2,3}
这样就行了,免去了很多的麻烦。
中括号) :
中括号一般用在判断语句中,用于数值的判断、字符的比较、文件的判断等。(注意[]左右有强制性的空格要求)
例如: [ -f “filename”] && echo "the filename is exist!"
还有用于数值计算: var=5
var=$[var-1]
输出为4,在这里[]不用像test命令那样有强制性的“空格”要求!
上面的例子说的是:首先判断是否存在filename为名字的文件,若存在,则打印出echo后面的字符,前半句就用到了中括号的功能。需要注意的是:用于判断的时候,前后两个中括号空出一格。
小括号) :
小括号的功用比较庞杂。它可以用于一串命令的执行。例如:
(var="Hello,world";echo $var)
注意到,命令之间用分号隔开
涉及到小括号的几种替换结构:${var:-string}/${var:=string}/${var:+string}/${var:?string}
将上述四组分为两个部分介绍吧,第一个部分是${var:-string}/${var:=string}。
${var:-string} #表示若var为空时,则用字符串stirng的值来代替${var:-string},若var不为空,则${var:-string}的值为var
${var:=string} #和上面有区别的地方就是,若var为空时,除了替代外,还将string的值赋给var变量。这种方法的一个常用的用法是,判断某个变量是否被赋值,若没有,给它一个默认值。
第二部分是${var:+string}/${var:?string}。
${var:+string} #与第一部分相反,只有当var不为空的时候才实施替换,若为空的时候不替换
${var:?string} #若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
需要注意的是:上述四种替换表达式中的string不一定是字符串变量,还可以是命令型的变量。例如:${var:=$(date)}/${var:=`date`}
双小括号) :
格式为:$((exp))。主要是用于数值的计算。
/********************************************************************************************************************************************************************************/
**********************************************************************************************************************************************************************************/
设置环境变量,
export myname='piao hailin!'
#打印
echo ${myname} # 推荐,更精确
echo $myname
#卸载
unset myname
二 截断字符串
basename 参数 #找到结束的文件或目录
dirname 参数 #与basename相反,得到他"前面"的部分
三 命令替换
创建一个包含可执行命令结果的环境变量
使用命令替换可以将任何命令或命令管道放在` ` 或 $( ) 之间
四 字符穿截取
export mystring='foaafoddfobbfoccfoddfoee.tar.gz'
# 从最后一个fo开始截取
echo ${mystring##*fo}
ee.tar.gz
# 从第一个fo开始截取
echo ${mystring#*fo}
aafoddfobbfoccfoddfoee.tar.gz
# 从后往前,第一个匹配的
echo ${mystring%.*}
foaafoddfobbfoccfoddfoee.tar
# 从后往前,最后一个匹配
echo ${mystring%%.*}
foaafoddfobbfoccfoddfoee
# 按照索引截取
echo ${mystring:0:1}
f
五 接收自变量
第0个表示命令名称
$# 表示变量的个数
$@ 一次引用所有命令行自变量
例:
$0
$1
...
$15
$#
六 shell算术
使用 shell 结构来执行简单的整数运算。只需将特定的算术表达式用 "$((" 和 "))" 括起.
$ echo$((100 / 3 )) 双小括号用在if中有: if ((100/3));then .....
33
$ myvar="56"
$ echo $(( $myvar + 12 ))
68
$ echo $(( $myvar - $myvar ))
0 $ myvar=$(( $myvar + 1 ))
$ echo $myvar
57
七 函数
可以将函数(如上面的函数)
放在 ~/.bashrc 或
~/.bash_profile中,
以便在 bash 中随时使用它们。
.bash_profile修改后要重启
八 名称空间
变量前加local关键字
这样在方法外部,变量就会失效
否则默认的变量是全局的
九 相关操作
运算符 描述 示例
文件比较运算符
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1-eq num2 等于 [ 3 -eq $mynum ]
num1-ne num2 不等于 [ 3 -ne $mynum ]
num1-lt num2 小于 [ 3 -lt $mynum ]
num1-le num2 小于或等于 [ 3 -le $mynum ]
num1-gt num2 大于 [ 3 -gt $mynum ]
num1-ge num2 大于或等于 [ 3 -ge $mynum ]
/********************************************************************************************************************************************************************************/
**********************************************************************************************************************************************************************************/
hello=" aaa bbbb cccc dddd"
echo hello
echo "hello"
echo 'hello'
echo $hello
echo "$hello"
echo '$hello'
echo ${hello}
echo "${hello}"
echo '${hello}'
运行该脚本结果如下:
hello
hello
hello
aaa bbbb cccc dddd可以看出直接使用$调用变量,字符串中间的空格会被置换掉,字符串之间只保留一个空格
aaa bbbb cccc dddd使用双引号引用的变量输出字符串完全按照字符串变量定义时的样子输出
$hello使用单引号引用的变量不进行变量替换,之间单引号间的内容看做一个简单的字符串
aaa bbbb cccc dddd
aaa bbbb cccc dddd
${hello}$后变量名是否使用{} 对输出结果无影响