Success is not final, failure is not fatal: it is the courage to continue that counts.
成功并非结局,失败并非毁灭:继续前进的勇气才是重点。
- Winston Churchill
1. 变量与变量内容以等号『=』来连结;
2. 等号两边不能直接接空格符;
3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;
4. 若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;
5. 必要时需要以跳脱字符『 \ 』来将特殊符号(如Enter, $, \, 空格符, '等)变成一般符号;
6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote 『 ` command` 』;
7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称如:『 "$PATH":/home』继续累加内容;
8. 若该变量需要在其它子程序执行,则需要以 export 来使变量可以动作,如『export PATH』;
9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用者兴趣与嗜好);
10. 取消变量的方法为:『unset 变量名称』。
例题:在变量的设定中,单引号与双引号有什么不同呢?
答:
单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量定义出 myname 显示 VBird its me 这个内容,要如何订定呢?
[root @test root]# name=VBird
[root @test root]# echo $name
VBird
[root @test root]# myname="$name its me"
[root @test root]# echo $myname
VBird its me
[root @test root]# myname='$name its me'
[root @test root]# echo $myname
$name its me
发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容,仅为一般字符的显示型态而已!这里必需要特别小心在意!
例题:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
答:
在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!例如 uname –r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname –r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以执行
cd /lib/modules/`uname –r`
直接到该目录下去!
# unset
就是直接将该变量的内容拿掉:
unset 变数
就是直接将该变量的内容拿掉:
unset 变数
# export
当你取得一个 bash 之后,亦即得到了一个程序了,但是若你再次的执行一次 bash ,那么你将进入『子程序』,这个程序的概念我们在资源管理章节中再详谈,这里您先有个概念即可。那么由于您已经进入了该子程序,所以在父程序中的变量设定将不再继续的存在。如您想要让该变量内容继续的在子程序中使用,那么就请执行:
export 变数
# 变量的有效范围:
由前面的 export 以及相关的说明,你可以很清楚的知道一件事情,那就是,『变量的设定只在目前这个 shell 环境当中存在,在下个或者是在子程序中 ( 子 shell ) 将不会存在!』要让变量在下个程序也可以继续的使用,大概就是使用 export 这个咚咚啦!
# read:
上面我们谈到的『变量』都是由『指令列』直接设定好的!那么可不可以随时来提供使用只以键盘随时输入变量内容?也就是说,变量内容是由使用者由键盘输入的哩!呵呵!可以使用 read 来达成喔!这个东西在『 script 』里面比较重要啦!所以我们在 shell script 里面会再次的提到喔!
语法:
[test @test test]# read name
testing <==这个时候屏幕会等待使用者由键盘输入喔!
[test @test test]# echo $name
testing <==刚刚输入的数据变成了变量的内容啦!
[test @test test]# !66 <==执行第 66 个历史指令
[test @test test]# !! <==执行上一个指令(在本例中,就是 !66 那一个指令!)
[test @test test]# !al <==执行最近一次以 al 为开头的指令内容,就是第 67 个指令啰!
万用字符与特殊符号
由于在 bash 当中常会使用到一些万用字符,与搭配特殊符号来将指令做更好的利用(例如最常提到的正规表示法 Regulare Express )!底下我们列出一些常用的万用字符与特殊符号:
符号
内容
*
万用字符,代表一个或多个字符(或数字)
?
万用字符,代表一个字母
#
批注,这个最常被使用在 script 当中,视为说明!
\
跳脱符号,将『特殊字符或万用字符』还原成一般字符
|
分隔两个管线命令的界定;
;
连续性命令的界定(注意!与管线命令并不相同)
~
使用者的家目录
$
亦即是变量之前需要加的变量取代值
&
将指令变成背景下工作
test @test test]# ls test* <==那个 * 代表后面不论接几个字符都予以接受(没有字符也接受!)
[test @test test]# ls test? <==那个 ? 代表后面『一定』要接『一个』字符
[test @test test]# ls test??? <==那个 ??? 代表『一定要接三个』字符!
[test @test test]# cp test[1-5] /tmp <==将 test1, test2, test3, test4, test5 若存在的话,就拷贝到 /tmp 下
[test @test test]# cd /lib/modules/`uname -r`/kernel/drivers <==被 ` ` 括起来的内容『会先执行』!
!
逻辑运算意义上的『非』 not 的意思!
/
路径分隔的符号
>, >>
输出导向,分别是『取代』与『累加』
'
单引号,不具有变量置换的功能
"
具有变量置换的功能!
` `
两个『 ` 』中间为可以先执行的指令!
( )
在中间为子 shell 的起始与结束
[ ]
在中间为字符的组合
{ }
在中间为命令区块的组合!
...................................................................................................
特别注意,单引号和`符号的区别,第一次就看错了。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
# 连续指令的下达方式:
这里需要再提几个重要的信息,我们刚刚上面提过说,两个指令先后写在一起,可以这样写:
command1; command2
利用分号『 ; 』来分隔,这个分号的意思,代表不论 command1 执行结果为何,command2 都会被执行!那么如果我是两个相关的指令,第一个 command1 如果执行结果有错误,第二个就不被执行,可以这样做吗?当然可以,就使用下面两个连结的咚咚:
command1 && command2
command1 || command2
还记得我们之前的变量内容中,那个 ? 代表什么吗?没错,就是代表前一个执行的指令内容有没有错误,如果有错误就回传为 1 ,没有错误就回传为 0 ,你可以经由 echo $? 来查询得知!那么 && 就是代表,当 command1 执行结果传回值为 0 的时候,也就是没有错误讯息时,则 command2 才会开始执行,而 || 恰恰相反,当 command1 有错误讯息时, command2 才会执行!举个例子来说,我的系统中并没有 /vbird 这个目录,所以执行 ls /vbird 应该会有错误讯息才对,所以,底下三个指令串会显示什么呢?
[root @test root]# ls /vbird ; ls /
[root @test root]# ls /vbird && ls /
[root @test root]# ls /vbird || ls /
......................-________________________________------
这个也是比较容易 出错的地方。
test @test test]# ls -al > list.txt
将显示的结果输出到 list.txt 档案中,若该档案以存在则予以取代!
[test @test test]# ls -al >> list.txt
将显示的结果累加到 list.txt 档案中,该档案为累加的,旧数据保留!
[test @test test]# ls -al 1> list.txt 2> list.err
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err
[test @test test]# ls -al 1> list.txt 2>&1
将显示的数据,不论正确或错误均输出到 list.txt 当中!
[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃!
注意!错误与正确档案输出到同一个档案中,则必须以上面的方法来写!
不能写成其它格式!
这里我们来说明一下命令重导向里面几个常用的符号与装置:
* < :由 < 的右边读入参数档案;
* > :将原本由屏幕输出的正确数据输出到 > 右边的 file ( 文件名称 ) 或 device ( 装置,如 printer )去;
* >> :将原本由屏幕输出的正确数据输出到 >> 右边,与 > 不同的是,该档案将不会被覆盖,而新的数据将以『增加的方式』增加到该档案的最后面;
* 2> :将原本应该由屏幕输出的错误数据输出到 2> 的右边去。
* /dev/null :可以说成是黑洞装置!
好了,那么为何要使用命令输出重导向呢?这个问题一定会困扰你一下下的,如果你从来都没有写过 script 的话!好了,我们来说一说吧!
o 当屏幕输出的信息很重要,而且我们需要将他存下来的时候;
o 背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
o 一些系统的例行命令(例如写在 /etc/crontab 中的档案)的执行结果,希望他可以存下来时;
o 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
o 错误讯息与正确讯息需要分别输出时。
本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
* 如何显示 HOME 这个环境变量?
答:
echo $HOME
如何得知目前的所有变量与环境变量的设定值?
*
答:
环境变量用 env 而所有变量用 set 即可显示 我是否可以设定一个变量名称为 3myhome ?
*
答:
不行!变量不能以数字做为开头,参考 变量设定规则 的内容 如何取消变量与命令别名的内容?
*
答:
使用 unset 及 unalias 即可
如何设定一个变量名称为 name 内容为 It’s my name ?
*
答:
name=It\’s\ my\ name 或 name=”It’s my name”
环境变量档案的加载顺序?
*
答:
先由 /etc/passwd 取得 bash 这个 shell ,再到 /etc/profile 读取主要的环境变量,同时亦会将 /etc/inputrc 及 /etc/profile.d 内容均读入。之后,再到个人的家目录读取 ~/.bash_profile 及 ~/.bashrc 等档案!
man page 的路径设定档案?
*
答:
/etc/man.config 或 /etc/man.conf 试说明 ‘, “, 与 ` 这些符号在变量定义中的用途?
*
答:
参考变量规则那一章节,其中, “ 可以具有变量的内容属性, ‘ 则仅有一般字符,至于 ` 之内则是可先被执行的指令。
跳脱符号 \ 有什么用途?
*
答:
可以用来跳脱特殊字符,例如 Enter, $ 等等,使成为一般字符! 连续命令中, ;, &&, || 有何不同?
*
答:
分号可以让两个 command 连续运作,不考虑 command1 的输出状态, && 则前一个指令必需要没有错误讯息,亦即回传值需为 0 则 command2 才会被执行, || 则与 && 相反!
如何将 last 的结果中,独立出账号,并且印出本月份曾经登入过的账号?
*
答:
last | cut –d “ “ –f
阅读(1810) | 评论(0) | 转发(0) |