当前位置:   article > 正文

linux--shell学习_gdm配置环境变量lang

gdm配置环境变量lang

 

目录

变量

变量的设置规则:

环境变量的功能:

通配符(wildcard)

命令执行的判断依据:; && ||

1. cmd;cmd

2. $?(命令回传码)与&& ||

管道命令(pipe)

选取命令:cut grep

cut

grep

正则表达式

script的执行方式区别(source,sh script,./script)


变量

变量的设置规则:

echo用于显示变量,需要在变量名称前加上$,或者是以${变量}的方式显示。

1.变量与变量内容以一个等号"="来连接

  1. mali@mali:~$ myname=Anna
  2. mali@mali:~$ echo $myname
  3. Anna
  4. mali@mali:~$ echo ${myname}
  5. Anna

2. 等号两边不能直接接空格符

  1. mali@mali:~$ myname= Anna
  2. Anna: command not found
  3. mali@mali:~$ myname=hello kitty
  4. kitty: command not found

3.变量内容若有空格符可使用双引号或单引号将变量内容结合起来,

  1. mali@mali:~$ myname="hello kitty"
  2. mali@mali:~$ echo $myname
  3. hello kitty
  4. mali@mali:~$ myname='hello kitty'
  5. mali@mali:~$ echo $myname
  6. hello kitty

但是双引号内的特殊字符如$等,可以保有原本的特性:

  1. mali@mali:~$ var="lang is $LANG"
  2. mali@mali:~$ echo $var
  3. lang is en_US.UTF-8

单引号内的特殊字符仅为一般字符(纯文本):

  1. mali@mali:~$ var='lang is $LANG'
  2. mali@mali:~$ echo $var
  3. lang is $LANG

4、可使用转义字符"\"将特殊符号(如$、\、空格符、!等)变为一般字符

  1. mali@mali:~$ var="lang is \$LANG"
  2. mali@mali:~$ echo $var
  3. lang is $LANG

5. 在一串命令中,还需要通过其他的命令提供的信息,可以使用反单引号"`命令`"或"$(命令)"。

例如想要取得内核版本的设置:

  1. mali@mali:~$ version=`uname -r`
  2. mali@mali:~$ echo $version
  3. 4.10.0-28-generic
  4. mali@mali:~$ version=$(uname -r)
  5. mali@mali:~$ echo $version
  6. 4.10.0-28-generic

6.若该变量为了增加内容时,可用"$变量名称"或者${变量}累加内容:

  1. mali@mali:~$ myname=tom
  2. mali@mali:~$ myname="$myname":jerry
  3. mali@mali:~$ echo $myname
  4. tom:jerry
  5. mali@mali:~$ myname=${myname}:_kathy
  6. mali@mali:~$ echo $myname
  7. tom:jerry:_kathy
  8. #如果想要myname的内容多出"yes"
  9. mali@mali:~$ myname=$mynameyes
  10. mali@mali:~$ echo $myname
  11. mali@mali:~$
  12. #可以看到,如果没有双引号,那么myname的内容是$mynameyes这个变量,由于没有设置过这个变量,因此没有显示结果

7.若该变量需要在其他子进程进行,则需要以export来使变量变为环境变量

  1. mali@mali:~$ name=jerry
  2. mali@mali:~$ echo $name
  3. jerry
  4. mali@mali:~$ bash #进入到子进程
  5. mali@mali:~$ echo $name #没有显示name的值
  6. mali@mali:~$ exit #离开子进程
  7. exit
  8. mali@mali:~$ export name
  9. mali@mali:~$ bash
  10. mali@mali:~$ echo $name
  11. jerry
  12. mali@mali:~$ exit
  13. exit
  14. mali@mali:~$

Q:“什么是子进程?”

A:在当前shell的情况下,去打开另一个新的shell,这个新的shell就是子进程。在一般的状态下,父进程的自定义变量时无法在子进程内使用的,但是通过export将变量变成环境变量后,就能够在子进程下面应用

8.取消变量的方法为使用"unset 变量名称"

  1. mali@mali:~$ myname=jimmy
  2. mali@mali:~$ echo $myname
  3. jimmy
  4. mali@mali:~$ unset myname
  5. mali@mali:~$ echo $myname
  6. mali@mali:~$

环境变量的功能:

1. 用env查看环境变量:

  1. mali@mali:~$ env
  2. SHELL=/bin/bash #告知目前这个环境使用的shell是哪个程序
  3. VTE_VERSION=4205
  4. TERM=xterm-256color
  5. QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
  6. LC_NUMERIC=zh_CN.UTF-8
  7. WINDOWID=67108874
  8. GNOME_KEYRING_CONTROL=
  9. UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/1537
  10. GTK_MODULES=gail:atk-bridge:unity-gtk-module
  11. name=jerry
  12. USER=mali #用户的名称
  13. SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
  14. DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
  15. XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg
  16. PATH=/home/mali/bin:/home/mali/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin //执行文件查找的路径
  17. DESKTOP_SESSION=ubuntu
  18. QT_QPA_PLATFORMTHEME=appmenu-qt5
  19. QT_IM_MODULE=ibus
  20. LC_IDENTIFICATION=zh_CN.UTF-8
  21. JOB=gnome-session
  22. PWD=/home/mali #目前用户所在的工作目录
  23. XDG_SESSION_TYPE=x11
  24. XMODIFIERS=@im=ibus
  25. LANG=en_US.UTF-8 #语系数据
  26. GNOME_KEYRING_PID=
  27. MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
  28. GDM_LANG=en_US
  29. LC_MEASUREMENT=zh_CN.UTF-8
  30. IM_CONFIG_PHASE=1
  31. COMPIZ_CONFIG_PROFILE=ubuntu
  32. GDMSESSION=ubuntu
  33. GTK2_MODULES=overlay-scrollbar
  34. SESSIONTYPE=gnome-session
  35. XDG_SEAT=seat0
  36. HOME=/home/mali #用户的主文件夹
  37. mali@mali:~$

2.  $(关于本shell的PID)

“$”本身也是个变量,这个代表的是目前这个shell的线程代号,即是所谓的PID(Process ID)。

  1. mali@mali:~$ echo $$
  2. 11284

3. ?(关于上个执行命令的回传码)

当我们执行某些命令时,这些命令都会回传一个执行后的代码。一般来说,如果成功执行该命令,则会回传一个0值,如果执行过程发生错误,就会回传“错误代码”。

  1. mali@mali:~$ echo $SHELL
  2. /bin/bash
  3. mali@mali:~$ echo $?
  4. 0
  5. mali@mali:~$ name= jerry
  6. jerry: command not found
  7. mali@mali:~$ echo $?
  8. 127
  9. mali@mali:~$ echo $? #?只与“上一个执行命令”有关
  10. 0

4. export 自定义变量转成环境变量

我们在原本的bash下执行另一个bash,结果操作的环境接口会跑到第二个bash(子进程)去,那原本的bash就会处于暂停的情况(sleep)。

若要回到原本的bash去,就只有将第二个bash结束掉(exit)才行。

子进程仅会继承父进程的环境变量,不会继承父进程的自定义变量。 

  1. mali@mali:~$ echo $$ #当前shell的pid
  2. 11284
  3. mali@mali:~$ myname=jerry
  4. mali@mali:~$ echo $myname
  5. jerry
  6. mali@mali:~$ bash #执行bash,进入子进程
  7. mali@mali:~$ echo $$ #显示子进程pid
  8. 11743
  9. mali@mali:~$ echo $myname
  10. mali@mali:~$ exit
  11. exit
  12. mali@mali:~$ export myname
  13. mali@mali:~$ bash
  14. mali@mali:~$ echo $myname
  15. jerry
  16. mali@mali:~$ echo $$
  17. 11754
  18. mali@mali:~$ exit
  19. exit
  20. mali@mali:~$ echo $$
  21. 11284

通配符(wildcard)

符号意义
*代表0到无穷多个任意字符
代表一定有一个任意字符
[]代表一定有一个在中括号内的字符,例如[abcd]代表一定有一个字符,可能是a,b,c,d这四个中任何一个
[-]代表在编码顺序内的所有字符,例如[0-9]代表0到9之间的所有数字
[^]表示原向选择,例如[^abc]代表一定有一个字符,只要是非a,b,c的其他字符都接受的意思
  1. #找出/etc/下面以cron开头的文件名
  2. mali@mali:~$ ll -d /etc/cron*
  3. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/cron.d/
  4. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/cron.daily/
  5. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/cron.hourly/
  6. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/cron.monthly/
  7. -rw-r--r-- 1 root root 722 4月 6 2016 /etc/crontab
  8. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/cron.weekly/
  9. #找出/etc/下面文件名刚好是五个字母的文件名
  10. mali@mali:~$ ll -d /etc/?????
  11. drwxr-xr-x 3 root root 4096 8月 1 2017 /etc/avahi/
  12. drwxr-xr-x 4 root root 4096 8月 1 2017 /etc/dconf/
  13. -rw-r--r-- 1 root root 4676 7月 6 2017 /etc/drirc
  14. drwxr-xr-x 3 root root 4096 8月 1 2017 /etc/emacs/
  15. drwxr-xr-x 4 root root 4096 8月 1 2017 /etc/fonts/
  16. -rw-rw-r-- 1 root root 594 7月 14 20:03 /etc/fstab
  17. drwxr-xr-x 5 root root 4096 8月 1 2017 /etc/gconf/
  18. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/gnome/
  19. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/groff/
  20. -rw-r--r-- 1 root root 989 7月 14 20:51 /etc/group
  21. -rw-r--r-- 1 root root 219 7月 14 20:06 /etc/hosts
  22. -rw-rw-r-- 1 root root 123 7月 14 20:06 /etc/iftab
  23. -rw-r--r-- 1 root root 26 7月 31 2017 /etc/issue
  24. -rw-r--r-- 1 root root 267 10月 23 2015 /etc/legal
  25. -rw-r--r-- 1 root root 111 11月 20 2015 /etc/magic
  26. drwxr-xr-x 2 root root 4096 7月 14 20:43 /etc/pam.d/
  27. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/pulse/
  28. drwxr-xr-x 2 root root 4096 7月 14 20:43 /etc/rc0.d/
  29. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc1.d/
  30. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc2.d/
  31. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc3.d/
  32. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc4.d/
  33. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc5.d/
  34. drwxr-xr-x 2 root root 4096 7月 14 20:43 /etc/rc6.d/
  35. drwxr-xr-x 2 root root 4096 7月 14 20:43 /etc/rcS.d/
  36. lrwxrwxrwx 1 root root 23 7月 14 20:03 /etc/vtrgb -> /etc/alternatives/vtrgb
  37. #找出/etc/文件名含有数字的文件名
  38. mali@mali:~$ ll -d /etc/*[0-9]*
  39. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/at-spi2/
  40. drwxr-xr-x 4 root root 4096 8月 1 2017 /etc/dbus-1/
  41. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/gtk-2.0/
  42. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/gtk-3.0/
  43. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/ImageMagick-6/
  44. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/iproute2/
  45. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/libnl-3/
  46. -rw-r--r-- 1 root root 967 10月 30 2015 /etc/mke2fs.conf
  47. -rw-r--r-- 1 root root 7649 8月 1 2017 /etc/pnm2ppa.conf
  48. drwxr-xr-x 5 root root 4096 8月 1 2017 /etc/polkit-1/
  49. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/python2.7/
  50. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/python3/
  51. drwxr-xr-x 2 root root 4096 8月 1 2017 /etc/python3.5/
  52. drwxr-xr-x 2 root root 4096 7月 14 20:43 /etc/rc0.d/
  53. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc1.d/
  54. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc2.d/
  55. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc3.d/
  56. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc4.d/
  57. drwxr-xr-x 2 root root 4096 7月 14 20:42 /etc/rc5.d/
  58. drwxr-xr-x 2 root root 4096 7月 14 20:43 /etc/rc6.d/
  59. -rw-r--r-- 1 root root 10368 10月 2 2015 /etc/sensors3.conf
  60. drwxr-xr-x 2 root root 4096 4月 2 2016 /etc/udisks2/
  61. drwxr-xr-x 11 root root 4096 8月 1 2017 /etc/X11/
  62. #找出/etc/下面文件名开头非为小写字母的文件名
  63. mali@mali:~$ ll -d /etc/[^a-z]*
  64. ls: cannot access '/etc/[^a-z]*': No such file or directory

命令执行的判断依据:; && ||

1. cmd;cmd

不考虑命令相关性的连续命令执行

  1. mali@mali:~$ date;echo $HOME
  2. 2019年 07月 18日 星期四 00:34:16 CST
  3. /home/mali

2. $?(命令回传码)与&& ||

两个命令之间有相依性,而这个相依性主要判断的地方就在于前一个命令执行的结果是否正确。

命令执行情况说明
cmd1 && cmd2

若cmd1执行完毕且正确执行($?=0),则开始执行cmd2

若cmd1执行完毕且为错误($?!=0),则cmd2不执行

cmd1 || cmd2

若cmd1执行完毕且正确执行($?=0),则cmd2不执行

若cmd1执行完毕且为错误($?!=0),则开始执行cmd2

  1. #使用ls查阅目录/tmp/test是否存在,若存在则用touch创建/tmp/test/file1
  2. mali@mali:~$ ls /tmp/test && touch /tmp/test/file1
  3. ls: cannot access '/tmp/test': No such file or directory
  4. #ls找不到该目录,没有touch的错误,说明touch并没有执行
  5. mali@mali:~$ mkdir /tmp/test
  6. mali@mali:~$ ls /tmp/test && touch /tmp/test/file1
  7. mali@mali:~$ ll /tmp/test
  8. total 8
  9. drwxrwxr-x 2 mali mali 4096 7月 18 00:44 ./
  10. drwxrwxrwt 16 root root 4096 7月 18 00:44 ../
  11. -rw-rw-r-- 1 mali mali 0 7月 18 00:44 file1
  1. #测试/tmp/test是否存在,若不存在则予以创建,若存在就不做任何事情
  2. mali@mali:~$ rm -r /tmp/test #先删除此目录以方便测试
  3. mali@mali:~$ ls /tmp/test || mkdir /tmp/test
  4. ls: cannot access '/tmp/test': No such file or directory
  5. mali@mali:~$ ll -d /tmp/test
  6. drwxrwxr-x 2 mali mali 4096 7月 19 20:43 /tmp/test/
  1. #不清楚/tmp/test是否存在,但就是要创建/tmp/test/hehe文件
  2. #该指令总是会创建/tmp/test/hehe,无论/tmp/abc是否存在
  3. mali@mali:~$ ls /tmp/test || mkdir /tmp/test && touch /tmp/test/hehe
  4. 1./tmp/test 存在
  5. mali@mali:~$ ll -d /tmp/test
  6. drwxrwxr-x 2 mali mali 4096 7月 19 20:43 /tmp/test/
  7. mali@mali:~$ ls /tmp/test || mkdir /tmp/test && touch /tmp/test/hehe
  8. mali@mali:~$ ll /tmp/test
  9. total 8
  10. drwxrwxr-x 2 mali mali 4096 7月 19 20:50 ./
  11. drwxrwxrwt 18 root root 4096 7月 19 20:43 ../
  12. -rw-rw-r-- 1 mali mali 0 7月 19 20:50 hehe
  13. #可以看到,成功创建了/tmp/test/hehe
  14. #2./tmp/test不存在
  15. mali@mali:~$ rm -r /tmp/test
  16. mali@mali:~$ ls /tmp/test || mkdir /tmp/test && touch /tmp/test/hehe
  17. ls: cannot access '/tmp/test': No such file or directory
  18. mali@mali:~$ ll /tmp/test
  19. total 8
  20. drwxrwxr-x 2 mali mali 4096 7月 19 20:55 ./
  21. drwxrwxrwt 18 root root 4096 7月 19 20:55 ../
  22. -rw-rw-r-- 1 mali mali 0 7月 19 20:55 hehe

分析:

若/tmp/test存在,故回传$?=0,因为||遇到$?=0不会执行,此时$?=0继续向后传,&&遇到$?=0就开始创建/tmp/test/hehe

若/tmp/test不存在,故回传$?!=0,因为||遇到$?!=0会执行,故执行mkdir /tmp/test,由于mkdir /tmp/test会成功进行,所以回传$?=0,&&遇到$?=0就开始创建/tmp/test/hehe

管道命令(pipe)

  • 管道命令仅会处理standard output,对于standard error 会予以忽略
  • 管道命令必须能够接收来自前一个命令的数据成为standard input继续处理才行

选取命令:cut grep

cut

可以将一段信息的某一段'切'出来,处理的信息以'行'为单位

  1. cut -d '分隔字符' -f fields #用于分隔字符
  2. cut -c 字符范围 #用于排列整齐的信息
  3. 参数:
  4. -d: 后面接分隔字符,与-f一起使用
  5. -f: 根据-d的分隔字符将一段信息切割成数段,用-f取出第几段的意思
  6. -c: 以字符(characters)的单位取出固定字符区间
  7. mali@mali:~$ echo $PATH
  8. /home/mali/bin:/home/mali/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  9. #找出PATH的第五个路径
  10. mali@mali:~$ echo $PATH | cut -d ':' -f 5
  11. /usr/sbin
  12. #找出PATH的第三和第五个路径
  13. mali@mali:~$ echo $PATH | cut -d ':' -f 3,5
  14. /usr/local/sbin:/usr/sbin
  15. mali@mali:~$ export
  16. declare -x CLUTTER_IM_MODULE="xim"
  17. declare -x COMPIZ_CONFIG_PROFILE="ubuntu"
  18. declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-xsmwfFeSMm"
  19. declare -x DEFAULTS_PATH="/usr/share/gconf/ubuntu.default.path"
  20. declare -x DESKTOP_SESSION="ubuntu"
  21. declare -x DISPLAY=":0"
  22. declare -x GDMSESSION="ubuntu"
  23. declare -x GDM_LANG="en_US"
  24. declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated"
  25. declare -x GNOME_KEYRING_CONTROL=""
  26. declare -x GNOME_KEYRING_PID=""
  27. declare -x GPG_AGENT_INFO="/home/mali/.gnupg/S.gpg-agent:0:1"
  28. declare -x GTK2_MODULES="overlay-scrollbar"
  29. declare -x GTK_IM_MODULE="ibus"
  30. declare -x GTK_MODULES="gail:atk-bridge:unity-gtk-module"
  31. declare -x HOME="/home/mali"
  32. ......
  33. #将export输出的信息取得第12字符以后的所有字符串
  34. mali@mali:~$ export | cut -c 12-
  35. CLUTTER_IM_MODULE="xim"
  36. COMPIZ_CONFIG_PROFILE="ubuntu"
  37. DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-xsmwfFeSMm"
  38. DEFAULTS_PATH="/usr/share/gconf/ubuntu.default.path"
  39. DESKTOP_SESSION="ubuntu"
  40. DISPLAY=":0"
  41. GDMSESSION="ubuntu"
  42. GDM_LANG="en_US"
  43. GNOME_DESKTOP_SESSION_ID="this-is-deprecated"
  44. GNOME_KEYRING_CONTROL=""
  45. GNOME_KEYRING_PID=""
  46. GPG_AGENT_INFO="/home/mali/.gnupg/S.gpg-agent:0:1"
  47. GTK2_MODULES="overlay-scrollbar"
  48. GTK_IM_MODULE="ibus"
  49. GTK_MODULES="gail:atk-bridge:unity-gtk-module"
  50. HOME="/home/mali"

grep

分析一行信息,若当中有我们所需要的信息,就将该行拿出来

  1. grep [-acinv] [--color=auto] '查找字符串' filename
  2. 参数: 
  3. -a: 将binary文件以text文件的方式查找数据
  4. -c: 计算找到'查找字符串'的次数
  5. -i: 忽略大小写的不同
  6. -n: 输出行号
  7. -v: 反向选择,即显示出没有'查找字符串'内容的那一行
  8. --color=auto: 可以将找到的关键字部分加上颜色显示
  9. mali@mali:~$ last
  10. mali tty7 :0 Mon Jul 29 06:47 gone - no logout
  11. reboot system boot 4.10.0-28-generi Mon Jul 29 06:46 still running
  12. mali tty7 :0 Thu Jul 25 22:24 - crash (3+08:21)
  13. reboot system boot 4.10.0-28-generi Thu Jul 25 22:22 still running
  14. mali tty7 :0 Wed Jul 24 23:00 - crash (23:22)
  15. reboot system boot 4.10.0-28-generi Wed Jul 24 22:58 still running
  16. guest-cb tty8 :1 Sun Jul 21 23:39 - crash (2+23:18)
  17. mali tty7 :0 Mon Jul 15 19:04 - crash (9+03:54)
  18. reboot system boot 4.10.0-28-generi Mon Jul 15 19:03 still running
  19. mali tty7 :0 Sun Jul 14 20:53 - crash (22:09)
  20. reboot system boot 4.10.0-28-generi Sun Jul 14 20:52 still running
  21. mali tty7 :0 Sun Jul 14 20:47 - crash (00:05)
  22. reboot system boot 4.10.0-28-generi Sun Jul 14 20:47 still running
  23. wtmp begins Sun Jul 14 20:47:10 2019
  24. 示例1:将last当中有出现mali的那一行选取出来
  25. mali@mali:~$ last | grep -n 'mali'
  26. 1:mali tty7 :0 Mon Jul 29 06:47 gone - no logout
  27. 3:mali tty7 :0 Thu Jul 25 22:24 - crash (3+08:21)
  28. 5:mali tty7 :0 Wed Jul 24 23:00 - crash (23:22)
  29. 8:mali tty7 :0 Mon Jul 15 19:04 - crash (9+03:54)
  30. 10:mali tty7 :0 Sun Jul 14 20:53 - crash (22:09)
  31. 12:mali tty7 :0 Sun Jul 14 20:47 - crash (00:05)
  32. 示例2:输出没有出现mali的行
  33. mali@mali:~$ last | grep -vn 'mali'
  34. 2:reboot system boot 4.10.0-28-generi Mon Jul 29 06:46 still running
  35. 4:reboot system boot 4.10.0-28-generi Thu Jul 25 22:22 still running
  36. 6:reboot system boot 4.10.0-28-generi Wed Jul 24 22:58 still running
  37. 7:guest-cb tty8 :1 Sun Jul 21 23:39 - crash (2+23:18)
  38. 9:reboot system boot 4.10.0-28-generi Mon Jul 15 19:03 still running
  39. 11:reboot system boot 4.10.0-28-generi Sun Jul 14 20:52 still running
  40. 13:reboot system boot 4.10.0-28-generi Sun Jul 14 20:47 still running
  41. 14:
  42. 15:wtmp begins Sun Jul 14 20:47:10 2019

正则表达式

通配符代表的是bash的一个功能,而正则表达式则是一种字符串处理的表示方式。

基础正则表达式字符

RE字符意义与范例
^word

待查找的字符串(word)在行首

范例:查找行首为#的那一行,并列出行号

grep -n '^#' regular_express.txt

word$

待查找的字符串(word)在行尾

范例:查找行尾为!的那一行,并列出行号

grep -n '!$' regular_express.txt

.

代表一定有一个任意字符的字符

范例:查找的字符串可以是(eve)(eae)(eee)(e e),但不能为(ee)

即e与e中间一定且仅有一个字符

grep -n 'e.e' regular_express.txt

\

转义字符,将特殊符号的特殊意义去除

范例: 查找含有单引号的那一行

grep -n \' regular_express.txt

*

重复零个到无穷多个的前一个字符

范例:找出含有(es)(ess)(esss)等的字符串,注意,因为*可以是0个,所以es也是符号待查找字符串

grep -n ‘ess*’ regular_express.txt

[list]

从字符集合的RE字符里面找出想要选取的字符

范例:查找含有(gl)或(gd)的那一行

grep -n ‘g[ld]' regular_express.txt

[n1-n2]

从字符集合的RE字符里面找出想要选取的字符范围

范例:查找含有任意数字的那一行

grep -n '[0-9]' regular_express.txt

[^list]

从字符集合的RE字符里面找出不要的字符串或范围

范例:查找的字符串可以是(oog)(ood)但不能是(oot)

grep -n 'oo[^t]' regular_express.txt

\{n,m\}

连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符

范例:在g与g之间有2个到3个的o存在的字符串

grep -n 'go\{2,3\}' regular_express.txt

  1. #以ls -l配合grep 找出/etc/下面文件类型为连接文件属性的文件名
  2. mali@mali:~$ ls -l /etc | grep '^l'
  3. lrwxrwxrwx 1 root root 33 7月 21 13:46 localtime -> /usr/share/zoneinfo/Asia/Shanghai
  4. lrwxrwxrwx 1 root root 19 7月 14 20:41 mtab -> ../proc/self/mounts
  5. lrwxrwxrwx 1 root root 21 7月 14 20:03 os-release -> ../usr/lib/os-release
  6. lrwxrwxrwx 1 root root 22 7月 21 13:45 printcap -> /var/run/cups/printcap
  7. lrwxrwxrwx 1 root root 29 7月 14 20:06 resolv.conf -> ../run/resolvconf/resolv.conf
  8. lrwxrwxrwx 1 root root 23 7月 14 20:03 vtrgb -> /etc/alternatives/vtrgb

script的执行方式区别(source,sh script,./script)

1.直接命令执行:shell.sh文件必须要具备可读与可执行(rx)的权限

  • 绝对路径:使用/home/mali/shell.sh来执行命令;
  • 相对路径:假设工作目录在/home/mali/,则使./shell.sh来执行
  • 变量PATH功能: 将shell.sh放在PATH指定的目录内,例如:~/bin/.(shell.sh在~/bin内且具有rx的权限,直接输入shell.sh即可执行该脚本程序)

2.以bash进程来执行:通过bash shell.sh或sh shell.sh来执行

/bin/sh 其实就是/bin/bash,使用sh shell.sh即告诉系统,我想要直接以bash的功能来执行shell.sh这个文件内的相关命令的意思,所以此时你的shell.sh只要有r的权限即可被执行

这两种方式都会使用一个新的bash环境来执行脚本内的命令。也就是说,使用这种执行方式时,其实script是在子进程的bash内执行的

当子进程完成后,子进程内的各项变量或操作将会结束而不会传回父进程中

3.利用source来执行脚本:在父进程中执行

编写script,可以让用户输入firstname和lastname,最后在屏幕输出

  1. mali@mali:~$ vim shell.sh
  2. mali@mali:~$ cat shell.sh
  3. #!/bin/bash
  4. read -p "please input your first name: " firstname
  5. read -p "please input your last name: " lastname
  6. echo -e "\n Your full name is: $firstname $lastname"
  1. #使用sh shell.sh执行
  2. mali@mali:~$ sh shell.sh
  3. please input your first name: Li
  4. please input your last name: Ma
  5. Your full name is: Li Ma
  6. mali@mali:~$ echo $firstname $lastname
  1. #使用source shell.sh执行
  2. mali@mali:~$ source shell.sh
  3. please input your first name: Li
  4. please input your last name: Ma
  5. Your full name is: Li Ma
  6. mali@mali:~$ echo $firstname $lastname
  7. Li Ma
  1. #使用相对路径执行
  2. mali@mali:~$ ./shell.sh
  3. bash: ./shell.sh: Permission denied
  4. mali@mali:~$ ls -al shell.sh
  5. -rw-rw-r-- 1 mali mali 166 7月 29 08:00 shell.sh
  6. mali@mali:~$ chmod +x shell.sh
  7. mali@mali:~$ ls -al shell.sh
  8. -rwxrwxr-x 1 mali mali 166 7月 29 08:00 shell.sh
  9. mali@mali:~$ ./shell.sh
  10. please input your first name: Li
  11. please input your last name: Ma
  12. Your full name is: Li Ma

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/676249
推荐阅读
相关标签
  

闽ICP备14008679号