Linux shell基础知识(上)

目录

一、shell介绍

二、命令历史

三、命令补全和别名

四、通配符

五、输入输出重定向

六、管道符和作业控制

七、shell变量

八、环境变量配置文件

九、bashrc和bash_profile的区别

一、shell介绍

shell是一个命令解释器,提供用户和机器之间的交互。支持特定语法,如逻辑判断,循环等。每个用户都可以有自己的shell,centos7默认的shell为bash(Bourne Again Shell)。

Shell的两大家族

1.Bourne Shell家族:sh、ksh、bash

2.C-shell家族:csh、tcsh

查看系统支持的shell种类

  1. //通过chsh命令查看
  2. [root@lanquark ~]# chsh -l
  3. /bin/sh
  4. /bin/bash
  5. /sbin/nologin
  6. /usr/bin/sh
  7. /usr/bin/bash
  8. /usr/sbin/nologin
  9. //通过/etc/shells文件查看
  10. [root@lanquark ~]# cat /etc/shells
  11. /bin/sh
  12. /bin/bash
  13. /sbin/nologin
  14. /usr/bin/sh
  15. /usr/bin/bash
  16. /usr/sbin/nologin

临时改变shell:直接运行一个新shell启动另一个shell。如需返回Bash时,按^D返回。

  1. [root@lanquark ~]# zsh
  2. [root@lanquark]~#

改变登录shell

  1. [user3@lanquark ~]$ chsh -s /bin/zsh
  2. Changing shell for user3.
  3. Password:
  4. Shell changed.

二、命令历史

在输入命令时,shell会将命令保存到历史列表中。

可使用方向键调用历史命令。但每次只允许查看一条命令。

history和!命令可以显示全部或者部分历史列表。

在历史列表中,每一条命令称为一个事件,而每个事件都有一个内部编号,称为事件编号。历史列表的功能就是它可以基于事件编号调取命令。

  1. [root@lanquark ~]# history | head -n 10
  2. 1 lsblk
  3. 2 which lsblk
  4. 3 rpm -ql util-linux
  5. 4 rpm -ql util-linux | more
  6. 5 which vim
  7. 6 ping www.163.com
  8. 7 yum -y install vim dos2unix unix2dos htop
  9. 8 yum list | grep epel
  10. 9 yum -y install epel-release.noarch
  11. 10 yum repols

通过事件编号调取并执行特定命令

  1. //!后不能有空格
  2. [root@lanquark ~]# !2
  3. which lsblk
  4. /usr/bin/lsblk

执行之前输入命令中带有某些关键字的命令

  1. [root@lanquark ~]# !lsblk
  2. lsblk
  3. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  4. sda 8:0 0 20G 0 disk
  5. ├─sda1 8:1 0 190M 0 part /boot
  6. ├─sda2 8:2 0 1.9G 0 part [SWAP]
  7. └─sda3 8:3 0 14G 0 part /
  8. sdb 8:16 0 20G 0 disk
  9. ├─sdb1 8:17 0 3G 0 part
  10. └─lvm_test-lvm 253:0 0 6.9G 0 lvm
  11. ├─sdb2 8:18 0 3G 0 part
  12. └─lvm_test-lvm 253:0 0 6.9G 0 lvm
  13. └─sdb3 8:19 0 3G 0 part
  14. └─lvm_test-lvm 253:0 0 6.9G 0 lvm
  15. sr0 11:0 1 4.2G 0 rom

执行之前输入的最后一条命令

  1. [root@lanquark ~]# !!
  2. which lsblk
  3. /usr/bin/lsblk

在重新执行命令之前对命令进行小的修改

  1. [root@lanquark ~]# !2:s/lsblk/blkid/
  2. which blkid
  3. /usr/sbin/blkid

当前shell的历史表保存位置

  1. //.bash_history
  2. [root@lanquark ~]# cat ~/.bash_history | head -n 10
  3. lsblk
  4. which lsblk
  5. rpm -ql util-linux
  6. rpm -ql util-linux | more
  7. which vim
  8. ping www.163.com
  9. yum -y install vim dos2unix unix2dos htop
  10. yum list | grep epel

清除内存中的history命令列表

  1. [root@lanquark ~]# history -c
  2. [root@lanquark ~]# history
  3. 600 history
  4. //注意,history -c不会清除已经保存在.bash_history的历史命令列表

历史列表默认大小:

  1. [root@lanquark ~]# echo $HISTSIZE
  2. 1000

设置历史列表大小

  1. //当前shell有效
  2. [root@lanquark ~]# export HISTSIZE=50
  3. [root@lanquark ~]# echo $HISTSIZE
  4. 50
  5. //如需永久生效,可修改/etc/profile文件
  6. [root@lanquark ~]# grep HISTSIZE /etc/profile
  7. HISTSIZE=1000 //修改为想要的大小
  8. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
  9. [root@lanquark ~]# . /etc/profile

如需历史列表记录命令执行时间,修改HISTTIMEFORMAT环境变量

  1. //当前shell临时生效
  2. [root@lanquark ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
  3. [root@lanquark ~]# export HISTTIMEFORMAT
  4. [root@lanquark ~]# echo $HISTTIMEFORMAT
  5. %Y/%m/%d %H:%M:%S
  6. //效果
  7. [root@lanquark ~]# history
  8. 600 2018/06/01 06:23:01 history
  9. 601 2018/06/01 06:25:12 cat ~/.bash_history
  10. 602 2018/06/01 06:27:09 lsblk
  11. 603 2018/06/01 06:27:15 which lsblk
  12. 604 2018/06/01 06:28:54 lsblk
  13. 605 2018/06/01 06:32:24 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
  14. 606 2018/06/01 06:32:37 export HISTTIMEFORMAT
  15. 607 2018/06/01 06:32:43 echo $HISTTIMEFORMAT
  16. 608 2018/06/01 06:33:40 history
  17. //如需永久生效,可修改/etc/profile
  18. [root@lanquark ~]# vim /etc/profile
  19. //添加如下条目
  20. export HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

永久保存历史命令列表

  1. [root@lanquark ~]# chattr +a ~/.bash_history
  2. //注意:如果shell没有正常退出(如直接断开终端,异常中断等),则内存中的shell历史列表不会保存

命令补全和别名

tab键敲一次与敲两次

tab:补全单词

tab tab:显示所有可能

  1. [root@lanquark ~]# ls
  2. anaconda-ks.cfg demo download download1
  3. //如需查看demo目录的属性,可输入de,然后按tab,因为只有一个文件是以de开头,所以shell会自动填充该文件名的剩余部分
  4. //如需查看download目录的属性,如输入down,然后按tab,因为有两个文件是以down开头,所以shell将发出滴滴声提示键入的内容有岐义性,有两种选择,一是键入更多的内容并再次尝试自动补全。或者如果不确定该键入的内容,可按第二次tab键,使用shell显示所有可能匹配的文件的列表。

参数补全

  1. //Centos6中需安装bash-completion、
  2. yum -y install bash-completion
  3. //Centos7默认已经安装

别名就是赋予一条命令或一列命令的名称。可以将别名作为缩写,或者使用别名创建已有命令的自定义变体。

alias命令可以创建别名

语法: alias [name=commands]

  1. //显示当前shell下已经设置的别名
  2. [root@lanquark ~]# alias
  3. alias cp='cp -i'
  4. alias egrep='egrep --color=auto'
  5. alias fgrep='fgrep --color=auto'
  6. alias grep='grep --color=auto'
  7. alias l.='ls -d .* --color=auto'
  8. alias ll='ls -l --color=auto'
  9. alias ls='ls --color=auto'
  10. alias mv='mv -i'
  11. alias rm='rm -i'
  12. alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
  13. //不用别名的效果,用反斜杠转义,匹配到的内容不显示颜色
  14. [root@lanquark ~]# \grep hjm /etc/passwd
  15. hjm:x:5000:5000:HJM:/home/hjm:/bin/bash
  16. //不用别名的效果,绝对路径,匹配到的内容不显示颜色
  17. [root@lanquark ~]# /usr/bin/grep hjm /etc/passwd
  18. hjm:x:5000:5000:HJM:/home/hjm:/bin/bash
  19. //ualias取消别名
  20. [root@lanquark ~]# alias
  21. [root@lanquark ~]# ll
  22. -bash: ll: command not found
  23. //别名的效果,匹配到的内容会自动显示颜色
  24. [root@lanquark ~]# grep hjm /etc/passwd
  25. hjm:x:5000:5000:HJM:/home/hjm:/bin/bash

临时添加别名

  1. [root@lanquark ~]# free
  2. total used free shared buff/cache available
  3. Mem: 999720 135680 495472 6780 368568 677996
  4. Swap: 1999868 0 1999868
  5. [root@lanquark ~]# alias free='free -m'
  6. [root@lanquark ~]# free
  7. total used free shared buff/cache available
  8. Mem: 976 132 483 6 359 661
  9. Swap: 1952 0 1952

修改用户的别名配置文件~/.bashrc,永久添加别名

  1. [root@lanquark ~]# cat ~/.bashrc
  2. # .bashrc
  3. # User specific aliases and functions
  4. alias rm='rm -i'
  5. alias cp='cp -i'
  6. alias mv='mv -i'
  7. # Source global definitions
  8. if [ -f /etc/bashrc ]; then
  9. . /etc/bashrc
  10. fi
  11. //在~/.bashrc增加alias free='free -m'
  12. [root@lanquark ~]# vim ~/.bashrc
  13. //重新加载配置文件
  14. [root@lanquark ~]# . ~/.bashrc
  15. [root@lanquark ~]# free
  16. total used free shared buff/cache available
  17. Mem: 976 133 482 6 359 661
  18. Swap: 1952 0 1952

系统默认在/etc/profile.d/下通过脚本定义了一部分别名

  1. [root@lanquark ~]# ls /etc/profile.d/
  2. 256term.csh bash_completion.sh colorgrep.sh colorls.sh lang.sh less.sh vim.sh which2.sh
  3. 256term.sh colorgrep.csh colorls.csh lang.csh less.csh vim.csh which2.csh

通配符

常用通配符

*星号,代表任意字符,0个或多个, *号不会匹配隐藏的文件。

? 问号代表任意一个字符,问号不与以句点开始的文件(隐藏文件)名匹配

[ ] 定义一个字符类,与列表中每个单独字符进行匹配

{ } 分组

通配符(wildcard),通配符的匹配是完全匹配

  1. [root@lanquark demo]# ls
  2. 1.txt 2.txt f1.txt f2.txt temp
  3. //*匹配0个或多个字符
  4. [root@lanquark demo]# ls *txt
  5. 1.txt 2.txt f1.txt f2.txt txt
  6. //?匹配一个字符
  7. [root@lanquark demo]# ls ?.txt
  8. 1.txt 2.txt
  9. //[]字义字符类,与列表中每个单独字符进行匹配
  10. [root@lanquark demo]# ls [1-9].txt
  11. 1.txt 2.txt
  12. //{}分组
  13. [root@lanquark demo]# ls f{1,2}.txt
  14. f1.txt f2.txt

输入输出重定向

Linux用文件描述符来标识每一个对象。文件描述符是一个整数,可以唯一标识会话中打开的文件。每个进程最多可以一次有九个文件描述符。

在命令行上,命令总是在左侧,箭头方向就是数据的流向。

标准输入(stdin):文件描述符为0,默认是键盘。使用0<或0<<。数据流向从右向左。

  1. [root@lanquark demo]# wc -l < /etc/passwd
  2. 22

标准输出(stdout):文件描述符为1,默认是屏幕。使用1>或1。数据流向从左向右。

  1. [root@lanquark demo]# ls -l > ls.txt
  2. [root@lanquark demo]# cat ls.txt
  3. total 8
  4. -rw-r--r-- 1 root root 0 Jun 1 07:27 1.txt
  5. -rw-r--r-- 1 root root 0 Jun 1 07:27 2.txt
  6. -rw-r--r--. 1 root root 16 May 21 00:58 f1.txt
  7. -rw-r--r-- 1 root root 0 May 21 19:46 f2.txt
  8. -rw-r--r-- 1 root root 0 Jun 1 07:44 ls.txt
  9. -rw-r--r-- 1 root root 1146 May 25 03:44 temp
  10. -rw-r--r-- 1 root root 0 Jun 1 07:28 txt
  11. //标准输出追加重定向>>
  12. [root@lanquark demo]# cat 1.txt
  13. 111
  14. [root@lanquark demo]# cat 1.txt > 2.txt
  15. [root@lanquark demo]# cat 1.txt >> 2.txt
  16. [root@lanquark demo]# cat 1.txt >> 2.txt
  17. [root@lanquark demo]# cat 2.txt
  18. 111
  19. 111
  20. 111

标准错误输出(stderr): 文件描述符为2,默认是屏幕。使用2>或2>>。数据流向从左向右。

  1. [root@lanquark demo]# ls bb.txt 2>err.txt
  2. [root@lanquark demo]# cat err.txt
  3. ls: cannot access bb.txt: No such file or directory

2>&1将标准错误输出和标准输出输出到同一位置。同 &>

  1. [root@lanquark demo]# ls 1.txt a.txt > ls.txt 2>&1
  2. [root@lanquark demo]# cat ls.txt
  3. ls: cannot access a.txt: No such file or directory
  4. 1.txt

内联输入重定向(inline input redirection,也就是here文档)

内联输入重定向符号是<<符号,示例如下

  1. command << marker
  2. data
  3. maker #是结束标志,
  4. cat >> test <<EOF
  5. hello
  6. how
  7. abour
  8. you
  9. EOF

六、管道符和作业控制

| 管道符,将前一个命令的标准输出自动发送给下一个命令的标准输入。

  1. [root@lanquark demo]# cat 1.txt | wc -l
  2. 20
  3. [root@lanquark demo]# cat 1.txt | grep error
  4. error

管道分流命令:tee 可将程序的输出同时发送到两个地方

  1. [root@lanquark demo]# ifconfig | tee ipconfig.txt
  2. ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  3. inet 10.0.1.213 netmask 255.255.255.0 broadcast 10.0.1.255
  4. inet6 fe80::c388:e67a:4ac3:6566 prefixlen 64 scopeid 0x20<link>
  5. ether 00:0c:29:91:d7:14 txqueuelen 1000 (Ethernet)
  6. RX packets 2321 bytes 200994 (196.2 KiB)
  7. RX errors 0 dropped 0 overruns 0 frame 0
  8. TX packets 835 bytes 127018 (124.0 KiB)
  9. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  10. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  11. inet 127.0.0.1 netmask 255.0.0.0
  12. inet6 ::1 prefixlen 128 scopeid 0x10<host>
  13. loop txqueuelen 1 (Local Loopback)
  14. RX packets 68 bytes 5900 (5.7 KiB)
  15. RX errors 0 dropped 0 overruns 0 frame 0
  16. TX packets 68 bytes 5900 (5.7 KiB)
  17. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  18. [root@lanquark demo]# cat ipconfig.txt
  19. ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  20. inet 10.0.1.213 netmask 255.255.255.0 broadcast 10.0.1.255
  21. inet6 fe80::c388:e67a:4ac3:6566 prefixlen 64 scopeid 0x20<link>
  22. ether 00:0c:29:91:d7:14 txqueuelen 1000 (Ethernet)
  23. RX packets 2321 bytes 200994 (196.2 KiB)
  24. RX errors 0 dropped 0 overruns 0 frame 0
  25. TX packets 835 bytes 127018 (124.0 KiB)
  26. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  27. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  28. inet 127.0.0.1 netmask 255.0.0.0
  29. inet6 ::1 prefixlen 128 scopeid 0x10<host>
  30. loop txqueuelen 1 (Local Loopback)
  31. RX packets 68 bytes 5900 (5.7 KiB)
  32. RX errors 0 dropped 0 overruns 0 frame 0
  33. TX packets 68 bytes 5900 (5.7 KiB)
  34. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

作业控制

ctrl+z 挂起一个任务到后台

  1. [root@lanquark demo]# sleep 1000
  2. ^Z
  3. [1]+ Stopped sleep 1000

jobs 查看后台任务列表

  1. [root@lanquark demo]# jobs
  2. [1]+ Stopped sleep 1000

bg 把任务放到后台去执行

  1. [root@lanquark demo]# bg
  2. [1]+ sleep 1000 &
  3. [root@lanquark demo]# jobs
  4. [1]+ Running sleep 1000 &

fg 把任务调到前台执行

  1. [root@lanquark demo]# fg
  2. sleep 1000

command & 将命令放到后台运行

  1. [root@lanquark demo]# sleep 2000 &
  2. [2] 1329

结束作业 kill %id(可以是进程id或作业号)

  1. //通过作业号结束
  2. [root@lanquark demo]# jobs
  3. [1]+ Stopped sleep 1000
  4. [2]- Running sleep 2000 &
  5. [root@lanquark demo]# kill %2
  6. [root@lanquark demo]# jobs
  7. [1]+ Stopped sleep 1000
  8. [2]- Terminated sleep 2000
  9. [root@lanquark demo]# jobs
  10. [1]+ Stopped sleep 1000
  11. //通过进程id结束
  12. [root@lanquark demo]# sleep 1000 &
  13. [1] 1345
  14. [root@lanquark demo]# kill 1345
  15. [1]+ Terminated sleep 1000
  16. [root@lanquark demo]# jobs
  17. [root@lanquark demo]#

Shell变量

shell变量的类型及定义方式

变量就是为某个信息片段所起的名字,标志内存中的一段地址。

shell变量的类型

1.环境变量:用来存储有关shell会话和工作环境的信息。

常用环境变量:PATH,HOME,PWD,LOGNAME

  1. [root@lanquark demo]# echo -e "$PATH\n$HOME\n$PWD\n$LOGNAME"
  2. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8/bin:/root/bin
  3. /root
  4. /root/demo
  5. root

全局环境变量,全局可用, env(显示全部环境变量)或printenv(显示个别 如printenv HOME)查看

  1. //env显示全部环境变量
  2. [root@lanquark demo]# env
  3. XDG_SESSION_ID=2
  4. HOSTNAME=lanquark.com
  5. TERM=xterm
  6. SHELL=/bin/bash
  7. HISTSIZE=1000
  8. SSH_CLIENT=10.0.1.229 2195 22
  9. SSH_TTY=/dev/pts/0
  10. JRE_HOME=/usr/local/jdk1.8/jre
  11. USER=root
  12. LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
  13. MAIL=/var/spool/mail/root
  14. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8/bin:/root/bin
  15. PWD=/root/demo
  16. JAVA_HOME=/usr/local/jdk1.8
  17. LANG=en_US.UTF-8
  18. HISTCONTROL=ignoredups
  19. SHLVL=1
  20. HOME=/root
  21. LOGNAME=root
  22. CLASSPATH=/usr/local/jdk1.8/lib/
  23. SSH_CONNECTION=10.0.1.229 2195 10.0.1.213 22
  24. LESSOPEN=||/usr/bin/lesspipe.sh %s
  25. XDG_RUNTIME_DIR=/run/user/0
  26. _=/usr/bin/env
  27. OLDPWD=/root
  28. //printenv显示单个环境变量值
  29. [root@lanquark demo]# printenv HOME
  30. /root

2.局部变量,只能在定义它的进程中可见。

3.自定义变量

变量名可以由一个字母、数字或下划线符号组成,不能以数字开头。长度不超过20个字符。变量名区分大小写,请留意:Var1 和var1不是同一个变量。

shell变量的定义方式一:variable=value

变量定义语句的等号两侧不能有空格。如var1=10,如果任意一侧有空格,shell都不会认为这是一个变量定义。

  1. //变量的定义
  2. [root@lanquark demo]# str='I love this game'
  3. [root@lanquark demo]# echo $str
  4. I love this game
  5. //不能以数字开头
  6. [root@lanquark demo]# 1str='aaa'
  7. -bash: 1str=aaa: command not found
  8. //等号两端不能有空格
  9. [root@lanquark demo]# name= terry
  10. -bash: terry: command not found
  11. //变量值有特殊字符时需要引用
  12. [root@lanquark demo]# str=I love this game
  13. bash: love: command not found
  14. [root@lanquark demo]# str="I love this game"
  15. [root@lanquark demo]# echo $str
  16. I love this game
  17. //变量的累加,推荐用花括号{}
  18. [root@lanquark demo]# str1='china'
  19. [root@lanquark demo]# str1="hello "
  20. [root@lanquark demo]# str2=${str1}world
  21. [root@lanquark demo]# echo $str2
  22. hello world

引用变量值的方式:在变量名前加$

  1. [root@lanquark demo]# str='I love this game'
  2. [root@lanquark demo]# echo $str
  3. I love this game

shell中的变量可以不用事先定义就直接引用,如果变量没有定义过,它就相当于是一个空变量,引用这样的空变量会返回一个空的字符串而不会报错。

  1. [root@lanquark demo]# echo $myname
  2. [root@lanquark demo]#

设置环境变量 (export),建议按以下方式来设定全局变量

变量名=值

export 变量名

export 变量名=值

  1. //定义方式1
  2. [root@lanquark demo]# myname='terry'
  3. [root@lanquark demo]# export myname
  4. [root@lanquark demo]# echo $myname
  5. terry
  6. [root@lanquark demo]# bash
  7. [root@lanquark demo]# echo $myname
  8. terry
  9. [root@lanquark demo]# env | grep myname
  10. myname=terry
  11. //定义方式2
  12. [root@lanquark demo]# export red='blue'
  13. [root@lanquark demo]# echo $red
  14. blue
  15. [root@lanquark demo]# bash
  16. [root@lanquark demo]# echo $red
  17. blue
  18. [root@lanquark demo]# env | grep -w red
  19. red=blue

查看所有的变量set(环境和自定义)

  1. BASH=/usr/bin/bash
  2. BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
  3. BASH_ALIASES=()
  4. BASH_ARGC=()
  5. BASH_ARGV=()
  6. BASH_CMDS=()
  7. BASH_LINENO=()
  8. BASH_SOURCE=()
  9. BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
  10. BASH_VERSION='4.2.46(2)-release'
  11. CLASSPATH=/usr/local/jdk1.8/lib/
  12. COLUMNS=87
  13. DIRSTACK=()
  14. EUID=0
  15. GROUPS=()
  16. HISTCONTROL=ignoredups
  17. HISTFILE=/root/.bash_history
  18. HISTFILESIZE=1000
  19. HISTSIZE=1000
  20. HOME=/root
  21. HOSTNAME=lanquark.com
  22. HOSTTYPE=x86_64
  23. ID=0
  24. IFS=$' \t\n'
  25. JAVA_HOME=/usr/local/jdk1.8
  26. JRE_HOME=/usr/local/jdk1.8/jre
  27. LANG=en_US.UTF-8
  28. LESSOPEN='||/usr/bin/lesspipe.sh %s'
  29. LINES=23
  30. LOGNAME=root
  31. LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
  32. MACHTYPE=x86_64-redhat-linux-gnu
  33. MAIL=/var/spool/mail/root
  34. MAILCHECK=60
  35. OPTERR=1
  36. OPTIND=1
  37. OSTYPE=linux-gnu
  38. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8/bin:/root/bin
  39. PIPESTATUS=([0]="0")
  40. PPID=1266
  41. PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
  42. PS1='[\u@\h \W]\$ '
  43. PS2='> '
  44. PS4='+ '
  45. PWD=/root/demo
  46. SHELL=/bin/bash
  47. SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  48. SHLVL=2
  49. SSH_CLIENT='10.0.1.229 2195 22'
  50. SSH_CONNECTION='10.0.1.229 2195 10.0.1.213 22'
  51. SSH_TTY=/dev/pts/0
  52. TERM=xterm
  53. UID=0
  54. USER=root
  55. XDG_RUNTIME_DIR=/run/user/0
  56. XDG_SESSION_ID=2
  57. _=game
  58. colors=/root/.dircolors
  59. myname=terry
  60. red=blue
  61. str='I love this game'

删除环境变量 unset

  1. [root@lanquark demo]# unset myname
  2. [root@lanquark demo]# echo $myname
  3. [root@lanquark demo]# env | grep myname
  4. [root@lanquark demo]#

同名的环境变量在父、子进程中是两个独立的变量,引用不同的存储空间,不能通过在子进程中修改其值来改变父进程中的变量值。

  1. [root@lanquark demo]# export myname=terry
  2. [root@lanquark demo]# echo $myname
  3. terry
  4. [root@lanquark demo]# bash
  5. [root@lanquark demo]# export myname=via
  6. [root@lanquark demo]# echo $myname
  7. via
  8. [root@lanquark demo]# exit
  9. exit
  10. [root@lanquark demo]# echo $myname
  11. terry

在子shell中删除全局变量后,你无法将效果反映到父shell中,不影响父shell

  1. [root@lanquark demo]# unset myname
  2. [root@lanquark demo]# export myname='terry'
  3. [root@lanquark demo]# echo $myname
  4. terry
  5. [root@lanquark demo]# bash
  6. [root@lanquark demo]# unset myname
  7. [root@lanquark demo]# echo $myname
  8. [root@lanquark demo]# exit
  9. exit
  10. [root@lanquark demo]# echo $myname
  11. terry

八、环境变量配置文件

登录shell和非登录shell

登录时启动的shell称为登录shell。其他shell称为非登录shell。

登录shell要求进行登录(一般是用用户名和密码登录)。

环境变量的配置文件分为两个层面:系统层面和用户层面

/etc/profile 定义系统级的环境变量,只有登录才执行。不建议去修改该文件。

如需定义系统级的环境变量,建议在/etc/profile.d/目录下定义。

/etc/bashrc主要定义了非登录shell的环境,用户不用登录

用户层用的配置文件

~/.bashrc

定义当前用户非登录shell的环境变量

~/.bash_profile

定义当前用户登录shell的环境变量

~/.bash_history

保存当前用户的命令历史列表

~/.bash_logout

定义用户退出shell里要执行的任务

  1. root@lanquark:~# echo Byebye >> ~/.bash_logout
  2. root@lanquark:~# logout
  3. Byebye
  4. Connection closing...Socket close.

如果用户需要自定义环境变量,建立在用户层面的配置文件中修改。 建议定义在/.bashrc中,因为/.bash_profile也会调用~/.bashrc。

  1. [root@lanquark ~]# cat ~/.bashrc
  2. # .bashrc
  3. # User specific aliases and functions
  4. alias rm='rm -i'
  5. alias cp='cp -i'
  6. alias mv='mv -i'
  7. # Source global definitions
  8. if [ -f /etc/bashrc ]; then
  9. . /etc/bashrc
  10. fi

修改后需执行一下配置文件

  1. [root@lanquark ~]# source ~/.bashrc

  2. [root@lanquark ~]# . ~/.bashrc

PS1环境变量的定义

PS1是定义的是命令提示符,可以通过自定的方式修改PS1的样式

  1. //默认
  2. [root@lanquark ~]# echo $PS1
  3. [\u@\h \W]\$
  4. //自定义
  5. [root@lanquark ~]# PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
  6. //变为绿色显示
  7. root@lanquark:~#
  8. //恢复为默认
  9. root@lanquark:~# PS1='[\u@\h \W]\$'
  10. //如需永久变更,可以写到入~/.bashrc文件中
  11. [root@lanquark ~]#vim ~/.bashrc
  12. //添加下行内容
  13. PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
  14. [root@lanquark ~]#. ~/.bashrc
  15. invoke /root/.bashrc
  16. root@lanquark:~#

九、bashrc和bash_profile的区别

测试环境

  1. [root@lanquark ~]# echo 'echo invoke ~/.bashrc'>>~/.bashrc
  2. [root@lanquark ~]# echo 'echo invoke ~/.bash_profile'>>~/.bash_profile

登录shell

终端登录

ssh远程登录

  1. Last login: Thu May 31 22:39:05 2018 from 10.0.1.229
  2. invoke /root/.bashrc
  3. invoke /root/.bash_profile

su切换登录

  1. [hjm@lanquark ~]$ su -
  2. Password:
  3. Last login: Thu May 31 22:41:53 EDT 2018 on tty1
  4. invoke /root/.bashrc
  5. invoke /root/.bash_profile
  6. [root@lanquark ~]#

非登录shell

  1. [root@lanquark ~]# bash
  2. invoke /root/.bashrc

结论:

1.登录shell会执行/.bash_profile和/.bashrc里的命令

2.非登录shell只会执行~/.bashrc里的命令

3.若要配置环境变量,最好是在~/.bashrc中配置,因为不管登录shell还是非登录shell都会执行

参考:http://ask.apelearn.com/question/7719

Linux shell基础知识(上)的更多相关文章

  1. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  2. Linux Shell 基础知识(二)

    1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...

  3. Linux Shell基础知识

    一.文件系统和安全 chmod命令 chmod命令有两种模式,一种是符号模式,用ugo执行用户,用rwx执行权限:另一种是绝对模式,用八进制不同位置的不同值来代表不同用户的不同权限. 符号模式 chm ...

  4. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  5. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  6. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  7. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  8. linux shell 基础 使用日志与心得

    linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现#!/bin/bash是指此脚本使用/bin/bash来解释执行.其中,#!是一个特殊的表示符,其后,跟着解释此脚 ...

  9. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

随机推荐

  1. JDK安装与配置(Windows 7系统)

    1.前言 安装之前需弄清JDK.JRE.JVM这几个概念,不然稀里糊涂不知道自己在装什么. (1)什么是java环境:我们知道,想听音乐就要安装音乐播放器,想看图片需要安装图片浏览器,同样道理,要运行 ...

  2. DRF之认证组件源码解析

    认证组件  认证的几种方法:cookie,session,token几种.但是session会使服务器的压力增大,所以我们经常使用的是token.获取唯一的随机字符串: 登陆携带token值的处理: ...

  3. consul 集群

    主机运行 : consul agent -server -bootstrap-expect 2  -data-dir D:\consul  -node=winyh -bind=192.168.10.1 ...

  4. (转) SpringMVC学习笔记-

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  5. 基于Docker的GoldenGate部署

    前言 Docker最近几年异常火爆,主要是因为其方便.快捷.轻量,相对于VM,它不需要占用太多资源,随时可以创建.删除,或在已有image上添加一些软件,再制作成另一个模板image供日后使用.Doc ...

  6. wrap

    import 'package:flutter/material.dart'; void main() { runApp(MaterialApp(home: new MyApp())); } clas ...

  7. Linux NFS挂载

    Linux NFS挂载 一.NFS挂载 192.25.10.101/home/sharedata/azkaban/ODS_HS08 挂载到 192.25.10.102/home/data_azkaba ...

  8. jQuery 字符串拼接

    jQuery 字符串拼接 // 字符串加变量拼接 $('#id 标签名[属性名="' + 变量 + '"]')

  9. C#方法过滤器

    方法过滤器 使用Emit和注解属性Attribute实现 使用方式 1. 自定义方法过滤器 可分别定义方法执行前过滤器, 方法执行结束过滤器, 方法异常过滤器 执行前过滤器继承 ExecutingFi ...

  10. (转载)C#关于DateTime得到的当前时间的格式和用法

    今天看到工程里有关DateTime的有关知识,之前了解一些用法,比如怎么获取年月日,当前系统时间等等,但是,感觉还是有好多不知道,于是上网搜罗了一下,找到很多有关知识,现在与大家分享下:   Date ...