shell基礎2

10月12日任務linux

8.6 管道符和做業控制shell

8.7/8.8 shell變量centos

8.9 環境變量配置文件bash

 

管道符 |

管道符的做用: 將其左邊命令的輸出做爲右邊命令的輸入app

例如:dom

[root@localhost ~]# cat /etc/passwd | grep 'root'
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

做業控制

  • ctrl + Z 能夠讓運行的進程暫停
# sleep命令 休眠命令
[root@centos7 ~]# sleep 100
^Z
[1]+  已中止               sleep 100
[root@centos7 ~]# sleep 200
^Z
[2]+  已中止               sleep 200
[root@centos7 ~]# sleep 1000
^Z
[3]+  已中止               sleep 1000
  • jobs 查看後臺進程
# 查看後臺的命令進程
[root@centos7 ~]# jobs
[1]   已中止               sleep 100
[2]-  已中止               sleep 200
[3]+  已中止               sleep 1000
  • fg 將後臺進程調用到前臺運行
# fg ID 調用特定的進程,讓其在前臺運行,不加ID默認調用最後一個
[root@centos7 ~]# fg 2
sleep 200
^Z
[2]+  已中止               sleep 200
  • bg 將前臺進程調到後臺運行,前臺能夠執行其餘命令
[root@localhost ~]# bg 1
[1] sleep 100 &
[root@localhost ~]# jobs
[1]   運行中               sleep 100 &
[2]-  已中止               sleep 200
[3]+  已中止               sleep 1000
  • & 使進程後臺運行
# &符號,讓命令在後臺運行,能夠使用fg命令調出至前臺
[root@centos7 ~]# sleep 10 &
[4] 1037

shell變量

環境變量:PATH、HOME、PWD、LOGNAME... SSH_TTY(當前終端號)ssh

獲取當前系統下的變量

  • env 命令(獲取的是系統內置環境變量)
# root用戶的系統系統環境變量,其餘用戶稍有不一樣;env命令不會顯示用戶自定義的變量!
[root@centos7 ~]# env
XDG_SESSION_ID=1
HOSTNAME=centos7
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.65.1 50839 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
...
  • set命令(除了系統內置的環境變量還會顯示用戶自定義的變量)
[root@localhost ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactiv
e_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(1)-release'
COLUMNS=74
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=zh_CN.UTF-8
...

變量命名規則

[root@localhost ~]# a_1=111
[root@localhost ~]# echo $a_1
111
  • 由字母、數字、下劃線組成,且首位不能爲數字

變量的值centos7

[root@localhost ~]# a='a b c'
[root@localhost ~]# echo $a
a b c
  • 值包含特殊符號,使用單引號包括(空格、$、#等)

變量的累加

[castiel@centos7 ~]$ a=1
[castiel@centos7 ~]$ b=2
[castiel@centos7 ~]$ echo $a$b
12

# 單引號會保留特殊符號
[castiel@centos7 ~]$ a='a$bc'
[castiel@centos7 ~]$ echo $a
a$bc

#雙引號會對特殊符號進行換算,在此以前,bc變量不存在,因此b=a
[castiel@centos7 ~]$ b="a$bc"
[castiel@centos7 ~]$ echo $b
a

# 當前$b爲a,c變量被賦值爲aac
[castiel@centos7 ~]$ c="a$b"c
[castiel@centos7 ~]$ echo $c
aac

全局變量

# 查看當前登陸的終端
[root@localhost ~]# echo $SSH_TTY
/dev/pts/0
  • 全局變量:在系統某個終端shell及其生成的子shell內都存在的變量;
  • 自定義變量:只在當前終端下有效的變量;

export命令能夠將shell內自定義的變量變爲全局變量,可是須要注意的是 export命令只在當前shell及其子shell下有效,在其父shell內是無效的!!!spa

概括總結code

  • 使用export命令生成的全局變量,在父shell內是無效的!
  • 在腳本內執行export命令能夠使由腳本生成的子shell共享自定義變量;
  • pstree命令能夠查看當前shell在整個進程樹的位置(yum install psmics)
# 子shell內設置全局變量a,在其(上行)父shell內該變量無效,其餘終端的shell內也無效!
[root@centos7 ~]# bash
[root@centos7 ~]# export a=123
[root@centos7 ~]# exit
exit
[root@centos7 ~]# echo $a

# 在當前shell內設置全局變量,其子shell內也有效
[root@centos7 ~]# export a=123
[root@centos7 ~]# echo $a
123
[root@centos7 ~]# bash
[root@centos7 ~]# echo $a
123

環境變量配置文件

系統層次

  • /etc/profile 用戶環境變量,在交互、登陸login時才執行
  • /etc/bashrc 交互non-login,執行shell就生效

用戶層次

  • ~/.bashrc
  • ~/.bash_profile
  • ~/.bash_history 當前shell內執行命令的歷史記錄
  • ~/.bash_logout 用戶退出登陸時執行的操做
# 在用戶退出時清空其歷史命令記錄
[root@localhost ~]# echo "echo > ~/.bash_history" >> ~./bash_logou

用戶的某些自定義需求命令能夠經過儲存在.bashrc.bash_profile文件內,使之在每次登陸shell時生效!!一樣的也能夠設置在.bash_logout文件內,使之退出後生效。

login和non-login shell的區別

  • 在機器上直接用戶密碼登陸,使用sshsu切換用戶登陸---login

  • 不登陸系統而使用ssh直接在遠程執行命令---non-login

  • 登陸系統後,打開一個新的teminal,該terminal登陸爲non-login !

login shell     調用.bash_profile文件
non-login shell 調用.bashrc文件

!注意:.bash_profile文件執行時也會調用.bashrc

結論:要想某些設置必定被shell調用,最好將其寫入bashrc文件中!!!

提示符

  • PS1 默認的提示符
[root@centos7 ~]# echo $PS1
[\u@\h \W]\$

\u 當前用戶
\h hostname
\W 當前目錄(相對路徑)
\w 當前目錄(絕對路徑)
\$ root爲#,普通用戶$
  • PS2 多行連續輸入換行行首提示符(例如for循環)
[root@centos7 ~]# echo $PS2
>
  • PS3 shell腳本使用select時的提示符
[root@centos7 ~]# echo $PS3
  • PS4 使用 set -x 跟蹤命令執行時的輸出前綴
[root@centos7 ~]# echo $PS4
+
相關文章
相關標籤/搜索