bash相关

shell
shell是一个翻译器,shell将命令转为CPU可执行的二进制代码,然后CPU把执行后的结果传给shell,shell有很多种,在linux中默认使用的shell是hash。
shell有很多内置的命令,如常用的cd,ls等
type命令可以查看一个命令是不是shell内嵌的命令:type cd
在Linux输入命令的时候,在同一行可以输入多个命令,之间用;隔开
一个命令太长的时候可以用\回车另起一行输入,这样做可以防止一个命令单词被分成两行,影响阅读


变量
定义一个变量名,可以由字母、数字、下划线组成,但不能以数字开始
给一个变量赋值的时候:变量名=可取值,等号的两边不能出现空格,如果可取值中含有空格的时候,用""引起来
查看一个变量的值命令:echo $变量名
查看当前shell的进程:echo $$
取消一个变量:unset 变量名

本地变量
在终端中:xx=10,意思是定义了一个变量名叫xx的变量,并赋值为10,这种变量是本地变量,这个变量只是在当前的shell有效,不会影响到子shell

环境变量
在终端中:export yy=20,定义了一个环境变量,承上,如果此时#export xx,则把上一段中的xx由本地变量转为环境变量了,环境变量会影响到所有的子shell
查看变量命令:set可以显示所有的变量,env显示环境变量,export也可以显示环境变量,或者export -p,这三者都能显示环境变量
declare也可以用来定义环境变量:declare -x zz=80,定义一个环境变量zz,赋值为80,declare +x zz则是把zz定义为本地变量

位置变量
$1 $2 $3 $4,分别表示第1个参数、第2个参数、第3个参数、第4个参数,而$0表示的是这个文件的名字,$#表示参数的个数,$*表示所有的参数
在位置参数显示中,如命令:
#set 1 2 3 4 5 6 7 8 9 a b c d
#echo $10
得到的结果是10,而不是想象中的a,这是因为在解析命令#echo $10的时候,先执行$1得到第1个参数1,然后直接显示1和0了,就是10,正确的方法是:#echo ${10},这样就可以得到第10个参数a了

在切换用户的时候,变量HOME,USER会被赋值
终端提示符的变量是PS1,断行的提示符的变量是PS2

locale -a可以查看系统支付的编码,其变量是LANG

变量键盘读取、数组与声明

read xx
等待输入:5
则xx被赋值为5
如果read后面没有跟任何变量,则默认赋值给变量REPLY
echo在显示变量的时候会自动换行,如果不想换行可以加入选项-n,如:echo -n $xx,则输出5不换行

array
定义一个数组:xx=(aa bb cc dd)
则:echo ${xx[0]}会得到aa,数组的下标从0开始
echo ${xx[*]}或者echo ${xx[@]}得到该数组的所有内容aa bb cc dd
echo ${!xx[@]}查看所有的下标,得到0 1 2 3
echo ${#xx[@]}查看这个数组一共有多少个元素,得到4

declare
如果定义一个变量,希望该变量的值不再随意改动:declare -r a=5,a的值不能改动了,readonly bb,也能定义一个只读变量,如果一个变量被定义为只读变量的时候,是不能被取消的,即不能unset a或者unset b
如果输入一个命令:x=,那么x虽然没有被赋值即空值null,但它已经是一个变量了

如果一个变量出现在双引号" "里面的时候,这个变量可以正常被解析,如:
#xx=10
#echo "$xx"
得到10
如果一个变量出现在单引号' '里面的时候,这个变量不会被解析,如:
#xx=10
#echo '$xx'
得到$xx
引用一个变量,更规范的方法是echo ${xx},如下面一个例子:
#yy=book
#echo "I want to buy ten $yys"
这个命令的本意是想显示I want to buy ten books但实际上显示的是I want to buy ten,因为shell在解析的时候,把$后面接着的yys当成一个变量了,因为没有定义过yys这个变量,就会得到这样的结果,如果这样操作:
#yy=book
#echo "I want to buy ten ${yy}s"
得到I want to buy ten books
如果一个命令被嵌套在另外一个命令中,使用反引号将其引起来,则该命令可以被执行,如:
我们知道hostname这个命令是显示当前主机的网络名称,如果hostname是www.vbird.com
#echo "My hostname is `hostname`"
得到My hostname is www.vbird.com
因为"My hostname is `hostname`"中第一个hostname这个命令是在嵌套在整个命令echo中的,没有加上反引号,则不会被执行,就会正常的显示为hostname is,而第二个hostname被单引号引起来了,就会执行hostmane这个命令,得到www.vbird.com,于是这整个命令得到:My hostname is www.vbird.com

ulimit对用户使用系统的一些限制
#ulimit -f 20480,这个命令就是进制用户创建超过20M以上的文件,这里的数据大小单位是K

变量内容的删除、替代和替换
删除
有如下的例子:
[root@YiYe ~]# xx=abc123abcd1234abcde12345
[root@YiYe ~]# echo $xx
abc123abcd1234abcde12345
[root@YiYe ~]# r=${xx#*123}
[root@YiYe ~]# echo $r
abcd1234abcde12345
#的意思是删除第一个匹配到*123位置之前(包括该位置)的内容,匹配的顺序是从前往后

[root@YiYe ~]# r=${xx##*123}
[root@YiYe ~]# echo $r
45
##的意思是删除最后一个匹配到*123位置之前(包括该位置)的内容,匹配的顺序是从前往后

[root@YiYe ~]# r=${xx%123*}
[root@YiYe ~]# echo $r
abc123abcd1234abcde
%的意思是删除第一个匹配到123*位置之后(包括该位置)的内容,匹配的顺序是从后往前

[root@YiYe ~]# r=${xx%%123*}
[root@YiYe ~]# echo $r
abc
%%的意思是删除最后一个匹配到123*位置之后(包括该位置)的内容,匹配的顺序是从后往前

替换
-的作用,如果xx是一个存在的变量,将其值赋予给r,否则将后面内容赋值给r
有如下命令:
[root@zctvm ~]# r=${xx-"xx doesn't exist"} #这句命令的意思是判断xx这个变量是否存在,如果存在将其值赋予给变量r,如果不存在变量xx,那么将xx doesn't exist赋值给r
[root@zctvm ~]# echo $r
xx doesn't exist #因为xx是没有被定义的变量,即不存在变量xx,显然r的值是xx doesn't exist
[root@zctvm ~]# xx= #定义一个变量xx,其值为空
[root@zctvm ~]# r=${xx-"xx doesn't exist"}
[root@zctvm ~]# echo $r
#此处显示为空白 #因为xx是存在的变量,所以r得到xx的值,即空,所以显示的也是空
[root@zctvm ~]# xx="xx does exist"
[root@zctvm ~]# r=${xx-"xx doesn't exist"}
[root@zctvm ~]# echo $r
xx does exist

:-的作用,如果xx是一个不为空的值,将其值赋予给r,否则将后面内容赋值给r
有如下命令:
[root@zctvm ~]# xx= #定义一个变量xx,其值为空即null
[root@zctvm ~]# r=${xx:-"xx doesn't or is null"} #这句命令的意思是判断xx这个变量是否存在且不为空,如果存在且不为空将其值赋予给变量r,否则将xx doesn't or is null赋值给r
[root@zctvm ~]# echo $r
xx doesn't or is null
[root@zctvm ~]# xx="xx exists and isn't null"
[root@zctvm ~]# r=${xx:-"xxx doesn't or is null"}
[root@zctvm ~]# echo $r
xx exists and isn't null

:+的作用,如果xx是一个不为空的值,将其值赋予给r,否则不对r进行赋值
有如下命令:
[root@zctvm ~]# xx=
[root@zctvm ~]# r=${xx:+"xx doesn't or is null"}
[root@zctvm ~]# echo $r
#此处显示为空白
[root@zctvm ~]# unset xx
[root@zctvm ~]# r=${xx:+"xx doesn't or is null"}
[root@zctvm ~]# echo $r
#此处显示为空白


:=的作用,如果xx是一个不为空的值,则将其值赋予给r,否则将后面内容赋值给r和xx
有如下命令:
[root@zctvm ~]# unset xx
[root@zctvm ~]# r=${xx:="xx didn't exist ro null just now,but now xx get value which this sentence itself"}#这句命令的意思是判断如果xx不存在或者为空,则将等号后面的内容赋予给xx和r
[root@zctvm ~]# echo $r
xx didn't exist ro null just now,but now xx get value which this sentence itself
[root@zctvm ~]# echo $xx
xx didn't exist ro null just now,but now xx get value which this sentence itself
[root@zctvm ~]# clear
[root@zctvm ~]# xx="xx exists and isn't null"
[root@zctvm ~]# r=${xx:="xx didn't exist ro null just now,but now xx get value which this sentence itself"}
[root@zctvm ~]# echo $xx
xx exists and isn't null
[root@zctvm ~]# echo $r
xx exists and isn't null#如果xx存在且值不为空,那么将xx的值赋予给r

:?的作用,如果xx是不存在或者为空值,则显示冒号:后面的警告信息,如果xx为非空值,则将其值赋予给r
有如下命令:
[root@zctvm ~]# unset xx r
[root@zctvm ~]# r=${xx:?"Warning:xx didn't exist ro is null"}
-bash: xx: Warning:xx didn't exist ro is null
[root@zctvm ~]# echo $xx
#此处显示为空白
[root@zctvm ~]# echo $r
#此处显示为空白
[root@zctvm ~]# xx="xx exists and isn't null"
[root@zctvm ~]# r=${xx:?"Warning:xx didn't exist ro is null"}
[root@zctvm ~]# echo $xx
xx exists and isn't null
[root@zctvm ~]# echo $r
xx exists and isn't null

命令的别名和历史命令
命令的别名:
例如一个命令比较长,想用一个简单的命令来代替这命令,如查看网卡信息命令:ifconfig eth0,想为此命令取一个别名:alias aa="ifconfig eth0",以后输入命令aa等同于输入命令ifconfig eth0。取消一个别名的命令:unalias aa,查看系统中的命令别名:alias。
历史命令
命令:history可以查看最近输入过的1000个命令,!数字n可以再一次执行序号为n的那条命令,这里的1000是有变量HISTFILESIZE决定的,最这个变量进行修改可以改变保存命令的条数。清除历史命令:history -c。

bash shell的操作环境
路径与命令查找顺序 type -a 命令名,可显示该命令的执行顺序
字符界面登录前的欢迎语句是在/etc/issue
字符界面登录后的欢迎语句是在/etc/motd
/etc/issue.net是用户通过telnet登录系统所显示的欢迎界面
bash的环境配置文件
login-shell和nologin-shell,顾名思义,登录用的shell和不需要登录用的shell
当在登录一个shell,系统查看一下文件对shell相关环境进行配置,即login-shell的
/etc/profile文件配置了整个环境的变量,当登录一个shell的时候,所有的环境变量通过这个文件得到自己的值
/etc/inputrc文件配置了在使用shell常用的快捷键
/etc/profile.d文件配置了别名
配置完以上文件后,上面配置的都是全局变量,影响到所有的用户,之后系统进入用户家目录,以下的配置都是对用户本身进行配置,不影响别的用户
进入家目录后根据~/.bash_profile文件进行配置

终端机的环境设置
set
set -u这个命令的作用是在以后使用一个变量的时候,如果这个变量没有被定义,则经行提醒
[root@Yeer ~]# set -u
[root@Yeer ~]# unset aa
[root@Yeer ~]# echo $aa
-bash: aa: unbound variable
set +u即关闭上述功能
set -x跟踪系统执行的每一个命令,一般在写脚本进行排错的时候会用到此功能,关闭此功能即set +x

通配符
一对[ ]匹配一个字符
如[a-z]就是匹配26个字母中的一个,[a\-z]表示匹配a、-、z这三者中的一个
如现在想找一些文件,满足该文件第一个字符是字母,第二个是数字,第三个没有要求,第四个不能是数字的所有mp3文件
[a-z][0-9]?[!0-9]这里的!也可用^代替
实例:
[root@Yeer test]# ls
1y7u9.mp3 78899.mp3 a6t80.mp3 a7ytxxx.mp3
[root@Yeer test]# ls [a-z][0-9]?[!0-9]*.mp3
a7ytxxx.mp3

数据流重定向
正常在终端中,命令的输入是等待键盘输入的,完成一个命令后要显示一些信息是显示到屏幕上的,现在想改变这种情况,比如,执行cal命令,将其得到的信息保存到一个文件中去
输出重定向
[root@Yeer test]# cal > xx
[root@Yeer test]# cat xx
三月 2016
日 一 二 三 四 五 六
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
注意上面的文件xx之前是不存在的,通过这个命令先创建了这个文件,然后将cal得到的信息存入到xx中,加入xx是存在的,该命令会先清空xx文件中的内容在保存cal命令得到的信息,如果不想覆盖以前的内容:cal >> xx
注意 > >> 这两个重定向只能重定向正确的命令,如果错误的命令想重定向,可以使用 2> 2>> ,要注意的是这两个命令只能重定向错误的命令,而不能重定向正确的命令,如果不管是正确的还是错误的命令都想重定向,可以使用命令&>即可。
如若想将正确的命令如cal重定向xx文件中:cal 2> xx 1>2&,同理错误的命令想导入到xx文件中:xxxxxx > xx 2>1&
输入重定向
先介绍一个命令tr转变字符命令
[root@Yeer test]# tr [a-z] [A-Z] < hosts
127.0.0.1 LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST4 LOCALHOST4.LOCALDOMAIN4
::1 LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST6 LOCALHOST6.LOCALDOMAIN6
将hosts文件中的小写转成大写
有如下命令:cat > xxx <<EOF
等待向xxx文件中输入内容,直到遇到输入EOF结束输入(这里的EOF必须是单独输入的),这里支持变量输入
[root@Yeer test]# aa="支持变量输入"
[root@Yeer test]# cat > xxx <<EOF
> $aa
> kajsdkfljakls
> 23412431243124
> adfas1241243
> aasf23EOF
> EOF
[root@Yeer test]# cat xxx
支持变量输入
kajsdkfljakls
23412431243124
adfas1241243
aasf23EOF

posted @ 2016-03-01 22:58  YiYezc  阅读(266)  评论(0编辑  收藏  举报