鸟哥私房菜学习笔记六 Bash
来源:互联网 发布:安捷伦数据采集仪 编辑:程序博客网 时间:2024/05/24 06:04
1、vi /etc/shells
可以看到我们的linux系统支持几个shells呢
2、为啥使用上下键就能够看到以前输入过的shell命令呢
这些命令都记录在当前用户目录下的~/.bash_history 文件下面
3、如何控制linux程序呢,鸟哥说job control forground 以及background
但是只说了个CTRL+c来停掉某个程序
我们知道如果想让一个程序一开始就在后台运行,比如这个python程序,这样就会进入后台运行
python helloworld.py& 最命令结尾输入&即可
4、影响bash环境操作的变量
例如
PATH
HOME
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 atestThis is a test <==此时光标会等待你输入!请输入左侧文字看看[root@www ~]# echo $atestThis is a test <==你刚刚输入的数据已经变成一个变量内容!范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容[root@www ~]# read -p "Please keyin your name: " -t 30 namedPlease keyin your name: VBird Tsai <==注意看,会有提示字符喔![root@www ~]# echo $namedVBird 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 $usernameroot <==因为 username 没有配置,所以主动给予名为 root 的内容。[root@www ~]# username="vbird tsai" <==主动配置 username 的内容[root@www ~]# username=${username-root}[root@www ~]# echo $usernamevbird tsai <==因为 username 已经配置了,所以使用旧有的配置而不以 root 取代
new_var=${old_var-content} 新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的new_var=${old_var-content} 这是本范例中的关键词部分!必须要存在的哩!new_var=${old_var-content} 旧的变量,被测试的项目!new_var=${old_var-content} 变量的『内容』,在本范例中,这个部分是在『给予未配置变量的内容』
new_var=${old_var-content} 新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的new_var=${old_var-content} 这是本范例中的关键词部分!必须要存在的哩!new_var=${old_var-content} 旧的变量,被测试的项目!new_var=${old_var-content} 变量的『内容』,在本范例中,这个部分是在『给予未配置变量的内容』
- 鸟哥私房菜学习笔记六 Bash
- 学习鸟哥私房菜(六)之 认识与学习bash
- 鸟哥的私房菜:Bash shell(六)-管道命令
- 鸟哥的 Linux 私房菜第11章-认识与学习 BASH 学习笔记
- Linux鸟哥私房菜学习笔记_第十一章 学习和认识BASH
- 鸟哥的Linux私房菜笔记6------11章认识和学习bash
- 鸟哥的私房菜学习笔记 重要的Bash Shell的操作环境
- 【鸟哥的linux私房菜-学习笔记】Bash shell的变量功能及操作环境
- 【鸟哥的linux私房菜-学习笔记】Bash shell之数据流重导向
- 【鸟哥的linux私房菜-学习笔记】Bash shell之管线命令
- 鸟哥的linux私房菜学习笔记《二十》bash简介
- 鸟哥的linux私房菜学习笔记《二十二》bash shell的操作环境
- 鸟哥的私房菜Linux 学习笔记之 Bash语法
- 鸟哥的 Linux 私房菜 -- 学习 bash shell
- 鸟哥的 Linux 私房菜 -- 学习 bash shell
- 鸟哥的 Linux 私房菜 -- 学习 bash shell
- 鸟哥私房菜---认识与学习bash
- 鸟哥的Linux私房菜-----10、学习Bash
- linux shell进行文件去重
- [笔记]利用归并排序计算逆序数的个数
- POJ 1321 棋盘问题
- 事务处理
- php接口测试 curl实现GET/POST
- 鸟哥私房菜学习笔记六 Bash
- 逆序对 (归并排序)
- html5开发之viewport使用
- MySQL连接之C语言API
- ORA-12705: Cannot access NLS data files or invalid environment specified
- 将Android项目打包成APK文件
- Largest Rectangle in Histogram
- 【BMI指数计算器V4.0】项目实战
- Java进阶(九)正则表达式