1 #
# 管理员账户
$ 普通账户
在脚本中 #也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后边是注解文字,不会被执行
例如
#!/bin/bash
#this line is comments
由于这个特性,当临时不想执行某行指令时,可以在行首加上#就你可以了
如果被用在指令中,或者引号双引号扩住的话,或者在反斜线的后面,那他就变成一般的符号了,不具备上述的功能了
——————————————————————————————————-
2 ~ 账户的home目录
代表用户的home目录, cd ~ 也可以在后面加上某个用户的名称:cd ~ USERNAME,或者当成路径的一部分:~/bin
~+ 表示当前的工作目录,这个符号代表当前的工作目录,这和内嵌的指令pwd的作用是相同的
~- 表示上一次的工作目录
—————————————————————————————————–
3 ; 分号,command separator
在shell中,担任连续指令功能的符号
—————————————————————————————————–
4 ;; 连续的分号(terminator)
专用在case条件语句选项中,担任Terminator的角色
—————————————————————————————————–
5 . 点 dot
在shell中一个.代表当前目录,两个..代表上层目录
—————————————————————————————————–
6 'string' 单引号(single quote)
被单引号括住的内容,将被视为单一字符串。在引号内的代表变数$符号,没有作用,也就是说,将被视作一般符号处理,放置任何变量替换
"string"双引号(double quote)
被双引号括住的内容,将被视为单一字符串,防止通配符的扩展,但允许变量扩展 ,这点与单引号的处理方式不同
`command` 倒引号(backticks)
在前面的单引号,括住的字符串如果是命令,那么命令是不会执行的,会被当作平通字符串处理,如果要执行命令,就要使用倒引号
—————————————————————————————————–
7 , 逗号(comma)
逗号常运用在运算当中当作"区隔"用途
—————————————————————————————————–
8 / 斜线 (forward slash)
在路径表示时,代表目录
通常单一的/代表root根目录的意思,在四则运算中,代表除法符号
—————————————————————————————————–
9 \反斜线
在交互模式下的反斜线有以下几个作用。
(1)放在指令前面,有取消别名的作用
(2)放在特殊符号前面,则该特殊符号作用消失
(3)放在指令的最末端,表示指令连接下一行。
—————————————————————————————————–
10 | 管道(pipeline)
连接上个指令的标准输出,作为下个指令的标准输入。
—————————————————————————————————–
11 ! 惊叹号(negate or reverse)
通常表示反逻辑的作用,譬如,用!=表示不等于
—————————————————————————————————–
12 : 冒号
在bash中,冒号是一个内建命令:“什么事都不干”,但是返回对状态值为0。
例1
:${HOSTNAME?}${USER?}${MAIL?}
这一行的作用是,检查这些环境变量参数是否已经设置,没有设置的将会以标准错误显示错误信息。
例2
写法一
repeat()
{
while true
do
$@ && return
done
}
写法二
repeat()
{
while :
do $@ && return
done
}
第一种写法中的true是作为/bin下的一个二进制文件来实现的,这就意味这每执行一次while循环,shell就不得不生成一个进程。使用shell内建的:命令,它总是返回为0的退出码,速度比第一种块很多
除了上述之外,还有一个地方必须使用冒号,在用户自己的HOME目录下的.bash_profilehuo或者任何功能相似的档案中,设定关于PATH的场合中,我们使用冒号来作分隔
—————————————————————————————————–
13 ? 问号(wild card)
在文件名扩展上表示匹配任意一个字符,但不包含null
*星号
在文件名扩展中表示任意字符,包含null
在运算时表示乘法
—————————————————————————————————–
14 $ 钱号 (dollar sign)
变量替换的代表符号
在正则表达式中被定义为"行"的最末端
—————————————————————————————————–
15 ${} 位置变量的表达式
$*
$*引用script的执行引用变量,引用参数的算法与一般指令相同,指令本身为0,其后为1,以此类推,引用变量的代表方式如下 $0,$1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11},${12}…..
各位数的可以直接使用数字,但是两位数以上的,则必须使用{}符号括住.
$*则是代表引用变量的符号,使用时,要依据情况加上双引号,例如 echo "$*"
还有一个与$*具有相同作用的符号,但效果和处理方式有些不同 $@
$@
$@与$*具有相同作用的符号,不过两者有一个不同点。$*将所有的变量视为一个整体,但是$@则仍保留每个引用变量的区段概念
$#
$#表示引用变量的总数量是多少
$?状态值(status ariable)
一般来说,Unix like系统的进程以执行系统调用exit()来结束。这个回传值就是status值。回传给父进程,来检查子进程的执行状态。一般指令执行成功,其回传值为0;失败为1
由于进程的ID是唯一的,所以在同一时间,不可能有重复的PID。有时script会需要产生临时文件,用来存放必要的材料。而此script有可能在同一时间被使用者们使用。在这种情况下,固定文件名的写法就显得不可靠。唯有产生动态文件名,才能符合要求。符号$$或许可以符合这种要求。他代表当前shell的PID,使用它来作为文件名的一部分,可以避免在同一时间,产生相同文件名的覆盖现象
—————————————————————————————————–
16 ( )指令群组(command group)
用括号将一串指令括起来,这种用法对shell来说,成为指令群组。指令群组有一个特性,shell会以产生subshell来执行这组指令。因此,在其中所定义的变量,仅作用于指令群组本身。除了指令群组,括号也用在array变量的定义上,另外也应用在其他可能需要加上escape字符才能使用的场合,例如运算式
(( ))
这组括号的作用于了let指令类似,用在算术运算上,是bash的内建功能。所以,在执行效率上会比使用let指令块许多
{ } 大括号(Block of code)
有时候script当中会出现,大括号中间夹着一段或几段以分号作结尾的指令或变量设定。这种用法与上面介绍的指令群组非常相似,但是大括号不会在当前的shell中产生subshell
大括号也被用在"函数"功能上。广义上说,单纯只适用大括号时,作用就像是个没有指定名称的函数一般。因此,这样写script也是相当好的一件事,尤其对输入输出的重定向上,这个做法可以精简script的复杂的。
此外,大括号还有另一种用法,如下
{xx,yy,zz,…}
这种大括号的组合,常用在子串的组合上,例如
mkdir {userA,userB}-{home,bin,data}
我们得到userA-home,userA-bin,userA-data,userB-home,userB-bin,userB-data这几个目录。这组符号在适用性上相当广泛。再来看个例子
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
如果不是因为这种用法,我们得写几行重复几次呢?
[ ]中括号
常出现在流程控制中,扮演括住判断式的作用。if [ "$?" != 0 ];then echo "execute error";exit 1;fi
这个符号在正则表达式中担任类似范围的或集合的角色rm -f 200[1234]
[[ ]]
这组符号与先前的[]符号,基本上作用相同,但它允许在其中直接使用||和&&逻辑等符号
—————————————————————————————————–
17 || 逻辑符号
这个代表 or 逻辑的符号
&& 逻辑符号
这个代表 and 逻辑的符号
& 后台工作
单一个&符号,且放在完整指令列的最末端,即表示将该指令列放入后台中工作
\ 单词边界
这组符号在正则表达式中,被定义为"边界"的意思。当匹配时匹配整个单词
+ 加号plus
在运算式中,用来表示加法
在正则表达式中,用来表示匹配前面字元至少一次的意思
– 减号
在运算式中,用来表示"减法",expr 10 – 2
此外也是系统指令的选项符号,ls -la /etc/
在GNU指令中,如果单独使用 – 符号,不加任何该文件名称时,代表"标准输入"的意思。譬如,tar xpvf- 这里的 – 符号代表从标准输入读取资料
不过在 cd 指令中比较特别 cd – 这代表变更工作目录到"上一次"工作目录。
————————————————————————————
18 % 除法(Modulo)
在运算式中,用来表示除法
此外,也被用在关于变量的正则表达式当中,例如
${parameter%word}${parameter%%word}
一个%表示最短的word匹配,两个表示最长的word匹配
————————————————————————————
19 = 等号equals
常在设定变量时看到的符号
或者是PATH的设定,设置应用在运算或判断式等此类用途上
== 等号 equals
常在条件判断式中看到,代表"等于"的意思
!= 不等于
常在条件判断式中看到,代表"不等于"
^
这个符号在正则表达式中,代表行的"开头"位置,在[]中也与"!"一样表示"非"的意思
————————————————————————————
20 输入/输出重定向
> >> < << :> &> 2&> 2<>>& >&2
文件描述符(file descriptor),用一个数字(通常为0-9)来表示一个文件。常用的文件描述符如下
文件描述符 名称 常用缩写 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误输出 stderr 屏幕
我们在简单的使用 < 或 > 时,相当于使用 0< 或 1>
cmd > file
把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件
cmd >> file
把cmd命令的输出重定向到文件file中,如果file文件已经存在,则把信息追加到file中
cmd < file
使cmd命令从file中读入
cmd << text
从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用<
cmd <<< word
把word(而不是文件word)和后面的换行行为输入提供给cmd
cmd <> file
以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的
:>filename
把文件"filename"截断为0长度,如果文件不存在,就创建一个0长度文件(与'touch'的效果相同)
cmd >& n 把输出送到文件描述符n
cmd m>&n 把输出到文件描述符m的信息重定向到文件描述符n
cmd >&- 关闭标注输出
cmd
cmd m
cmd
cmd
cmd >&n- 移动输出文件描述符n而非复制它
部分摘自http://web.itivy.com/article-821-1.html
原创文章,作者:black_fish,如若转载,请注明出处:http://www.178linux.com/35067