shell变量,管道符,作业控制,shell变量,以及变量配置文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell变量,管道符,作业控制,shell变量,以及变量配置文件相关的知识,希望对你有一定的参考价值。

管道符
|:管道符是将前面的文件的输出的内容传递给后面的命令
[[email protected] ~]# ls |wc -l
21
查看当前目录下有多少文件
[[email protected] ~]# cat 1.txt |wc -l
1
查看1.txt的行数
以上的两个例子就是管道符的简单用法。

管道符常营命令

cut:截取字符串,比如我们要以“:”作为分隔符,取第一列,

[[email protected] ~]# cat /etc/passwd |head -5|cut -d ":" -f1

root

bin

daemon

adm

lp

这里-d是指定分割符,-f后面接数字,是指截取范围,上面的例子是截取第一段,就输入-f1,如果想

截取两段,就用“,”分开,后面再接一个数字。如f1,2。

如果是1-3段,后面就接1-3.

指定第几个字符 -c

[[email protected] ~]# cat /etc/passwd |head -2|cut -c4

t

:

sort:排序,比如我们现在得到一列数字,或者是一列字符串,我们要由小到大做一个排序
[[email protected] ~]# sort /etc/passwd |head -1
adm:x:3:4:adm:/var/adm:/sbin/nologin
我们可以看到,sotr的排序是遵循英文字母的排序。这就是sort的作用。

sort -n会以数字大小去排序
[[email protected] ~]# sort -n 1.txt
<

{
}
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
22223333
22222222222aaaaaaa
*我们需要注意的是,如果我们输入-n,那么文件里面的特殊符号和字符会被认为是0。所以特殊符号和字母会排在前面。

sotr-r反向排序,与-n正好相反
[[email protected] ~]# sort -r 1.txt
sync:x:5:0:sync:/sbin:/bin/sync
1111111111133333333333
}

wc -l 统计行数
[[email protected] ~]# cat 1.txt | wc -l
20

wc -m 统计字符数
[[email protected] ~]# cat 1.txt | wc -m
499

wc -w 统计词数,他是根据空格或者空白字符去分割的
[[email protected] ~]# cat 1.txt | wc -w
20

uniq去重复,他一般和sort在一起用,先排序,然后去重(最常用)
[[email protected] ~]# cat 2.txt
123
abc 1111,222
123
abc
1
1
2
然后我们排序,去重
[[email protected] ~]# sort 2.txt |uniq
1
123
2
abc
abc 1111,222

uniq -c统计重复次数
[[email protected] ~]# sort 2.txt |uniq -c
2 1
2 123
1 2
1 abc
1 abc 1111,222
tee:类似于>输出重定向。>输出重定向仅仅是将内容写入到目标文件,对我们看不到任何的内容,成功与否。这时候我们就使用tee取代">"。它不仅可以将内容重定向到目标文件,也可以将内容打印到屏幕上。
[[email protected] ~]# sort 2.txt |uniq -c|tee a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
这样我们就可以看到输出的内容了

tee -a追加,和>> 作用类似。但是在追加的同时将内容打印在屏幕上
[[email protected] ~]# sort 2.txt |uniq -c|tee -a a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
[[email protected] ~]# cat a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
2 1
2 123
1 2
1 abc

tr:替换字符,它支持写多个字符
[[email protected] ~]# echo "aminglinux" |tr ‘[al]‘ ‘[AL]‘
AmingLinux
[[email protected] ~]# echo "aminglinux" |tr ‘a‘ ‘A‘
Aminglinux
全部替换成大写
[[email protected] ~]# echo "aminglinux" |tr ‘[a-z]‘ ‘[A-Z]‘
AMINGLINUX

split:切割,将大文件切割成小文件。他有两种用法,一种是 -b大小默认单位是字节 ,一种是 -l行数。(系统默认是以x开头)
[[email protected] test]# split -b 1000 a.txt
[[email protected] test]# ls
a.txt xae xaj xao xat xay xbd xbi xbn xbs xbx xcc xch xcm xcr xcw xdb xdg xdl xdq xdv xea xef xek xep xeu xez xfe xfj
xaa xaf xak xap xau xaz xbe xbj xbo xbt xby xcd xci xcn xcs xcx xdc xdh xdm xdr xdw xeb xeg xel xeq xev xfa xff xfk
xab xag xal xaq xav xba xbf xbk xbp xbu xbz xce xcj xco xct xcy xdd xdi xdn xds xdx xec xeh xem xer xew xfb xfg xfl
xac xah xam xar xaw xbb xbg xbl xbq xbv xca xcf xck xcp xcu xcz xde xdj xdo xdt xdy xed xei xen xes xex xfc xfh xfm
xad xai xan xas xax xbc xbh xbm xbr xbw xcb xcg xcl xcq xcv xda xdf xdk xdp xdu xdz xee xej xeo xet xey xfd xfi
这就将a.txt按1000b切割完成了。

我们也可以切割完后给他命名,不用系统给我们的名字,但是我们只能自定义它的前缀。

s[[email protected] test]# split -b 100k a.txt abc

[[email protected] test]# ls
abcaa abcab a.txt xaa xab

split -l按行切割,比如我们都按照1000行切割
[[email protected] test]# split -l 1000 a.txt
[[email protected] test]# wc -l *
1000 xaa
1000 xab
1000 xac
这样每个文件都是1000行。

后面接目标文件,就可以直接清空里面的内容。
[[email protected] ~]# > a.txt
[[email protected] ~]# cat a.txt

注释符
#:在#号后面输入的shell都不回生效,它的作用是解释说明。

$:变量前缀,!$组合,这则里面表示行位

;多条命名写到一行,用分号分割
[[email protected] ~]# ls 1.txt; wc -l 2.txt
1.txt
7 2.txt

~:用户的家目录,在正则表达式里表示匹配符

&:命令放到后台去

:输出重定向,会把目标的内容全部替换
>:追加重定向,会将内容追加到目标内容的结尾处
2>:错误输出重定向,和输出重定向作用一样
2>>:最佳错误重定向,和追加重定向作用一样。
&>:直接把正确和错误直接输入到目标文件中

【】:指定字符中的一个,经常用于替换,比如【0-9】,【a-zA-Z】,【abc】。

||:在shell代表或者,它用在两条命令中间。如果第一条命令执行成功,它就不会执行第二条命令,如果执行不成功,它就会执行第二条命令。
[[email protected] ~]# ls 1a.txt|| wc -l 2.txt
ls: 无法访问1a.txt: 没有那个文件或目录
7 2.txt
第一条命令没有成功,它就执行了第二条
[[email protected] ~]# ls 1.txt|| wc -l 2.txt
1.txt
第一条命令成功了,它就不执行第二条。

&&:让两个命令连续执行,只有前面命令执行成功,后面命令才继续执行。
[[email protected] ~]# ls 1.txt&& wc -l 2.txt
1.txt
7 2.txt
只有前一个命令执行成功,后一个才会执行
[[email protected] ~]# ls 1a.txt&& wc -l 2.txt
ls: 无法访问1a.txt: 没有那个文件或目录
如果前一个命令不成功,那么后一条命名就不会执行。

我们可以将||和&&理解成一个判断,||只有前面的命令不成功的时候才执行后面的命令,&&只有前面命令成功的时候才会执行后面的命令。

作业控制
当我们在编辑一个文件,突然间我们要暂停一下去做其他事,这时我么只要按Ctrl+z将现有的工作扔到后台去,然后我们再做我们需要的事情
[[email protected] ~]# vim 1.txt
然后按Ctrl+z
[1]+ 已停止 vim 1.txt
这样编辑1.txt的工作就放到后台了。
如果我们还要继续编辑1.txt,就输入fg,这样就把放在后台的任务重新放回前面了

如果我们同时扔到后台两个命令,这时我们可以用jobs将后台的任任务打印出来
[[email protected] ~]# jobs
[1]- 已停止 vim 1.txt
[2]+ 已停止 vim 2.txt
然后我们想要调回其中一个任务,只要输入命令fg+任务ID号就可以,比如我们想调回2.txt的编辑任务,就要输入fg 2就可以了。

我们也可以将命令放到后台去运行。输入命令bg 2
[[email protected] ~]# bg 2
[2]+ vim 2.txt &(这相当于后台运行)
再比如
[[email protected] ~]# sleep 100
^Z
[2]+ 已停止 sleep 100
[[email protected] ~]# bg 2
[2]+ sleep 100 &
[[email protected] ~]# jobs
[1]+ 已停止 sleep 180
[2]- 运行中 sleep 100 &

除此之外,我们还可以将命令一次性的放到后台去,就是在命令后面加上“&”
[[email protected] ~]# sleep 100 &
[1] 1223
[[email protected] ~]# jobs
[1]+ 运行中 sleep 100 &
这样的话后可以将一条命令放到后台去进行,但是在另一个终端我们是看不到我们本终端的任务的,但是能查看进程。

变量
centos系统内变量包括PATH,HOME,PWD,LOGNAME等等,那么这些变量是在哪里规定的呢?我们可以通过命令env来获取这些系统变量。
env是查看系统常用的环境变量的,除了env,还有set,这个命令不仅可以查看系统内的环境变量,也可以查看用户自定义的环境改变量。

[[email protected] ~]# env | head -5
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=linux
SHELL=/bin/bash
等号的左边是变量的名字,右边是值。系统的变量通常都是大写的英文字母,但是变量的值就不一定是字母了,有时会是字母,有时会是数字。

我们也可以自定义变量,比如
[[email protected] ~]# a=111
[[email protected] ~]# echo $a
111
这是我们自定义的变量,而不是我们系统自带的变量,这个变量就可以用set命令查到
[[email protected] ~]# set | grep 111
a=111

变量名的规则:首先系统的环境变量是系统内置的,我们没有权利干涉他,但我们可以修改配置文件。我们也可以自定义变量,首先我们先给变量定一个名字,变量的名字是由字母、数字、下划线组成,但首位不能是数字。
[[email protected] ~]# a1=2
[[email protected] ~]# echo $a1
2
[[email protected] ~]# a=4
[[email protected] ~]# echo $a

4
[[email protected] ~]# _a1=5
[[email protected] ~]# echo $_a1
5
[[email protected] ~]# 1a=5
-bash: 1a=5: 未找到命令
由此可以看出,变量的首位除了数字,都可以执行。

变量的值有特殊符号时需要用单引号括起来,比如我们要执行变量a=a b c
[[email protected] ~]# a=a b c
-bash: b: 未找到命令
由于后边的值中有空格的存在,所以变量没哟形成,他只会认为a=a,而后边的b,c他会理解为是一个命令,会报错。所以我们要用‘’括起来,这里建议用单引号,这样可以脱意
[[email protected] ~]# a=‘a b c‘
[[email protected] ~]# echo $a
a b c
如果用双引号“”的话会出现特殊符号不识别的情况
[[email protected] ~]# a="a$bc"
[[email protected] ~]# echo $a
a
所以,有特殊符号的时候要用单引号‘’
[[email protected] ~]# a=‘a$bc‘
[[email protected] ~]# echo $a
a$bc

变量的累加
我们的变量是可以累加输出的,比如
[[email protected] ~]# a=1
[[email protected] ~]# b=2
[[email protected] ~]# echo $a$b
12
这样就可以将两个变量同时输出

[[email protected] ~]# a=‘a$bc‘
[[email protected] ~]# echo $a
a$bc
加单引号脱意

[[email protected] ~]# c="a$b"c
[[email protected] ~]# echo $c
a2c
这里面直接把$b看成了一个赋值的变量,因为前面已经是b=2,c=a所以这里的输出就是a2c。如果我们的变量比较复杂,那么我们最好用单引号。

全局变量
我们先做一个实验,先定义aming=linux
[[email protected] ~]# aming=linux
[[email protected] ~]# echo $aming
linux
然后我们打开另一个回话或者进入另一个bash
[[email protected] ~]# bash
[[email protected] ~]# echo $aming

[[email protected] ~]#
这时我们发现刚才定义的aming并没有得出自定义结果的值的,我们把这样的定义变量叫做非全局变量,也可以叫做本地变量,他只在当前终端下生效。

那我们怎样将它变成一个全局变量呢?用命令export
[[email protected] ~]# export aming=linux
[[email protected] ~]# echo $aming
linux
[[email protected] ~]# bash
[[email protected] ~]# echo $aming
linux
这样就变成了全局变量。而且这种全局变量只能是从上向下,而不能从下向上,也不能在另一个终端上生效。

取消变量unset
[[email protected] ~]# unset aming
[[email protected] ~]# echo $aming
这样就取消了自定义变量。

export的语法:export 变量名=变量值,全局变量也只在子shell下生效,输入bash就进入一个bash。

环境变量的配置文件
环境变量文件分为两个维度,一个维度是系统层次(etc下的),另一个维度是用户层次(家目录下的 ~/.)。系统层次有/etc/porfile,/etc/bashrc,这两个文件我们最好不要去编辑它。
用户层次包括~/.bashrc,~/.bash_profile。我们可以编辑用户家目录下的这两个文件。~/.bash_profile会调用~/.bashrc,而~/.bashrc会调用~/.bashrc。
profile和bashrc这两种文件的区别在于,profile是在用户登录的时候它就会自动的加载Profile,而profile会自定的调用bashrc。而bashrc是执行shell脚本的时候,用户不用登陆就可以执行脚本,而执行脚本就要调用bashrc里面的一些配置。
~/.bash_history。
~/.bash_logout用来定义用户退出的时候需要做的一些操作

以上是关于shell变量,管道符,作业控制,shell变量,以及变量配置文件的主要内容,如果未能解决你的问题,请参考以下文章

8.6 管道符和作业控制 8.7/8.8 shell变量 8.9 环境变量配置文件

管道符和作业控制/shell变量/环境变量配置文件

8.6-8.9 管道符和作业控制shell变量,环境变量

管道符和作业控制shell变量环境变量配置文件

管道符和作业控制 shell变量 环境变量配置文件

八管道符和作业控制shell变量环境变量配置文件