lzf79 发表于 2018-8-19 13:37:15

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

  管道符
  |:管道符是将前面的文件的输出的内容传递给后面的命令
  # ls |wc -l
  21
  查看当前目录下有多少文件
  # cat 1.txt |wc -l
  1
  查看1.txt的行数
  以上的两个例子就是管道符的简单用法。
  管道符常营命令
  cut:截取字符串,比如我们要以“:”作为分隔符,取第一列,
  # cat /etc/passwd |head -5|cut -d ":" -f1
  root
  bin
  daemon
  adm
  lp
  这里-d是指定分割符,-f后面接数字,是指截取范围,上面的例子是截取第一段,就输入-f1,如果想
  截取两段,就用“,”分开,后面再接一个数字。如f1,2。
  如果是1-3段,后面就接1-3.
  指定第几个字符 -c
  # cat /etc/passwd |head -2|cut -c4
  t
  :
  sort:排序,比如我们现在得到一列数字,或者是一列字符串,我们要由小到大做一个排序
  # sort /etc/passwd |head -1
  adm:x:3:4:adm:/var/adm:/sbin/nologin
  我们可以看到,sotr的排序是遵循英文字母的排序。这就是sort的作用。
  sort -n会以数字大小去排序
  # 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正好相反
  # sort -r 1.txt
  sync:x:5:0:sync:/sbin:/bin/sync
  1111111111133333333333
  }
  wc -l 统计行数
  # cat 1.txt | wc -l
  20
  wc -m 统计字符数
  # cat 1.txt | wc -m
  499
  wc -w 统计词数,他是根据空格或者空白字符去分割的
  # cat 1.txt | wc -w
  20
  uniq去重复,他一般和sort在一起用,先排序,然后去重(最常用)
  # cat 2.txt
  123
  abc 1111,222
  123
  abc
  1
  1
  2
  然后我们排序,去重
  # sort 2.txt |uniq
  1
  123
  2
  abc
  abc 1111,222
  uniq -c统计重复次数
  # sort 2.txt |uniq -c
  2 1
  2 123
  1 2
  1 abc
  1 abc 1111,222
  tee:类似于>输出重定向。>输出重定向仅仅是将内容写入到目标文件,对我们看不到任何的内容,成功与否。这时候我们就使用tee取代&quot;>&quot;。它不仅可以将内容重定向到目标文件,也可以将内容打印到屏幕上。
  # sort 2.txt |uniq -c|tee a.txt
  2 1
  2 123
  1 2
  1 abc
  1 abc 1111,222
  这样我们就可以看到输出的内容了
  tee -a追加,和>> 作用类似。但是在追加的同时将内容打印在屏幕上
  # sort 2.txt |uniq -c|tee -a a.txt
  2 1
  2 123
  1 2
  1 abc
  1 abc 1111,222
  # cat a.txt
  2 1
  2 123
  1 2
  1 abc
  1 abc 1111,222
  2 1
  2 123
  1 2
  1 abc
  tr:替换字符,它支持写多个字符
  # echo &quot;aminglinux&quot; |tr '' ''
  AmingLinux
  # echo &quot;aminglinux&quot; |tr 'a' 'A'
  Aminglinux
  全部替换成大写
  # echo &quot;aminglinux&quot; |tr '' ''
  AMINGLINUX
  split:切割,将大文件切割成小文件。他有两种用法,一种是 -b大小默认单位是字节 ,一种是 -l行数。(系统默认是以x开头)
  # split -b 1000 a.txt
  # ls
  a.txtxaexajxaoxatxayxbdxbixbnxbsxbxxccxchxcmxcrxcwxdbxdgxdlxdqxdvxeaxefxekxepxeuxezxfexfj
  xaa    xafxakxapxauxazxbexbjxboxbtxbyxcdxcixcnxcsxcxxdcxdhxdmxdrxdwxebxegxelxeqxevxfaxffxfk
  xab    xagxalxaqxavxbaxbfxbkxbpxbuxbzxcexcjxcoxctxcyxddxdixdnxdsxdxxecxehxemxerxewxfbxfgxfl
  xac    xahxamxarxawxbbxbgxblxbqxbvxcaxcfxckxcpxcuxczxdexdjxdoxdtxdyxedxeixenxesxexxfcxfhxfm
  xad    xaixanxasxaxxbcxbhxbmxbrxbwxcbxcgxclxcqxcvxdaxdfxdkxdpxduxdzxeexejxeoxetxeyxfdxfi
  这就将a.txt按1000b切割完成了。
  我们也可以切割完后给他命名,不用系统给我们的名字,但是我们只能自定义它的前缀。
s# split -b 100k a.txt abc
  # ls
  abcaaabcaba.txtxaaxab
  split -l按行切割,比如我们都按照1000行切割
  # split -l 1000 a.txt
  # wc -l *
  1000 xaa
  1000 xab
  1000 xac
  这样每个文件都是1000行。
  后面接目标文件,就可以直接清空里面的内容。
  # > a.txt
  # cat a.txt
  注释符
  #:在#号后面输入的shell都不回生效,它的作用是解释说明。
  $:变量前缀,!$组合,这则里面表示行位
  ;多条命名写到一行,用分号分割
  # ls 1.txt; wc -l 2.txt
  1.txt
  7 2.txt
  ~:用户的家目录,在正则表达式里表示匹配符
  &:命令放到后台去
  :输出重定向,会把目标的内容全部替换
  >:追加重定向,会将内容追加到目标内容的结尾处
  2>:错误输出重定向,和输出重定向作用一样
  2>>:最佳错误重定向,和追加重定向作用一样。
  &>:直接把正确和错误直接输入到目标文件中
  【】:指定字符中的一个,经常用于替换,比如【0-9】,【a-zA-Z】,【abc】。
  ||:在shell代表或者,它用在两条命令中间。如果第一条命令执行成功,它就不会执行第二条命令,如果执行不成功,它就会执行第二条命令。
  # ls 1a.txt|| wc -l 2.txt
  ls: 无法访问1a.txt: 没有那个文件或目录
  7 2.txt
  第一条命令没有成功,它就执行了第二条
  # ls 1.txt|| wc -l 2.txt
  1.txt
  第一条命令成功了,它就不执行第二条。
  &&:让两个命令连续执行,只有前面命令执行成功,后面命令才继续执行。
  # ls 1.txt&& wc -l 2.txt
  1.txt
  7 2.txt
  只有前一个命令执行成功,后一个才会执行
  # ls 1a.txt&& wc -l 2.txt
  ls: 无法访问1a.txt: 没有那个文件或目录
  如果前一个命令不成功,那么后一条命名就不会执行。
  我们可以将||和&&理解成一个判断,||只有前面的命令不成功的时候才执行后面的命令,&&只有前面命令成功的时候才会执行后面的命令。
  作业控制
  当我们在编辑一个文件,突然间我们要暂停一下去做其他事,这时我么只要按Ctrl+z将现有的工作扔到后台去,然后我们再做我们需要的事情
  # vim 1.txt
  然后按Ctrl+z
  +已停止               vim 1.txt
  这样编辑1.txt的工作就放到后台了。
  如果我们还要继续编辑1.txt,就输入fg,这样就把放在后台的任务重新放回前面了
  如果我们同时扔到后台两个命令,这时我们可以用jobs将后台的任任务打印出来
  # jobs
  -已停止               vim 1.txt
  +已停止               vim 2.txt
  然后我们想要调回其中一个任务,只要输入命令fg+任务ID号就可以,比如我们想调回2.txt的编辑任务,就要输入fg 2就可以了。
  我们也可以将命令放到后台去运行。输入命令bg 2
  # bg 2
  + vim 2.txt &(这相当于后台运行)
  再比如
  # sleep 100
  ^Z
  +已停止               sleep 100
  # bg 2
  + sleep 100 &
  # jobs
  +已停止               sleep 180
  -运行中               sleep 100 &
  除此之外,我们还可以将命令一次性的放到后台去,就是在命令后面加上“&”
  # sleep 100 &
   1223
  # jobs
  +运行中               sleep 100 &
  这样的话后可以将一条命令放到后台去进行,但是在另一个终端我们是看不到我们本终端的任务的,但是能查看进程。
  变量
  centos系统内变量包括PATH,HOME,PWD,LOGNAME等等,那么这些变量是在哪里规定的呢?我们可以通过命令env来获取这些系统变量。
  env是查看系统常用的环境变量的,除了env,还有set,这个命令不仅可以查看系统内的环境变量,也可以查看用户自定义的环境改变量。
  # env | head -5
  XDG_SESSION_ID=1
  HOSTNAME=localhost.localdomain
  SELINUX_ROLE_REQUESTED=
  TERM=linux
  SHELL=/bin/bash
  等号的左边是变量的名字,右边是值。系统的变量通常都是大写的英文字母,但是变量的值就不一定是字母了,有时会是字母,有时会是数字。
  我们也可以自定义变量,比如
  # a=111
  # echo $a
  111
  这是我们自定义的变量,而不是我们系统自带的变量,这个变量就可以用set命令查到
  # set | grep 111
  a=111
  变量名的规则:首先系统的环境变量是系统内置的,我们没有权利干涉他,但我们可以修改配置文件。我们也可以自定义变量,首先我们先给变量定一个名字,变量的名字是由字母、数字、下划线组成,但首位不能是数字。
  # a1=2
  # echo $a1
  2
  # a=4
  # echo $a
  4
  # _a1=5
  # echo $_a1
  5
  # 1a=5
  -bash: 1a=5: 未找到命令
  由此可以看出,变量的首位除了数字,都可以执行。
  变量的值有特殊符号时需要用单引号括起来,比如我们要执行变量a=a b c
  # a=a b c
  -bash: b: 未找到命令
  由于后边的值中有空格的存在,所以变量没哟形成,他只会认为a=a,而后边的b,c他会理解为是一个命令,会报错。所以我们要用‘’括起来,这里建议用单引号,这样可以脱意
  # a='a b c'
  # echo $a
  a b c
  如果用双引号“”的话会出现特殊符号不识别的情况
  # a=&quot;a$bc&quot;
  # echo $a
  a
  所以,有特殊符号的时候要用单引号‘’
  # a='a$bc'
  # echo $a
  a$bc
  变量的累加
  我们的变量是可以累加输出的,比如
  # a=1
  # b=2
  # echo $a$b
  12
  这样就可以将两个变量同时输出
  # a='a$bc'
  # echo $a
  a$bc
  加单引号脱意
  # c=&quot;a$b&quot;c
  # echo $c
  a2c
  这里面直接把$b看成了一个赋值的变量,因为前面已经是b=2,c=a所以这里的输出就是a2c。如果我们的变量比较复杂,那么我们最好用单引号。
  全局变量
  我们先做一个实验,先定义aming=linux
  # aming=linux
  # echo $aming
  linux
  然后我们打开另一个回话或者进入另一个bash
  # bash
  # echo $aming
  #
  这时我们发现刚才定义的aming并没有得出自定义结果的值的,我们把这样的定义变量叫做非全局变量,也可以叫做本地变量,他只在当前终端下生效。
  那我们怎样将它变成一个全局变量呢?用命令export
  # export aming=linux
  # echo $aming
  linux
  # bash
  # echo $aming
  linux
  这样就变成了全局变量。而且这种全局变量只能是从上向下,而不能从下向上,也不能在另一个终端上生效。
  取消变量unset
  # unset aming
  # 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用来定义用户退出的时候需要做的一些操作

页: [1]
查看完整版本: shell变量,管道符,作业控制,shell变量,以及变量配置文件