您的位置:首页 > 运维架构 > Shell

鸟哥私房菜学习笔记六 Bash

2015-07-31 18:22 489 查看
1、vi /etc/shells

可以看到我们的linux系统支持几个shells呢

/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 默认的 shell)
/bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
/bin/tcsh (整合 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)
/bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)

2、为啥使用上下键就能够看到以前输入过的shell命令呢

这些命令都记录在当前用户目录下的~/.bash_history 文件下面

3、如何控制linux程序呢,鸟哥说job control forground 以及background

但是只说了个CTRL+c来停掉某个程序

我们知道如果想让一个程序一开始就在后台运行,比如这个python程序,这样就会进入后台运行

python helloworld.py&   最命令结尾输入&即可

4、影响bash环境操作的变量

例如

PATH

HOME

MAIL

SHELL

环境变量通常以大写字符表示

想要获取到当前环境变量的值就能够通过:

echo $HOME

echo $MAIL

 5、变量的配置守则

变量与变量内容以一个等号『=』来连结,如下所示: 

『myname=VBird』

等号两边不能直接接空格符,如下所示为错误: 

『myname = VBird』或『myname=VBird Tsai』

变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 

『2myname=VBird』

变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:

『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:

『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』

可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:

『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:

『PATH="$PATH":/home/bin』

若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:

『export PATH』

通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:

『unset myname』

范例一:配置一变量 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        <==子程序:离开这个子程序


范例六:如何进入到您目前核心的模块目录?
[root@www ~]# cd /lib/modules/`uname -r`/kernel
[root@www ~]# cd /lib/modules/$(uname -r)/kernel

每个 Linux 都能够拥有多个核心版本,且几乎 distribution 的核心版本都不相同。以 CentOS 5.3 (未升级前) 为例,他的默认核心版本是 2.6.18-128.el5 ,所以核心模块目录在 /lib/modules/2.6.18-128.el5/kernel/ 内。 也由于每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个命令先取得版本信息。所以啰,就可以透过上面命令当中的内含命令 `uname -r` 先取得版本输出到 cd ... 那个命令当中,就能够顺利的进入目前核心的驱动程序所放置的目录啰!很方便吧!

6、环境变量的功能

如果你想查看你当前设置了多少个环境变量的话可以用

exp

env来实现(environment的缩写)

虽然export也能列出来所有的环境变量,但是export还有其他的功能

主要的环境变量介绍

HOME:代表用户的家目录,cd $HOME

SHELL:可以告诉我们当前系统使用的shell是哪个版本,默认情况下使用的是/bin/bash

HISTSIZE:上面讲过~/.bash_history 对吧,这个histsize就是我们曾经下达过的命令被系统记录下来能够记录的笔数,记录的数量就是由这个值设置

MAIL:使用mail这个命令收信的时候,系统会读取的邮件信箱文件mailbox

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

LANG:编码,是语系的数据,很多信息都会用到  BIG5,UTF8够清楚了吧

RANDOM:随机随机数的变量,我们可以透过这个随机数文件相关的变量RANDOM来随机取得随机数的值。这个RANDOM变量的内容介意0~32767之间,所以在执行echo ¥$RANDOM时,系统就会主动的随机去除一个介于0~32767之间的数值

7、如果想观察所有变量,比如环境变量,bash操作接口有关的变量以及用户自己定义的变量,那就用set吧

一个很无聊的功能:为啥从文字里面感觉鸟哥很喜欢

PS1:(提示字符的配置)

这是 PS1 (数字的 1 不是英文字母),这个东西就是我们的『命令提示字符』喔!
当我们每次按下 [Enter] 按键去运行某个命令后,最后要再次出现提示字符时, 就会主动去读取这个变量值了。上头 PS1 内显示的是一些特殊符号,这些特殊符号可以显示不同的信息, 每个 distributions 的 bash 默认的 PS1 变量内容可能有些许的差异,不要紧,『习惯你自己的习惯』就好了。 你可以用 man bash (注3)去查询一下
PS1 的相关说明,以理解底下的一些符号意义。

\d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
\H :完整的主机名。举例来说,鸟哥的练习机为『www.vbird.tsai』
\h :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
\t :显示时间,为 24 小时格式的『HH:MM:SS』
\T :显示时间,为 12 小时格式的『HH:MM:SS』
\A :显示时间,为 24 小时格式的『HH:MM』
\@ :显示时间,为 12 小时格式的『am/pm』样式
\u :目前使用者的账号名称,如『root』;
\v :BASH 的版本信息,如鸟哥的测试主板本为 3.2.25(1),仅取『3.2』显示
\w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
\W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
\# :下达的第几个命令。
\$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~

好了,让我们来看看 CentOS 默认的 PS1 内容吧:『[\u@\h \W]\$ 』,现在你知道那些反斜杠后的数据意义了吧? 要注意喔!那个反斜杠后的数据为 PS1 的特殊功能,与 bash 的变量配置没关系啦!不要搞混了喔! 那你现在知道为何你的命令提示字符是:『 [root@www ~]# 』了吧? 好了,那么假设我想要有类似底下的提示字符:

[root@www /home/dmtsai 16:50 #12]#
那个 # 代表第 12 次下达的命令。那么应该如何配置 PS1 呢?可以这样啊:
[root@www ~ ]# cd /home
[root@www home]# PS1='[\u@\h \w \A #\#]\$ '
[root@www /home 17:02 #85]#
# 看到了吗?提示字符变了!变的很有趣吧!其中,那个 #85 比较有趣,
# 如果您再随便输入几次 ls 后,该数字就会添加喔!为啥?上面有说明滴!


$这个东西也是个变量,echo一下毛也没有,echo $$输出了此时运行的SHELL的PID

?这个东西据说也是个变量,重要得很

这个变量是:『上一个运行的命令所回传的值』,
上面这句话的重点是『上一个命令』与『回传值』两个地方。当我们运行某些命令时, 这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 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 没错!


我好像懂了

8、讲讲临时环境变量吧

export能够将自定义的变量转换成环境变量

理清了一些概念哈:

bash也是个程序,在你登陆linux之后你就会取得一个独立的bash程序,他又自己的PID,之后你所有的命令都是这个bash程序的子程序。



那么问题来了,为啥环境变量能够被子程序所接受,因为子程序会继承且仅继承父程序的环境变量,子程序不会继承父程序的自定义变量,而export命令能够将自定义的变量内容留给子程序中使用

export 变量名

9、影响显示结果的语系变量locale -a可以查看所有的支持的编码

10、变量的有效范围

环境变量 = 全局变脸

自定义变量 = 局部变量

11、输入变量

[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        <==输入的数据又变成一个变量的内容了!

12、宣告
declare和typeset一样,输出变量的类型

[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 $sum100+300+50
<==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊![root@www
~]# declare -i sum=100+300+50[root@www
~]# echo $sum450
<==瞭乎??

在bash下变量的默认类型是字符串

bash下只能有整数

所以declare用来告诉计算机我要定义的变量是什么类型的,除非你想定义字符串类型的变量

var[index]=content

13、变量内容的删除、取代和替换

测试一个变量是否存在

范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root
[root@www ~]# echo $username
<==由于出现空白,所以 username 可能不存在,也可能是空字符串
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
root       <==因为 username 没有配置,所以主动给予名为 root 的内容。
[root@www ~]# username="vbird tsai" <==主动配置 username 的内容
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
vbird tsai <==因为 username 已经配置了,所以使用旧有的配置而不以 root 取代

new_var=${old_var-content}
新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的

new_var=${old_var-content}
这是本范例中的关键词部分!必须要存在的哩!

new_var=${old_var-content}
旧的变量,被测试的项目!

new_var=${old_var-content}
变量的『内容』,在本范例中,这个部分是在『给予未配置变量的内容』

/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 默认的 shell)
/bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
/bin/tcsh (整合 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)
/bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)

new_var=${old_var-content}
新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的

new_var=${old_var-content}
这是本范例中的关键词部分!必须要存在的哩!

new_var=${old_var-content}
旧的变量,被测试的项目!

new_var=${old_var-content}
变量的『内容』,在本范例中,这个部分是在『给予未配置变量的内容』

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: