LINUX——Bashshell资料(二)认识shell和各种变量

我的案例二:另外一个常常需要变数的咚咚是在 scripts 里面,例如我写的一个侦测登录档的小程式 logfile.sh 这个咚咚,由于里头常常需要用到『储存路径』,偏偏可能每个人的存取路径都不太一样,而如果要修改存取路径的话,嘿嘿!好几十行要同时修改呢!还可能会改错!那么我只要定义一个变数,然后后续的所有资料都使用这个变数的内容!嘿嘿!那么只要大家修改了这个变数的内容(只要一行),后续的动作就不需要修正了!这个动作常在程式或者是 script 当中看到的!

所以啰,有很多的时候为了方便或者是使用于 scripts 的意义,我们必须要设定变数!然而在 bash 底下的变数设定是有一定规则的,必须要来遵守才行:

1. 变数与变数内容以等号来连结; 

2. 等号两边不能直接接空白字元; 

3. 变数名称只能是英文字母与数字,但是数字不能是开头字元; 

4. 若有空白字元可以使用双引号『 " 』或单引号『 ' 』来将变数内容结合起来,但须要特别留意,双引号内可以保有变数,但是单引号则仅为一般字元; 

5. 必要时需要以跳脱字元『 \ 』来将特殊符号(如 Enter, $, \, 空白字元, ' 等)变成一般符号; 

6. 若该变数为扩增变数内容时,则需以双引号及 $变数名称如:『 "$PATH":/home』继续累加内容; 

7. 若该变数需要在其他子程序执行,则需要以 export 来使变数可以动作,如『export PATH』; 

8. 通常大写字元为系统预设变数,自行设定变数可以使用小写字元,方便判断(纯粹依照使用者兴趣与嗜好); 

9. 取消变数的方法为:『unset 变数名称』。 

底下我们举几个例子来说明一下: 

 

 

根据上面的案例你可以试试看!就可以了解变数的设定啰!这个是很重要的呦!请勤加练习!!

bash shell 的设定档案: alias(设定命令别名), history, !command, source, 

终于来到 bash 的设定档案啰!这部份我们预计分成『系统设定值』与『一般各人喜好设定值』来说明,除非您是 root ,并且对于大家的喜好有共同的认知,否则只要设定您的『个人设定值』(在每个人的家目录内)也就可以啰!

· 系统设定值: 

所谓的系统设定值,也就是说每个使用者进入到 bash shell 之后,会先读取的设定档案!预设的设定档案有下列几个:

o /etc/profile:这个档案设定了几个重要的变数,例如:『PATH、USER、MAIL、HOSTNAME、HISTSIZE』等等,也同时规划出 inputrc 这个档案的资料内容,你可以在这里设定总体的 PATH 等等的资讯!同时,这个 file 也规划出 /etc/profile.d 及 /etc/inputrc 这两个档案,其中, inputrc 是用在 history (历史指令)的作用上的!总之,你可以了解到刚刚我们学会的变数设定方式,在这个档案中也可以设定呢!但是设定上需要特别小心,因为所有的使用者皆会使用到这个档案的资讯。注:通常我都喜欢将 /usr/local/bin 这个路径加成最前面,这是因为通常自己安装的套件自己最喜欢,所以当然是最先收寻啰! ^_^!此外,请注意一下,可以将 HISTSIZE 的大小改变一下,改成 50 就可以啦!比较安全! 

o /etc/bashrc:这个档案在规划 umask 的功能,也同时规划出提示字元的内容(就是里头那个 PS1 啦!)。 

o /etc/man.config:这个档案或许跟 bash shell 较没相关性,但是对于系统管理员来说,却也是很重要的一个档案!这的档案的内容『规范了使用 man 的时候, man page 的路径到哪里去寻找!』所以说的简单一点,这个档案规定了下达 man 的时候,该去哪里查看资料的路径设定!那么什么时候要来修改这个档案呢?如果你是以 tarball 的方式来安装你的资料,那么你的 man page(指令说明档案)可能会放置在 /usr/local/softpackage/man 里头,那个 softpackage 是你的套件名称,这个时候你就得以手动的方式将该路径加到 /etc/man.config 里头,否则使用 man 的时候就会找不到相关的说明档啰! 

这就是系统在设定的时候常常会使用的档案!需要特别留意的是,通常设定完了这几个档案之后,都需要先 logout 在 login 之后才会将设定整个启动起来!

· 个人设定值 

那么个人的喜好设定在哪里?嘿嘿嘿嘿!那就是在个人家目录的几个隐藏档当中啰!分别会使用到底下的几个档案啦!(注意!都是隐藏档,需要使用 ls -al 方能显示出来),另外,注意一下啰!底下那个『 ~ 』代表的是『家目录』的意思!

o ~/.bash_profile:里面定义了个人化的路径(PATH)与环境变数的档案名称!你可以在这里修改你的个人路径呦!当然啰!也可以在 ~/.bashrc 这个个人设定的变数里头修改! 

o ~/.bashrc:这个档案对于个人喜好的 bash 设定来说,是最重要的啦!因为我都是在这里设定我的个人化变数!例如命令别名的设定!路径的重新定义等等,都是在这里完成的!底下我们再仔细的讨论一下如何设定命令别名吧! 

o ~/.bash_history:这个档案的用途在于将你曾经使用过的命令记录下来,而当你再次的以上下键搜寻或者直接以 history 搜寻的时候,就可以找到曾经使用过的指令啰!需要注意的是: 

1. 在这一次的执行过程中的指令,将在你离开 shell 之后才会被纪录到这个档案中,否则将只会先被写到暂存记忆体中(Cache); 

2. 可以藉由 history 这个指令来将里头的纪录搜寻出来; 

3. 这个档案的指令记录笔数,与 HISTFILE 有关,你可以自行在 ~/.bashrc 里头设定,或者直接由 root 在 /etc/profile 里面统一设定大小! 

o ~/.bash_logout:这个档案则是在『你登出 shell 的时候, BASH 会为你所做的事情!』通常预设是只有 clear 这件事情而已,不过,你也可以将一些备份或者是其他你认为重要的工作写在这个档案中(例如清空暂存档),那么当你离开 Linux 的时候,就可以解决一些烦人的事情啰! 

大致上的个人设定就是如同上面说的!不过,我个人觉得比较重要的是 ~/.bashrc 这一个档案!我喜欢将自己的相关设定写在里头!这样可以很轻易的将个人的设定写好!尤其是命令别名与变数的设定等等!底下我们先来谈一谈『命令别名』与『历史指令记录』这两个东西,然后再来谈 ~/.bashrc 这个档案的一般各人喜好设定!

·命令别名: 

命令别名是一个很有趣的东西,特别是你的惯用指令特别长的时候!还有,预防一些不小心误杀档案的情况发生的时候!举个例子来说,如果你要查询隐藏档,并且需要长的列出与一页一页翻看,那么需要下达『 ls -al | more 』这个指令,我是觉得很烦啦!要输入好几个单字!那可不可以使用 lm 来简化呢?!当然可以,你可以在命令列下面下达:

[test @tset test]# alias lm='ls -al | more'

要注意的是:『alias 的定义规则与变数定义规则几乎相同』,所以你只要在 alias 后面加上你的{『别名』='指令 参数' },以后你只要输入 lm 就相当于输入了 ls -al|more 这一串指令!很方便吧!另外,我们知道 root 可以移除( rm )任何资料!所以当你以 root 的身份在进行工作时,需要特别小心,但是总有失手的时候,那么 rm 提供了一个参数来让我们确认是否要移除该档案,那就是 -i 这个参数!所以,你可以这样做:

[test @tset test]# alias rm='rm -i'

嘿嘿!那么以后使用 rm 的时候,就不用太担心会有错误删除的情况了!这也是命令别名的优点啰!那么如何知道目前有哪些的命令别名呢?就使用 alias 呀!

[test @tset test]# alias 

alias l.='ls -d .[a-zA-Z]* --color=tty' 

alias ll='ls -l' 

alias lm='ls -al' 

alias ls='ls --color=tty' 

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

· 至于如果要取消命令别名的话,那么就使用 unalias 吧!

· 历史指令记录资料: 

前面我们提过 bash 有提供指令历史的服务!那么如何查询我们曾经下达过的指令呢?就使用 history 啰!

o history, !command 

显示历史指令记录内容, 下达历史纪录中的指令 

语法: 

 

说明: 

基本上 history 的用途很大的!但是需要小心安全的问题!尤其是 root 的历史纪录档案,这是 Cracker 的最爱!因为不小心的 root 会将很多的重要资料在执行的过程中会被纪录在 ~/.bash_history 当中,如果这个档案被解析的话.....而使用『 ! 』配合曾经使用过的指令下达是很有效率的一个指令方法!

鸟哥的常用的个人喜好设定值: 

底下是 VBird 最喜欢的设定值啰!大家可以随意的参考看看就好了! 

[test @test test]# vi .bashrc 

# .bashrc 

# User specific aliases and functions 

PATH="/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/sbin:/usr/bin:$PATH" <==常用! 

export PATH 

alias rm='rm -i' 

alias cp='cp -i' 

alias mv='mv -i' 

alias ll='ls -l' 

alias lm='ls -al|more' <==常用! 

alias h='history'<==常用! 

# Source global definitions 

if [ -f /etc/bashrc ]; then 

. /etc/bashrc 

fi 

[test @test test]# source ~/.bashrc<==將剛剛改的資料直接讀入這一次的程序當中!不需登出!

· 当然还有一些个人比较常用的变数,这里就不列出来了!那么改写完毕之后。此外,通常我们改写的这些设定,必须要登出再登入才能被启用!但是我们可以使用 source 来直接的启用他!这也是很多朋友为了因应不同的软体或者是其他的执行环境,而写了不同的环境设定档案(不一定是 .bashrc 这个档案),然后在需要的时候再以 source 来将设定读出来即可!这个指令可也是相当重要的呦!

万用字元与特殊符号 

由于在 bash 当中常会使用到一些万用字元,与搭配特殊符号来将指令做更好的利用(例如最常提到的正规表示法 Regulare Express )!底下我们列出一些常用的万用字元与特殊符号! 

 

上面的万用字元当中,最常用的就属 *, ?, [] 及 ` 了!我们提几个简单的例子:

[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 <==被 ` ` 括起來的內容『會先執行』!

上面几个例子相当的有趣!尤其是最后面两个!需要注意的是, [] 里面『代表只有一个字元』但是范围可以由 1-5 ,这样来说的话,那么我们如果允许『大写字元』就可以将档案 copy 出来的话,可以这样做: 

cp *[A-Z]* /tmp

很有趣吧?! ^_^ 

此外,那个 `` 里面的『指令』会先被执行,也就是说: 

1. 系统先执行 uname -r 找出输出的结果; 

2. 将结果累加在目录上面,来执行 cd 的功能! 

很棒吧!!这些基本的功能需要特别来了解一下才行呦!

绝对路径与相对路径 

其实,在使用 bash 还有另一个困扰,就是当你的 PATH 没有设定完整的时候,下达指令都是要以『一长列的指令连带根目录都要列出来』,呵呵那就是绝对路径的设定法啦!基本上,这个『绝对路径』与『相对路径』的观念是很重要的!否则你将常常会找不到档案说!所谓的『绝对路径』就是以根目录开始写入到档案的一种命令写定方法,举例来说,我目前在 /home/test 这个 test 使用者的家目录中,我想要看看里面的 .bashrc 这个档案的资料,使用的是 more 这个指令,而这个指令在 /bin/more 当中,则正确的下达指令的方法为: 

[test @tset test]# /bin/more .bashrc <==我在的目录为 /home/test !这是绝对路径写法!

而如果你还记得我们在 档案系统指令 那一篇文章中提到的观念的话,那么应该记得使用 ls -al 时会出现两个一定存在的目录,分别是『.』与『..』,分别代表是『这个路径』,与『上一层路径』! 

[test @tset test]# ls -al 

total 728 

drwx------3 vbirdvbird4096 May 19 14:53 . <==這一層路徑的屬性說明 

drwxr-xr-x3 root root 4096 May 5 16:50 .. <==上一層路徑的屬性說明 

以下略!

所以说,要执行上一层目录中的命令,可以下达『 cd ../command 』那个 command 指的是存在的可执行档!那么我因为在 /home/test 里面,距离 /bin 有两层上层目录,所以我要使用 /bin/more 这个执行档,并且使用相对路径的方法,就必须使用:

[test @tset test]# ../../bin/more .bashrc<==一层一层回到根目录,在进入 /bin 的写法!相对路径

这种相对路径的方法相当广泛的被运用于 script 当中,这是因为如前面提到的,每个人的安装预设的目录都不相同,则使用相对路径的话,很容易就可以找到套件之间相依软体或者是设定档案的相关性! 

 

关于路径搜寻的问题!为何不执行目前所在目录下的档案?咦!刚刚不是提到『.』与『..』吗?那么那个『 . 』是干嘛用的?!眼尖的朋友应该已经发现了,就是『我在执行档案的时候,基本上,并不会主动搜寻目前目录下的档案』举个例子来说,我安装的 squid 这个执行档在 /usr/local/squid/bin/squid 这个档案,然而我在 /usr/local/squid/bin 下达 squid 的时候,系统会告诉你『查不到这个档案!』真是见鬼了!明明有这个档案的呀!这是因为系统预设的 PATH (路径)并没有执行目前目录下的设定,也就是『.』这个路径!你可以使用『 echo $PATH 』看看,就可以知道为什么了!那么为何不要设定这个路径呢?这是因为『安全』的考量。由于系统预设是允许任何人在 /tmp 底下写入任何档案的,那么万一有居心不良的使用者或者是 Cracker 入侵你的电脑,并在你的 /tmp 里头埋了一个小木马,并取名为 ls ,好了,改天你以 root 身份登入后,到 /tmp 底下,并执行 ls ,你看会有什么结果?!这个 /tmp/ls 由其他身份的人来执行或许没有问题,但是由 root 来执行却可能会导致 Cracker 所乐意见到的结果!那晓得为何了吧?!当然啰!您还是可以选择在 ~/.bashrc 当中设定你的 . 在你的 PATH 当中,不过并不这么建议就是了!

好了,由于系统预设并不主动搜寻目前目录下的执行档,那么你应该如何执行『目前目录下的执行档』呢?很简单呀!就是以相对路径的观念,由于『 .. 』是上层,而『 . 』是这一层,所以要执行这一层目录的命令就使用『 ./command 』即可!例如你的 /usr/local/squid/bin 底下执行 squid 则可以写成: 

[test @tset bin]# ./squid  <==以相对路径的观念来看!在本目录下达的指令写法!

请特别留意这方面的问题!『新手特别容易犯这个错误呢!』
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值