认识与学习BASH
一、认识bash这个shell
(一)bash shell 的功能
1、history指令
默认的命令记忆功能为1000条命令。本次登录过程中使用的命令保存在内存中,之前登录的命令保存在“~/bash_history”。可以通过上下箭头来查找历史功能
问题:当电脑被入侵,黑客可以查询曾经的操作,而记录中有对系统的操作(比如输入过MySQL的密码),那么还是很危险的。所以记录的历史命令操作有多少,就是见仁见智了。
2、tab命令补全
tab接在一串命令的第一个不完整单词的后面,则是补全命令
tab接在一串命令的第二个不完整的单词后面,是补全文件名
举例:某文件夹下只有一个以test开头的文件:test123,那么输入“more tes”再按tab,可以补全;
但是如果某个文件夹有,有文件test1,test2,那么输入“more test”后,无反应。
“** tab tab”是列出所有以**开头的指令操作,仅对于指令,不针对文件
3、别名配置
alias [ˈeɪliəs]:别名
直接输入alias可以查看当前使用别名情况
或者可以通过alias进行别名设置:
以后想查看进程信息,输入“lm”即可
4、通配符
当想要查询某个文件夹下以X开头的文件有哪些时,使用:ls -l /usr/bin/X*
注意文件结构,否则容易找不到被提示没有该目录。
(二)bash shell的内建命令:type
通过type这个命令,我们可以知道哪些是内置命令,哪些是后来外部添加上的。内置命令一般保存在root下的bin目录下,而外部命令需要输入命令“type -p 外部命令name ”。(注意:-p 如果后面接的name为外部命令时,才会显示完整文件名)
type对于大工程管理意义重大,比如给多个电脑搭建同样的平台,如果配置的员工不熟悉老电脑,就要靠这个命令来找可执行文件的位置,保证配置统一。
二、Shell变量
(一)变量的取用与配置:echo, 变量配置守则, unset
1、变量的配置守则
1)等号两边不能直接出现空格符,如果在等号右边赋值时需要使用空格,则要加单引号或者双引号 。
myname=VBird Tsai是错误的;需要加上单引号或者双引号。
等号右边有空格的时候,必须要加单引号或者双引号,如果没有空格,即使有特殊字符,也可以直接赋值,且会显示变量内容,如上图。(目前接触到的,“特殊字符”是指“$”,但是跳脱字符“\”,在单引号和双引号中,都能保持活性,举例如图)
2)双引号内的特殊字符,可以保持原来的特性;单引号内,全部视为纯文本
第二行的错误,是因为没有加“$”符号,所以打印出了变量名
3)跳脱字符“\”
可以使比如“\”“enter”这种具有特殊含义的符号,转化为正常符号
4)在命令中引用变量,可以使用$符号或者反单引号
扩展:带变量的数学运算
范例六:如何进入到您目前核心的模块目录? [root@www ~]# cd /lib/modules/`uname -r`/kernel上面的范例其实执行了两步,第一步是进行反单引号的内容,得到内核版本为2.6.18-128.el5,第二步试讲上述的结果带入到原命令。
5)扩增内容时,也可用$
path="$PATH":/home/bin
6)通常大写字符为系统默认变量,自行设置的变量使用小写字符,方便判断
7)取消变量
8)如果其他程序中需要使用变量,则要把变量变为环境变量
export val_name
范例一:配置一变量 name ,且内容为 VBird [root@www ~]# 12name=VBird -bash: 12name=VBird: command not found <==屏幕会显示错误!因为不能以数字开头! [root@www ~]# name = VBird <==还是错误!因为有空白! [root@www ~]# name=VBird <==OK 的啦! 范例二:承上题,若变量内容为 VBird's name 呢,就是变量内容含有特殊符号时: [root@www ~]# name=VBird's name # 单引号与双引号必须要成对,在上面的配置中仅有一个单引号,因此当你按下 enter 后, # 你还可以继续输入变量内容。这与我们所需要的功能不同,失败啦! # 记得,失败后要复原请按下 [ctrl]-c 结束! [root@www ~]# name="VBird's name" <==OK 的啦! # 命令是由左边向右找→,先遇到的引号先有用,因此如上所示,单引号会失效! [root@www ~]# name='VBird's name' <==失败的啦! # 因为前两个单引号已成对,后面就多了一个不成对的单引号了!因此也就失败了! [root@www ~]# name=VBird\'s\ name <==OK 的啦! # 利用反斜杠 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦! 范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录 [root@www ~]# PATH=$PATH:/home/dmtsai/bin [root@www ~]# PATH="$PATH":/home/dmtsai/bin [root@www ~]# PATH=${PATH}:/home/dmtsai/bin # 上面这三种格式在 PATH 里头的配置都是 OK 的!但是底下的例子就不见得啰! 范例四:承范例三,我要将 name 的内容多出 "yes" 呢? [root@www ~]# name=$nameyes # 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量! # 呵呵!我们可没有配置过 nameyes 这个变量吶!所以,应该是底下这样才对! [root@www ~]# name="$name"yes [root@www ~]# name=${name}yes <==以此例较佳! 范例五:如何让我刚刚配置的 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 <==子程序:离开这个子程序
范例一:配置一变量 name ,且内容为 VBird [root@www ~]# 12name=VBird -bash: 12name=VBird: command not found <==屏幕会显示错误!因为不能以数字开头! [root@www ~]# name = VBird <==还是错误!因为有空白! [root@www ~]# name=VBird <==OK 的啦! 范例二:承上题,若变量内容为 VBird's name 呢,就是变量内容含有特殊符号时: [root@www ~]# name=VBird's name # 单引号与双引号必须要成对,在上面的配置中仅有一个单引号,因此当你按下 enter 后, # 你还可以继续输入变量内容。这与我们所需要的功能不同,失败啦! # 记得,失败后要复原请按下 [ctrl]-c 结束! [root@www ~]# name="VBird's name" <==OK 的啦! # 命令是由左边向右找→,先遇到的引号先有用,因此如上所示,单引号会失效! [root@www ~]# name='VBird's name' <==失败的啦! # 因为前两个单引号已成对,后面就多了一个不成对的单引号了!因此也就失败了! [root@www ~]# name=VBird\'s\ name <==OK 的啦! # 利用反斜杠 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦! 范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录 [root@www ~]# PATH=$PATH:/home/dmtsai/bin [root@www ~]# PATH="$PATH":/home/dmtsai/bin [root@www ~]# PATH=${PATH}:/home/dmtsai/bin # 上面这三种格式在 PATH 里头的配置都是 OK 的!但是底下的例子就不见得啰! 范例四:承范例三,我要将 name 的内容多出 "yes" 呢? [root@www ~]# name=$nameyes # 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量! # 呵呵!我们可没有配置过 nameyes 这个变量吶!所以,应该是底下这样才对! [root@www ~]# name="$name"yes [root@www ~]# name=${name}yes <==以此例较佳! 范例五:如何让我刚刚配置的 name=VBird 可以用在下个 shell 的程序? [root@www ~]# name=VBird [root@www ~]# bash <==进入到所谓的子程序 [root@www ~]#