bash学习

命令与文件补全功能: ([tab] 按键的好处)
还记得[tab] 这个按键吗?这个按键的功能就是在 bash 里头才有的啦!常常在 bash 环境中使用 [tab] 是个很棒的习惯喔!因为至少可以让你 1)少打很多字; 2)确定输入的数据是正确的! 使用 [tab] 按键的时机依据 [tab] 接在命令后或参数后而有所不同。我们再复习一次:
[Tab] 接在一串命令的第一个字的后面,则为命令补全;
[Tab] 接在一串命令的第二个字以后时,则为『文件补齐』!
所以说,如果我想要知道我的环境中,所有可以运行的命令有几个? 就直接在 bash 的提示字符后面连续按两次 [tab] 按键就能够显示所有的可运行命令了。 那如果想要知道系统当中所有以 c 为开头的命令呢?就按下『 c[tab][tab] 』就好啦! ^_^
是的!真的是很方便的功能,所以,有事没事,在 bash shell 底下,多按几次 [tab] 是一个不错的习惯啦!
命令别名配置功能: (alias)
假如我需要知道这个目录底下的所有文件 (包含隐藏档) 及所有的文件属性,那么我就必须要下达『 ls -al 』这样的命令串,唉!真麻烦,有没有更快的取代方式?呵呵!就使用命令别名呀!例如鸟哥最喜欢直接以 lm 这个自定义的命令来取代上面的命令,也就是说, lm 会等于 ls -al 这样的一个功能,嘿!那么要如何作呢?就使用 alias 即可!你可以在命令列输入 alias 就可以知道目前的命令别名有哪些了!也可以直接下达命令来配置别名呦:

alias lm='ls -al'

通配符: (Wildcard)
除了完整的字符串之外, bash 还支持许多的通配符来帮助用户查询与命令下达。 举例来说,想要知道 /usr/bin 底下有多少以 X 为开头的文件吗?使用:『 ls -l /usr/bin/X* 』就能够知道啰~此外,还有其他可供利用的通配符, 这些都能够加快使用者的操作呢!


变量的取用与配置:echo, 变量配置守则, unset
说的口沫横飞的,也不知道『变量』与『变量代表的内容』有啥关系? 那我们就将『变量』的『内容』拿出来给您瞧瞧好了。你可以利用 echo 这个命令来取用变量, 但是,变量在被取用时,前面必须要加上钱字号『 $ 』才行,举例来说,要知道 PATH 的内容,该如何是好?

例题:

请在屏幕上面显示出您癿环境发量 HOME与 MAIL:

答:

echo $HOME 或者是 echo ${HOME}

echo $MAIL  或者是 echo ${MAIL}

--------------------------------------------------------------------------------------------

[root@www ~]# echo $myname

       <==这里并没有任何数据~因为这个变量尚未被配置!是空的!

[root@www ~]# myname=VBird

[root@www ~]# echo $myname

VBird  <==出现了!因为这个变量已经被配置了!

双引号内癿特殊字符如 $ 等,可以保有原本癿特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
o  单引号内癿特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
如何讥我刚刚讴定癿 name=VBird 可以用在下个 shell 癿程序?

[root@www ~]# name=VBird

[root@www ~]# bash <==迚入刡所谓癿子程序

[root@www ~]# echo $name <==子程序:再次癿 echo 一下;

<==嘿嘿!幵没有刚刚讴定癿内容喔!

[root@www ~]# exit <==子程序:离开这个子程序

[root@www ~]# export name

[root@www ~]# bash <==迚入刡所谓癿子程序

[root@www ~]# echo $name <==子程序:在此执行!

VBird <==看吧!出现讴定值了!

[root@www ~]# exit <==子程序:离开这个子程序

esc下面那个/tab键上面那个````键

在挃令下达癿过程中,反单引号( ` )这个符号代表癿意义为何?

答:

在一串挃令中,在 ` 乊内癿挃令将会被先执行,而其执行出杢癿结果将做为外部癿输入信

息!例如 uname -r 会显示出目前癿核心版本,而我们癿核心版本在 /lib/modules 里面,

因此,你可以先执行 uname -r 找出核心版本,然后再以『 cd 目录』刡该目录下,当然也

可以执行如同上面范例六癿执行内容啰。



另外再丼个例子,我们也知道, locate 挃令可以列出所有癿相关档案档名,但是,如果我

想要知道各个档案癿权限呢?丼例杢说,我想要知道每个 crontab 相关档名癿权限:

[root@www ~]# ls -l `locate crontab`

如此一杢,先以 locate 将文件名数据都列出杢,再以 ls 挃令杢处理癿意思啦!瞭了吗?

^_^

查看环境变量
    环境变量可以帮我们达到很多功能~包括家目录的变换啊、提示字符的显示啊、运行文件搜寻的路径啊等等的, 还有很多很多啦!那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有多少默认的环境变量啊?我们可以利用两个命令来查阅,分别是 env 与 export 呢!
    --------------------------------------------------------------------------------------------------------------------------------------
    HOME
    代表用户的家目录。还记得我们可以使用 cd ~ 去到自己的家目录吗?或者利用 cd 就可以直接回到用户家目录了。那就是取用这个变量啦~ 有很多程序都可能会取用到这个变量的值!

    SHELL
    告知我们,目前这个环境使用的 SHELL 是哪支程序? Linux 默认使用 /bin/bash 的啦!

    HISTSIZE
    这个与『历史命令』有关,亦即是, 我们曾经下达过的命令可以被系统记录下来,而记录的『笔数』则是由这个值来配置的。

    MAIL
    当我们使用 mail 这个命令在收信时,系统会去读取的邮件信箱文件 (mailbox)。

    PATH
    就是运行文件搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。

    LANG
    这个重要!就是语系数据啰~很多信息都会用到他, 举例来说,当我们在启动某些 perl 的程序语言文件时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误喔!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系数据。 这部分我们会在下个小节做介绍的!

    RANDOM
    这个玩意儿就是『随机随机数』的变量啦!目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个文件。 我们可以透过这个随机数文件相关的变量 ($RANDOM) 来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间的数值呢?呵呵~利用 declare 宣告数值类型, 然后这样做就可以了:

?:(关于上个运行命令的回传值)

    什么?问号也是一个特殊的变量?没错!在 bash 里面这个变量可重要的很! 这个变量是:『上一个运行的命令所回传的值』, 上面这句话的重点是『上一个命令』与『回传值』两个地方。当我们运行某些命令时, 这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 0 值,如果运行过程发生错误,就会回传『错误代码』才对!一般就是以非为 0 的数值来取代。 我们以底下的例子来看看:
    [root@www ~]# echo $SHELL

    /bin/bash                                  <==可顺利显示!没有错误!

    [root@www ~]# echo $?

    0                                          <==因为没问题,所以回传值为 0

    [root@www ~]# 12name=VBird

    -bash: 12name=VBird: command not found     <==发生错误了!bash回报有问题

    [root@www ~]# echo $?

    127                                        <==因为有问题,回传错误代码(非为0)

    # 错误代码回传值依据软件而有不同,我们可以利用这个代码来搜寻错误的原因喔!

    [root@www ~]# echo $?

    0

    # 咦!怎么又变成正确了?这是因为 "?" 只与『上一个运行命令』有关,

    # 所以,我们上一个命令是运行『 echo $? 』,当然没有错误,所以是 0 没错!

read
要读取来自键盘输入的变量,就是用 read 这个命令了。这个命令最常被用在 shell script 的撰写当中, 想要跟使用者对谈?用这个命令就对了。关于 script 的写法,底下先来瞧一瞧 read 的相关语法吧!

    [root@www ~]# read [-pt] variable

    选项与参数:

    -p  :后面可以接提示字符!

    -t  :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!



    范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量

    [root@www ~]# read atest

    This is a test        <==此时光标会等待你输入!请输入左侧文字看看

    [root@www ~]# echo $atest

    This is a test          <==你刚刚输入的数据已经变成一个变量内容!



    范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容

    [root@www ~]# read -p "Please keyin your name: " -t 30 named

    Please keyin your name: VBird Tsai   <==注意看,会有提示字符喔!

    [root@www ~]# echo $named

    VBird Tsai        <==输入的数据又变成一个变量的内容了!

    read 之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行等待你的输入(如范例一)。 如果加上 -t 后面接秒数,例如上面的范例二,那么 30 秒之内没有任何动作时, 该命令就会自动略过了~如果是加上 -p ,嘿嘿!在输入的光标前就会有比较多可以用的提示字符给我们参考! 在命令的下达里面,比较美观啦! ^_^

declare / typeset

declare 或 typeset 是一样的功能,就是在『宣告变量的类型』。如果使用 
declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样啦! 那么 declare 
还有什么语法呢?看看先:


[root@www ~]# declare [-aixr] variable
选项与参数:
-a  :将后面名为 variable 的变量定义成为数组 (array) 类型
-i  :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
-x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
-r  :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset

范例一:让变量 sum 进行 100+300+50 的加总结果
[root@www ~]# sum=100+300+50
[root@www ~]# echo $sum
100+300+50  <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!
[root@www ~]# declare -i sum=100+300+50
[root@www ~]# echo $sum
450         <==瞭乎??

由于在默认的情况底下, bash 对于变量有几个基本的定义:



变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的; 
bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0; 

现在你晓得为啥你需要进行变量宣告了吧?如果需要非字符串类型的变量,那就得要进行变量的宣告才行啦! 底下继续来玩些其他的 declare 功能。


范例二:将 sum 变成环境变量
[root@www ~]# declare -x sum
[root@www ~]# export | grep sum
declare -ix sum="450"  <==果然出现了!包括有 i 与 x 的宣告!

范例三:让 sum 变成只读属性,不可更动!
[root@www ~]# declare -r sum
[root@www ~]# sum=tesgting
-bash: sum: readonly variable  <==老天爷~不能改这个变量了!

范例四:让 sum 变成非环境变量的自定义变量吧!
[root@www ~]# declare +x sum  <== 将 - 变成 + 可以进行『取消』动作
[root@www ~]# declare -p sum  <== -p 可以单独列出变量的类型
declare -ir sum="450" <== 看吧!只剩下 i, r 的类型,不具有 x 啰!

declare 也是个很有用的功能~尤其是当我们需要使用到底下的数组功能时, 他也可以帮我们宣告数组的属性喔!不过,老话一句,数组也是在 shell 
script 比较常用的啦! 比较有趣的是,如果你不小心将变量配置为『只读』,通常得要注销再登陆才能复原该变量的类型了! @_@