十六、Shell-bash

linux下的bash很多,常用的有bash,ksh等,本节我们来了解下bash的基础内容,主要内容如下:
一、变量的声明,显示
二、三种引号的区别
三、登陆的欢迎信息
四、Bash的环境配置文件
五、终端热键
六、通配符
七、stdin、stdout、stderr
八、命令执行顺序(&&、||、;)
九、bash命令(tee、|、tr、col、join、paste、expand、split、xargs)

一、变量的声明,显示

定义变量,可采用变量=变量值的方式,但这种方式定义的变量只在当前shell生效,在子程序中无效;如果想父程序定义的变量在子程序也有效,可采用变量=变量值;export 变量的方式,例子如下:

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
#1.定义变量name,该变量只能在当前的shell生效,在子程序中无效
weblogic@ETS157:~> name="china"
weblogic@ETS157:~> echo $name
china
weblogic@ETS157:~> echo $$
26050
weblogic@ETS157:~> bash         '进入子程序
weblogic@ETS157:~> echo $$      '
输出子程序id
26151
weblogic@ETS157:~> echo $name   '父程序定义的name变量,在子程序中无效

weblogic@ETS157:~> exit         '
返回父程序
exit
weblogic@ETS157:~> echo $$
26050


#2.定义变量name,并声明为全局变量,在子程序中亦有效
weblogic@ETS157:~> name="china" ; export name
weblogic@ETS157:~> echo $name
china
weblogic@ETS157:~> bash
weblogic@ETS157:~> echo $$
26193
weblogic@ETS157:~> echo $name   '在子程序中输出name变量
china

二、三种引号的区别

  • 单引号(’ ‘):被其括起来的字符均当做普通字符处理
  • 双引号(” “):被其括起来的字符可输出变量内容,其他均当成普通字符
  • 反引号(` `):被其括起来的字符输出系统命令执行结果

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
ETS157:~ # variable="abc"

#1.""括起来的字符,输出变量内容
ETS157:~ # echo "this is a $variable"
this is a abc

#2."括起来的字符,均当成普通字符输出
ETS157:~ # echo 'this is a $variable, `pwd`'
this is a $variable, `pwd`

#3.``括起来的字符,可以输出系统命令的执行结果
ETS157:~ # echo `pwd`
/root

三、登陆的欢迎信息

常用的登陆信息在/etc/issue、/etc/issue.net、/etc/motd三个文件中定义,区别如下:

/etc/issue的内容是登陆之前显示,也就是字符界面login输入用户名的前面几行显示的内容,默认是linux发布版名字和Kernel \r on an \m。

/etc/issue.net:这个是提供给telnet进程登录程序用的。当我们使用 telnet 连接到主机时,,主机的登入画面就会显示/etc/issue.net,而不是/etc/issue的内容

/etc/motd是在你成功登陆后,显示的一些信息,该文件默认是空白

1
2
3
4
#/etc/issue内容如下:
weblogic@ETS157:~> cat /etc/issue
Welcome to SUSE Linux Enterprise Server 11 SP2  (x86_64) - Kernel \r (\l).
weblogic@ETS157:~>

下面演示下普通登陆的欢迎信息

1
2
3
4
5
6
7
8
9
#1.添加如下内容到/etc/motd,默认该文件内容为空
Welcome to !!!!

#2.切换用户
ETS157:~ # su - weblogic
Welcome to !!!!---------------->欢迎信息
Directory: /weblogic
Mon Mar  6 13:55:14 CST 2017
weblogic@ETS157:~>

四、Bash的环境配置文件

你是否会觉得奇怪,怎么我们什么动作都没做,但是一旦进入bash就取得了一堆有用的变量?这是因为系统有一些环境配置文件的存在,让bash在启动时直接读取这些配置文件,以规划好bash的操作环境!而这些配置文件又可以分为系统配置和个人用户配置。环境配置又分为登陆和非登陆环境配置,即 login shell 和 non-login shell。这两种方式读取配置文件的逻辑是不一样的。

login shell

1、概念:简单来说,有完整的登陆过程,需要输出用户名和密码的,就是login shell。比如通过xmanager 或者 putty登陆到linux后台等。

2、login shell会按如下顺序进行读取
2.1. /etc/profile:这是系统整体环境设置,用户登陆后,系统首先读取该文件,建议用户不要修改
2.2. ~/.bash_profile or ~/.bash_login or ~/.profile:这属于用户个人环境设置,读完/etc/profile,才读这里

~/.bash_profile or ~/.bash_login or ~/.profile,均属于用户环境文件,其实只可能读其中的一个,其优先级是是从高到低的,即~/.bash_profile存在,则后面的两个无论存在与否,都不会读

Redhat下bash详细的读取过程如下:

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
#1、.bash_profile文件内容
[root@QA1 ~]# cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc----------------->调用该文件
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

#2、~/.bashrc文件内容
[root@QA1 ~]# cat ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc----------------->调用该文件
fi

3、修改了配置文件,需要注销后重新登陆才能生效,如果想即时生效,可用source filename的命令,比如source ~/.bashrc

non-login shell

不需要完整的登陆,即不需要输入用户名和密码的,就是non-login shell。通常有两种场景。
第一种:登陆到图形界面后,再启动命令模式的终端机,此时不需要输入用户名和密码,那这个bash的环境就为non-login shell

第二种:进入子程序,是不需要输入用户名和密码,这个子程序就是non-login shell。比如在当前的bash中下达bash命令后,就会进入子程序,可通过echo $$输出两个bash的id是不一样的

non-login shell时,只会读取~/.bashrc文件。

五、终端热键

linux下的热键很多,可通过stty -a命令进行查看,如下:

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
#1.查看所有的热键
[root@QA1 ~]# stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

#2.修改热键,将eol修改为^p
[root@ReapsCindaQA1 ~]# stty eol ^p

#3.查看修改后的结果
[root@ReapsCindaQA1 ~]# stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ^P; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

bash下常用的组合键如下:
Ctrl+C:终止目前的命令
Ctrl+D:输入结束(EOF)
Ctrl+Z:暂停目前的命令
Ctrl+M: 相当于输入Enter
Ctrl+S:暂停屏幕的输出
Ctrl+Q:回复屏幕的输出
Ctrl+U:在提示字符下,将整行删除

六、通配符

linux的通配符用途很广,比如想查看当前目录下所有的sh脚本,可直接输入ls -l *.sh,这里的*就是其中的一个通配符
那linux下有哪些常用的通配符呢,如下:
*:代表【0个或多个】任意字符
?:代表【一个(其一定有一个)】任意字符
[]:代表【】内的任意一个字符,比如[abd],代表是a,b,d当中的任意一个
[-]:代表【】范围内的任意一个字符,比如[1-9],代表1-9中9个数字中的任意一个
[^]:反向选择,代表不是【】范围内的字符,比如[^abc],代表一定有一个字符,只要是非abc即可

其他的特殊字符如下:
#:注释符号,代表之后的命令不被执行
$:变量符号,比如$abc,表示获取变量abc的值

七、stdin、stdout、stderr

linux下有标准输入、标准输出、标准错误,分别对应stdin、stdout、stderr,详细表示方法如下:
stdin:代码为0,使用< 或 << 表示 stdout:代码为1,使用> 或 >> 或 1> 或 1>> 表示
stderr:代码为2,使用2> 或 2>> 表示

1>:表示以覆盖的方式,将【正确数据】输出到指定的文件或装置上
1>>:表示以追加的方式,将【正确数据】输出到指定的文件或装置上
2>:表示以覆盖的方式,将【错误数据】输出到指定的文件或装置上
2>>:表示以追加的方式,将【错误数据】输出到指定的文件或装置上

如果想将标准输出和标准错误输出,同时输出到一个文件里可使用 ” >filename 2>&1 ”
如果想忽略错误信息而不显示或储存,则可输出到垃圾站 “2> /dev/null”

八、命令执行顺序(&&、||、;)

bash中可以通过&&、||、;3个字符去改变每个命令的执行顺序,相当于用if ..eles
命令1 && 命令2:表示命令1执行成功,才执行命令2
命令1 || 命令2:表示命令1执行失败,才执行命令2
命令1 ; 命令2:无论命令1执行是否成功,才执行命令2

九、bash命令(tee、|、tr、col、join、paste、expand、split、xargs)

1.tee

tee,有双向重定向的功能,普通的<、>只能是单向的,比如要将某个shell script的执行结果既要在控制台输出,也要输出到文件中保存,此时可用tee命令,命令格式如下:
tee [-a] filename
-a:表示以累加的方式

1
2
3
4
5
weblogic@ETS157:~> echo "China" | tee a.txt
China

weblogic@ETS157:~> cat a.txt
China
2.|

|,称为管道符,表示将前一个命令的输出当成后一个命令的输出,在linux下用途非常广泛,请看下面的例子

1
2
3
#1.搜索系统是否注册已注册oracle这个用户
weblogic@ETS157:~> cat /etc/passwd | grep oracle  '通过|,表示对cat /etc/passwd的结果进行搜索
oracle:x:1002:1002::/opt/oracle:/bin/bash
3.tr

命令格式:tr -[ds] string
参数说明:
-d:delete,表示删除string字符
-s: 替换string字符

例子:

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
#1.去掉:
weblogic@ETS157:~> tail -3 /etc/passwd
oracle:x:1002:1002::/opt/oracle:/bin/bash
tester:x:1003:1003::/tester:/bin/bash
abc:x:1004:1002::/opt/abc:/bin/bash

weblogic@ETS157:~> tail -3 /etc/passwd | tr -d :
oraclex10021002/opt/oracle/bin/bash
testerx10031003/tester/bin/bash
abcx10041002/opt/abc/bin/bash

#2.用%替换:字符
weblogic@ETS157:~> tail -3 /etc/passwd
oracle:x:1002:1002::/opt/oracle:/bin/bash
tester:x:1003:1003::/tester:/bin/bash
abc:x:1004:1002::/opt/abc:/bin/bash
weblogic@ETS157:~> tail -3 /etc/passwd | tr -d :
oraclex10021002/opt/oracle/bin/bash
testerx10031003/tester/bin/bash
abcx10041002/opt/abc/bin/bash
weblogic@ETS157:~> tail -3 /etc/passwd | tr -s : %
oracle%x%1002%1002%/opt/oracle%/bin/bash
tester%x%1003%1003%/tester%/bin/bash
abc%x%1004%1002%/opt/abc%/bin/bash

#3.将小写字符变成大写字符
weblogic@ETS157:~> tail -3 /etc/passwd | tr [a-z] [A-Z]
ORACLE:X:1002:1002::/OPT/ORACLE:/BIN/BASH
TESTER:X:1003:1003::/TESTER:/BIN/BASH
ABC:X:1004:1002::/OPT/ABC:/BIN/BASH
4.col

col主要用于将文本中的tab字符(^I)转换为对等的空格,格式如下:
col -x

5.join

linux中join命令,可结合数据库的内外链接(内链接,左链接,右链接,全链接)方便理解
方式一:join file1 file2 ———–>内链接
方式二:join -a1 file1 file2——–>左链接
方式三:join -a2 file1 file2——–>右链接
方式四:join -a1 -a2 file1 file2—->全链接
方式五:join -0 2.1 file1 file2—–>输出特定字段,该例表示输出第2个文件的第1列
方式六:join -t “%” file1 file2—–>指定特殊连接符

6.paste

paste表示将两个文件简单的按行合并在一起,且中间以tab键分割
命令格式: paste file1 file2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
weblogic@ETS157:~> cat a.txt
1 China
2 1111
3 2222
weblogic@ETS157:~> cat b.txt
1 China
2 abc
3 def
4
weblogic@ETS157:~> paste a.txt b.txt
1 China 1 China
2 1111  2 abc
3 2222  3 def
        4
weblogic@ETS157:~> paste  b.txt a.txt
1 China 1 China
2 abc   2 1111
3 def   3 2222
4
7.expand
8.split
9.xargs
Tags:
文 / 甲乙丙丁
LEAVE A REPLY

loading