9.Shell基礎

wh50886發表於2020-10-29

Shell基礎

一、Shell概述

1、什麼是Shell

在這裡插入圖片描述

流程:ls等命令 >>shell >>核心(0101) >>shell>>命令返回結果

2、shell的分類

Linux的標準shell 是bash

在這裡插入圖片描述

Shell的兩種主要語法型別有Bourne和C,這兩種語法彼此不相容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh(Bash和zsh在不同程度上支援csh的語法)。我們可以通過/etc/shells檔案來查詢Linux支援的Shell。命令如下:

[root@localhost /]# vi /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

二、Shell指令碼的執行方式

1.echo命令

[root@localhost~]# echo [選項] [輸出內容]
選項:
-e:支援反斜線控制的字元轉換(具體參見表11-2)
-n:取消輸出後行末的換行符號(就是內容輸出後不換行)

例子1:

[root@localhost /]# echo “hao hao xue xi linux”
“hao hao xue xi linux”
#echo的內容就會列印到螢幕上。

例子2:

[root@localhost /]# echo -n “hao hao xue xi linux”
“hao hao xue xi linux”[root@localhost /]# 
#如果加入了“-n”選項,輸出內容結束後,不會換行直接顯示新行的提示符

在echo命令中如果使用了“-e”選項,則可以支援控制字元,如表所示:

在這裡插入圖片描述

例子3:\a輸出警告音

[root@localhost /]# echo -e "\\ \a"
\ 
#這個輸出會輸出\,同時會在系統音響中輸出一聲提示音

例子4:\b向左刪除

[root@localhost /]# echo -e "ab\bc"
ac
#這個輸出中,在b鍵左側有“\b”,所以輸出時只有ac

例子5:\t製表符;\n換行符

[root@localhost /]# echo -e "a\tb\tc\nd\te\tf\tg"
a	b	c
d	e	f	g
#我們加入了製表符“\t”和換行符“\n”,所以會按照格式輸出

例子6:\0nnn 按照8進位制ASCII碼錶輸出字元

[root@localhost /]# echo -e "\0141\t\0142\t\0143\n\0144\t\0145\t\0146\t\0147"
a	b	c
d	e	f	g
#還是會輸出上面的內容,不過是按照八進位制ASCII碼輸出的。
#也就是說141這個八進位制,在ASCII碼中代表小寫的“a”,其他的以此類推。

例子7:\xhh按照16進位制ASCII碼錶輸出字元

[root@localhost /]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
a	b	c
d	e	f
#如果按照十六進位制ASCII碼也同樣可以輸出

例子8:按顏色輸出

這條命令會把1234按照紅色輸出。解釋下這個命令**\e[1;** 是標準格式,代表顏色輸出開始,\e[0m代表顏色輸出結束,31m定義字型顏色是紅色。echo能夠識別的顏色如下:30m=黑色,31m=紅色,32m=綠色,33m=黃色,34m=藍色,35m=洋紅,36m=青色,37m=白色。

[root@localhost /]# echo -e "\e[1;32m 1234 \e[0m"
 1234 

例子9:背景顏色塊輸出

這條命令會給1234加入一個綠色的背景。echo可以使用的背景顏色如下:40m=黑色,41m=紅色,42m=綠色,43m=黃色,44m=藍色,45m=洋紅,46m=青色,47m=白色。

[root@localhost /]# echo -e "\e[1;41m 1234 \e[0m"
 1234

2.Shell指令碼的執行方法

[root@localhost /]# vi hello.sh
#!/bin/bash
echo "hello word! "

Shell指令碼寫好了,那麼這個指令碼該如何執行呢?在Linux中指令碼的執行主要有這樣兩種種方法:

第一種:賦予執行許可權,直接執行

這種方法是最常用的Shell指令碼執行方法,也最為直接簡單。就是賦予執行許可權之後,直接執行。當然執行時可以使用絕對路徑,也可以使用相對路徑執行。命令如下:

[root@localhost /]# chmod +755 hello.sh
[root@localhost /]# ./hello.sh 
hello word! 

第二種:通過Bash呼叫執行指令碼

[root@localhost /]# bash hello.sh
hello word! 

三、Bash的基本功能

1.歷史命令(history)

1)歷史命令的檢視

[root@localhost~]# history [選項] [歷史命令儲存檔案]
選項:
-c:清空歷史命令
-w:把快取中的歷史命令寫入歷史命令儲存檔案。如果不手工指定歷史命令儲存檔案,則放入預設歷史命令儲存檔案~/.bash_history中

預設儲存1000行資料,需要修改則在如下檔案中修改

[root@localhost ~]# vim /etc/profile
...省略部分輸出
HISTSIZE=1000
...省略部分輸出

我們使用history命令檢視的歷史命令和~/.bash_history檔案中儲存的歷史命令是不同的。

那是因為當前登入操作的命令並沒有直接寫入~/.bash_history檔案,而是儲存在快取當中的。

需要等當前使用者登出之後,快取中的命令才會寫入~/.bash_history檔案。

如果我們需要把記憶體中的命令直接寫入~/.bash_history檔案,而不等使用者登出時再寫入,就需要使用“-w”選項了。命令如下:

[root@localhost ~]# history -w
#把快取中的命令寫入~/.bash_history檔案中

如果需要清空歷史命令,命令如下

[root@localhost ~]# history -c
#清空歷史命令sh

2)歷史命令的呼叫

如果想要使用原先的歷史命令有這樣幾種方法:

  • 使用上、下箭頭呼叫以前的歷史命令
  • 使用**“!n”**重複執行第n條歷史命令
  • 使用**“!!”**重複執行上一條命令
  • 使用**“!字串”**重複執行最後一條以該字串開頭的命令
  • 使用**“!$”**重複上一條命令的最後一個引數

2.命令與檔案的補全tab

tab

3.命令別名(alias)

命令格式:

#查詢命令別名
[root@localhost ~]# alias
例:查詢系統中已經定義好的別名
[root@localhost ~]# alias 
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'

#設定命令別名
[root@localhost ~]# alias 別名=原命令
#定義vim命令的別名是vi
[root@localhost ~]# alias vi='vim'

既然我們說別名的優先順序比命令高,那麼命令執行時具體的順序是什麼呢?命令執行時的順序是這樣的:
1、第一順位執行用絕對路徑或相對路徑執行的命令。
2、第二順位執行別名。
3、第三順位執行Bash的內部命令。
4、第四順位執行按照$PATH環境變數定義的目錄查詢順序找到的第一個命令。

永久生效

為了讓這個別名永久生效,可以把別名寫入環境變數配置檔案“~/.bashrc”。命令如下:

[root@localhost ~]# vi /root/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi='vim'
alias ser='systemctl restart firewall'
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
#立即生效命令
[root@localhost ~]# source .bashrc
#或者將source改為.  ,含義一樣
[root@localhost ~]# . .bashrc

4.Bash常用快捷鍵(ctrl+字母)

在這裡插入圖片描述

在這裡插入圖片描述

5.輸入輸出重定向

1)Bash的標準輸入輸出

裝置裝置檔名檔案描述符型別
鍵盤/dev/stdin0標準輸入
顯示器/dev/stdout1標準輸出
顯示器/dev/stderr2標準錯誤輸出

2)輸出重定向

輸出標準是輸出到顯示器上,輸出重定向含義:是將命令輸出結果由顯示到顯示器改變到儲存到檔案中
在這裡插入圖片描述

常用:
在這裡插入圖片描述

正確輸出和錯誤輸出同時存放到一個資料夾info

[root@localhost ~]# pwd>>info 2>&1
[root@localhost ~]# pwd&>>info

正確輸出和錯誤輸出分別存放到一個資料夾

正確輸出到ok錯誤輸出到err

[root@localhost ~]# ls>>ok 2>>err

3)輸入重定向

[root@localhost ~]# wc [選項] [檔名]
-c 統計位元組數
-w 統計單詞數
-l 統計行數
#不加引數預設
[root@localhost ~]# wc  /etc/profile
 76   253    1820 /etc/profile
行數   單詞數  位元組數
#輸入重定向
[root@localhost ~]# wc < /etc/profile
  76  253 1820
#
[root@localhost ~]# wc << 1112    #舉例1112開頭
> 2
> dsadas
> faf
> 1112                            #舉例1112結束
 3  3 13
 [root@localhost ~]# wc << 666    #舉例666開頭
> 12
> 34
> dyhasifhias
> 666                             #舉例666結束 
 3  3 18

6.多命令順序執行( ; 、&&、||)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-iXUUbQSr-1603980666789)(9.Shell基礎.assets/image-20201009201716459.png)]

;舉例

[root@localhost ~]# ls ; date ;cd /etc/
111  222  anaconda-ks.cfg  disk1  disk5
2020年 10月 09日 星期五 20:14:29 CST

&&舉例

#正確
[root@localhost /]# ls && echo yes
20201003  boot  disk1  etc       home  lib64  mnt  proc  run   srv  tmp  var
bin       dev   disk5  hello.sh  lib   media  opt  root  sbin  sys  usr
yes
#錯誤
[root@localhost /]# lss && echo yes
-bash: lss: 未找到命令                           #會立即停止執行第二條命令

||舉例

[root@localhost /]# lss || echo no
-bash: lss: 未找到命令
no
[root@localhost /]# ls || echo no
20201003  boot  disk1  etc       home  lib64  mnt  proc  run   srv  tmp  var
bin       dev   disk5  hello.sh  lib   media  opt  root  sbin  sys  usr

實際應用判斷命令是否正確

#正確執行輸出yes,錯誤執行輸出no
[root@localhost /]# ls && echo yes || echo no
20201003  boot  disk1  etc       home  lib64  mnt  proc  run   srv  tmp  var
bin       dev   disk5  hello.sh  lib   media  opt  root  sbin  sys  usr
yes
[root@localhost /]# lss && echo yes || echo no
-bash: lss: 未找到命令
no

7.管道符(|)

1)行提取命令gerp

[root@localhost~]# grep [選項] “搜尋內容” 檔名
選項:
-A 數字:        列出符合條件的行,並列出後續的n行
-B 數字:        列出符合條件的行,並列出前面的n行
-c:            統計找到的符合條件的字串的次數
-i:            忽略大小寫
-n:            輸出行號
-v:            反向查詢
--color=auto    搜尋出的關鍵字用顏色顯示

舉例1:

#查詢使用者資訊檔案/etc/passwd中,有多少可以登入的使用者
[root@localhost /]# grep "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash

舉例2:

#查詢使用者資訊檔案/etc/passwd中,包含root欄位的行,並列出後續的3行
[root@localhost /]# grep -A 3 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

#查詢使用者資訊檔案/etc/passwd中,包含root欄位的行,並列出前面的5行
[root@localhost /]# grep -B 3 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

#查詢使用者資訊檔案/etc/passwd中,可登入的使用者,並顯示行號
[root@localhost /]# grep -n  "/bin/bash" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash

##查詢使用者資訊檔案/etc/passwd中,不包含/bin/bash的使用者,即不可登入的使用者(查詢偽使用者)
[root@localhost /]# grep -v  "/bin/bash" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

2)find與grep的區別

find命令:

find命令是在系統當中搜尋符合條件的檔名,如果需要模糊查詢,使用萬用字元進行匹配,搜尋時檔名是完全匹配。

#建立abc檔案
[root@localhost /]# touch abc
#建立abcd檔案
[root@localhost /]# touch abcd
#搜尋檔名是abc的檔案,只會找到abc檔案,而不會找到檔案abcd
#雖然abcd檔名中包含abc,但是find是完全匹配,只能和要搜尋的資料完全一樣,才能找到
[root@localhost /]# find / -name "abc"
/abc
#注意:find命令是可以通過-regex選項識別正規表示式規則的,也就是說find命令可以按照正規表示式規則匹配,而正規表示式是模糊匹配。但是對於初學者而言,find命令和grep命令本身就不好理解,所以我們這裡只按照萬用字元規則來進行find查詢。

grep命令:

grep命令是在檔案當中搜尋符合條件的字串,如果需要模糊查詢,使用正規表示式進行匹配,搜尋時字串是包含匹配。

#在test檔案中寫入abc
[root@localhost /]# echo abc > test
#在test檔案中追加寫入abcd
[root@localhost /]# echo abcd >> test
##grep命令查詢時,只要資料行中包含有abc,就會都列出
#所以abc和abcd都可以查詢到
[root@localhost /]# grep "abc" test 
abcd
abc

3)管道符

多命令順序執行

#檢視詳細目錄資訊並分頁展示
[root@localhost /]# ll -a | more
總用量 36
dr-xr-xr-x.  20 root root 4096 10月  9 21:12 .
dr-xr-xr-x.  20 root root 4096 10月  9 21:12 ..
drwxr-xr-x.   2 root root    6 10月  3 19:50 20201003
-rw-r--r--.   1 root root    4 10月  9 21:30 abc
-rw-r--r--.   1 root root    0 10月  9 21:03 abcd
lrwxrwxrwx.   1 root root    7 7月   2 01:15 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 7月   8 22:02 boot
drwxr-xr-x.  21 root root 3380 10月  9 20:13 dev
drwxr-xr-x.   2 root root    6 9月   9 20:12 disk1
drwxr-xr-x.   2 root root    6 9月   9 20:12 disk5
drwxr-xr-x.  77 root root 8192 10月  9 20:13 etc
-rwxr-xr-x.   1 root root   32 10月  5 11:10 hello.sh
drwxr-xr-x.   5 root root  174 7月   3 22:50 home
lrwxrwxrwx.   1 root root    7 7月   2 01:15 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 7月   2 01:15 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 4月  11 2018 media
#查詢下本地所有網路連線,提取包含ESTABLISHED(已建立連線)的行
[root@localhost /]# netstat -an | grep "ESTABLISHED"
tcp        0      0 192.168.253.177:22      192.168.253.1:44523     ESTABLISHED
#如果想知道具體的網路連線數量,就可以再使用wc命令統計行數
[root@localhost /]# netstat -an | grep "ESTABLISHED" | wc -l
1
#查詢程式中tomcat程式
[root@localhost /]# ps -ef |grep tomcat
#查詢已安裝rpm中的python包
[root@localhost /]# rpm -qa | grep python
python-firewall-0.6.3-8.el7_8.1.noarch
python-pycurl-7.19.0-19.el7.x86_64
dbus-python-1.1.1-9.el7.x86_64

8.萬用字元( ?、 *、 [] 、[-]、 [^] )

萬用字元:用於匹配

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4ETCDt43-1603980666792)(9.Shell基礎.assets/image-20201009214714266.png)]

#建立幾個測試檔案
[root@localhost tmp]# touch abc abcd 012 0abc
[root@localhost tmp]# ls
012  0abc  abc  abcd
#“*”代表所有檔案
[root@localhost tmp]# find . -name "*"
./abc
./abcd
./012
./0abc
[root@localhost tmp]# ls *
012  0abc  abc  abcd
#“?”匹配任意一個字元所以會匹配0abc
#但是不能匹配abc,因為“?”不能匹配空
[root@localhost tmp]# find . -name "?abc"
./0abc
[root@localhost tmp]# ls ?abc
0abc
#匹配任何以數字開頭的檔案
[root@localhost tmp]# find . -name "[0-9]*"
./012
./0abc
[root@localhost tmp]# ls [0-9]*
012  0abc
#匹配任何不以數字開頭的檔案
[root@localhost tmp]# find . -name "[^0-9]*"
./abc
./abcd
[root@localhost tmp]# ls [^0-9]*
abc  abcd

*可以匹配0個或多個任意字元

舉例

#查詢abc以及abcd檔案
[root@localhost ~]# ls
abc  abcd  acc  adc  aec  anaconda-ks.cfg
[root@localhost /]# find . -name "abc*"
./abc
./abcd
#刪除某個目錄下所有檔案
[root@localhost /]# rm -rf /tmp/*

?匹配任意1個字元

舉例

[root@localhost ~]# ls
abc  abcd  acc  adc  aec  anaconda-ks.cfg
[root@localhost ~]# find . -name "a?c"
./abc
./acc
./adc
./aec

[]匹配中括號中任意一個字元

舉例

[root@localhost ~]# ls
abc  abcd  acc  adc  aec  anaconda-ks.cfg
[root@localhost ~]# find . -name "a[bc]c"
./abc
./acc

[-] -代表匹配一個小寫字母

[root@localhost ~]# ls
abc  abcd  acc  adc  aec  anaconda-ks.cfg
[root@localhost ~]# find . -name "a[a-d]c"
./abc
./acc
./adc

[]去反

[root@localhost ~]# ls
abc  abcd  acc  adc  aec  anaconda-ks.cfg
[root@localhost ~]# find . -name "a[^a-d]c"
./aec

9.Bash中其他特殊符號

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-b8Po5M58-1603980666794)(9.Shell基礎.assets/image-20201010224045604.png)]

1)單引號和雙引號

單引號標註輸出均為普通符號

‘$’舉例
#定義變數name的職為wh
[root@localhost ~]# name=wh
#如果輸出使用單引號,則$name按普通字元輸出
[root@localhost ~]# echo '$name'
$name
#如果輸出使用雙引號,則會輸出變數 name的職wh
[root@localhost ~]# echo "$name"
wh

‘``’舉例
#反引號括起來的命令會正常執行
[root@localhost ~]# echo `date`
2020年 10月 10日 星期六 22:37:40 CST
#如果反引號命令被單引號括起來,那這個命令不會執行,`date`會被當成普通字元輸出
[root@localhost ~]# echo '`date`'
`date`
#如果是雙引號括起來,那麼這個命令會正常執行
[root@localhost ~]# echo "`date`"
2020年 10月 10日 星期六 22:37:59 CST

雙引號

‘$’舉例
#定義變數name的職為wh
[root@localhost ~]# name=wh
#如果輸出使用雙引號,則會輸出變數 name的職wh
[root@localhost ~]# echo "$name"
wh

‘``’舉例
#反引號括起來的命令會正常執行
[root@localhost ~]# echo `date`
2020年 10月 10日 星期六 22:37:40 CST
#如果是雙引號括起來,那麼這個命令會正常執行
[root@localhost ~]# echo "`date`"
2020年 10月 10日 星期六 22:37:59 CST

2)反引號和$()

#如果命令不用反引號包含,命令不會執行,而是直接輸出
[root@localhost ~]# echo date
date
#只有用反引號包括命令,這個命令才會執行
[root@localhost ~]# echo `date`
2020年 10月 10日 星期六 22:42:00 CST
#使用$(命令)的方式也是可以的
[root@localhost ~]# echo $(date)
2020年 10月 10日 星期六 22:42:39 CST

3)小括號、中括號

在介紹小括號和大括號的區別之前,我們先要解釋一個概念,那就是父Shell和子Shell。在我們的Bash中,是可以呼叫新的Bash的,比如:

[root@localhost ~]# bash
這時,我們通過pstree命令檢視一下程式數:
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
....省略部分
        ├─sshd───sshd───bash───bash───pstree

知道了父Shell和子Shell,我們接著解釋小括號和大括號的區別。如果是用於一串命令的執行,那麼小括號和大括號的主要區別在於

  • ()執行一串命令時,需要重新開一個子shell進行執行
  • {}執行一串命令時,是在當前shell執行;
  • ()和{}都是把一串的命令放在括號裡面,並且命令之間用;號隔開;
  • ()最後一個命令可以不用分號;
  • {}最後一個命令要用分號;
  • {}的第一個命令和左括號之間必須要有一個空格;
  • ()裡的各命令不必和括號有空格;
  • ()和{}括號裡面的某個命令的重定向隻影響該命令,但括號外的重定向則影響到括號裡的所有命令。
#在父Shell中定義變數name的值是wh
[root@localhost ~]# name=wh
#如果用()括起來一串命令,這些命令都可以執行
#給name變數重新賦值,但是這個值只在子Shell中生效
[root@localhost ~]# (name=sxn;echo $name)
sxn
#父Shell中name的值還是wh,而不是sxn
[root@localhost ~]# echo $name
wh
#但是用大括號來進行一串命令的執行時,name變數的修改是直接在父Shell當中的
#注意大括號的格式(第一個命令和左括號之間必須要有一個空格;命令之間用;號隔開;最後一個命令後要用分號;)
[root@localhost ~]# { name=sxn;echo $name; }
sxn
#所以name變數的值已經被修改了
[root@localhost ~]# echo $name
sxn

4)#、&、\轉義符

#:註釋

$:呼叫變數值

[root@localhost ~]# name=wh
[root@localhost ~]# echo $name
wh

\:轉義符,轉義符,跟在\之後的特殊符號將失去特殊含義,變為普通字元。如\ 將 輸 出 “ 將 輸出“ ”符號,而不當做是變數引用。

[root@localhost ~]# name=wh
[root@localhost ~]# echo \$name
$name

四、Bash的變數和運算子

1.什麼是變數

在定義變數時,有一些規則需要遵守:

  • 變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。如果變數名是“2name”則是錯誤的。

  • 在Bash中,變數的預設型別都是字串型,如果要進行數值運算,則必修指定變數型別為數值型

  • 變數用等號連線值,等號左右兩側不能有空格

  • 變數的值如果有空格,需要使用單引號或雙引號包括。如:“test=”hello world!””。其中雙引號括起來的內容“$”、“\”和反引號都擁有特殊含義,而單引號括起來的內容都是普通字元。

  • 在變數的值中,可以使用“\”轉義符。

  • 如果需要增加變數的值,那麼可以進行變數值的疊加。

  • 變數需要用雙引號包含” 變 量 名 ” 或 用 變數名”或用 (變數名)包含變數名。例如:

  • 環境變數名建議大寫,便於區分。

變數疊加

#疊加變數test,變數值變成了123456
[root@localhost ~]# test=123
[root@localhost ~]# test="$test"456
[root@localhost ~]# echo $test
123456

變數值的疊加可以使用兩種格式:“ 變 量 名 ” 或 變數名”或 (變數名)
如果是把命令的結果作為變數值賦予變數,則需要使用反引號或$()包含命令。例如:

[root@localhost ~]# test=$(date)
[root@localhost ~]# echo $test
2020年 10月 20日 星期二 20:41:15 CST

2、變數的分類

◇使用者自定義變數:這種變數是最常見的變數,由使用者自由定義變數名和變數的值。
◇環境變數:這種變數中主要儲存的是和系統操作環境相關的資料,比如當前登入使用者,使用者的家目錄,命令的提示符等。不是太好理解吧,那麼大家還記得在Windows中,同一臺電腦可以有多個使用者登入,而且每個使用者都可以定義自己的桌面樣式和解析度,這些其實就是Windows的操作環境,可以當做是Windows的環境變數來理解。環境變數的變數名可以自由定義,但是一般對系統起作用的環境變數的變數名是系統預先設定好的。
◇位置引數變數:這種變數主要是用來向指令碼當中傳遞引數或資料的,變數名不能自定義,變數作用是固定的。
◇預定義變數:是Bash中已經定義好的變數,變數名不能自定義,變數作用也是固定的。

變數分類
1.使用者自定義變數名稱:自定義作用:自定義內容:自定義
2.環境變數:
1)使用者自定義環境變數名稱:自定義作用:自定義內容:自定義
2)系統自帶環境變數名稱:確定作用:確定內容:自定義
3.位置引數變數名稱:確定作用:確定內容:自定義
4.預定義變數名稱:確定作用:確定內容:自定義

3、使用者自定義變數

1)、變數定義

#變數名不能用數字開頭
[root@localhost ~]# 2name=wanghui
-bash: 2name=wanghui: 未找到命令
#等號左右兩側不能有空格
[root@localhost ~]# name = wanghui
-bash: name: 未找到命令
#變數的值如果有空格,必須用引號包含
[root@localhost ~]# name=wang hui
-bash: hui: 未找到命令

2)、變數呼叫

#定義變數name
[root@localhost ~]# name=wanghui
#輸出變數name的值
[root@localhost ~]# echo $name
wanghui

3)、變數檢視 (set)

[root@localhost~]# set [選項]
選項:
-u:如果設定此選項,呼叫未宣告變數時會報錯(預設無任何提示)
-x.如果設定此選項,在命令執行之前,會把命令先輸出一次
#直接使用set命令,會查詢系統中所有的變數,包含使用者自定義變數和環境變數
[root@localhost ~]# set
BASH=/bin/bash
...省略部分輸出
name=wanghui
test='2020年 10月 20日 星期二 20:41:15 CST'
#當設定了-u選項後,如果呼叫沒有設定的變數會有報錯。預設是沒有任何輸出的。
[root@localhost ~]# set -u 
[root@localhost ~]# echo $wanghui
-bash: wanghui: 未繫結變數
#如果設定了-x選項,會在每個命令執行之前,先把命令輸出一次(無實際意義)
[root@localhost ~]# set -x
++ printf '\033]0;%s@%s:%s\007' root localhost '~'
[root@localhost ~]# ls
+ ls --color=auto
111  abc  abcd  abcde  acc  adc  aec  anaconda-ks.cfg
++ printf '\033]0;%s@%s:%s\007' root localhost '~'

4)、變數刪除 (unset)

[root@localhost~]# unset 變數名

4.環境變數

1)、宣告環境變數設定(export)

#使用export宣告的變數即是環境變數
[root@localhost ~]# export name=wanghui
[root@localhost ~]# env | grep name
name=wanghui

2)、環境變數刪除(unset)

#刪除環境變數
[root@localhost ~]# unset name
[root@localhost ~]# env | grep name

3)、環境變數查詢(env、set)

env命令和set命令的區別是,set命令可以檢視所有變數,而env命令只能檢視環境變數。

env命令可以查詢到所有的環境變數,可是還有一些變數雖然不是環境變數,卻是和Bash操作介面相關的變數,這些變數也對我們的Bashh操作終端起到了重要的作用。這些變數就只能用set命令來檢視了,

#env
[root@localhost ~]# env
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
age=18

在這裡插入圖片描述
在這裡插入圖片描述

#set
[root@localhost ~]# set
BASH=/bin/bash
...省略部分輸出
name=wanghui
test='2020年 10月 20日 星期二 20:41:15 CST'

在這裡插入圖片描述

4)、PATH環境變數(查詢命令路徑變數)

系統查詢命令的路徑

PATH變數的值是用“:”分割的路徑,這些路徑就是系統查詢命令的路徑。也就是說當我們輸入了一個程式名,如果沒有寫入路徑,系統就會到PATH變數定義的路徑中去尋找,是否有可以執行的程式。如果找到則執行,否則會報“命令沒有發現”的錯誤。

#先查詢下PATH環境變數的值
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

我們把自己的指令碼拷貝到PATH變數定義的路徑中,我們自己寫的指令碼也可以不輸入路徑而直接執行

#拷貝hello.sh到/bin目錄
[root@localhost~]# cp /root/sh/hello /bin/
#hello可以直接執行了
[root@localhost~]# hello
111111111111111

我們也可以修改PATH變數的值,而不是把程式指令碼複製到/bin/目錄中。我們通過變數的疊加就可以實現了,當然我們這樣定義的PATH變數只是臨時生效,一旦重啟或登出就會消失,如果想要永久生效,需要寫入環境變數配置檔案,

#在變數PATH的後面,加入/root/sh目錄
[root@localhost sh]# PATH="$PATH":/root/sh/
#查詢PATH的值,變數疊加生效了
[root@localhost sh]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/sh/

5)、PS1環境變數(命令提示符)

命令提示符設定

#標準提示符
[root@localhost sh]# echo $PS1
[\u@\h \W]\$

PS1是一個很有意思的變數,是用來定義命令列的提示符的,可以安裝我們自己的需求來定義自己喜歡的提示符。PS1可以支援以下這些選項
在這裡插入圖片描述

在PS1變數中,如果是可以解釋的符號,如“\u”、“\h”等,則顯示這個符號的作用。如果是不能解釋的符號,如“@”或“空格”,則原符號輸出。那麼我們修改下PS1變數,看看會出現什麼情況吧:

#提示符輸出變味了顯示完整主機名、以及顯示當前所在目錄的完整目錄(注意用單引號)
[root@localhost.localdomain ~/sh]#PS1='[\u@\H \w]\$ '
[root@localhost.localdomain ~/sh]# ls
[root@localhost.localdomain /home]# cd /home/ldt/
[root@localhost.localdomain /home/ldt]# 

6)、LANG語系變數

LANG變數定義了Linux系統的主語系環境,這個變數的預設值是

#預設中文語系
[root@localhost ldt]# echo $LANG
zh_CN.UTF-8
#支援多少語系檢視命令為
[root@localhost ldt]# locale -a
...
[root@localhost ldt]# locale -a |wc -l
791
#檢視當前語系命令
[root@localhost ldt]# locale 
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
#centos7預設語系設定
[root@localhost sysconfig]# cat /etc/locale.conf 
LANG="zh_CN.UTF-8"
#centos6預設語系檢視方式
[root@localhostsrc]# cat /etc/sysconfig/i18n
LANG=”zhCN.UTF-8”

5.位置引數變數( n 、 n、 n*、 @ 、 @、 @#)

位置引數變數作用
$nn為數字,$0代表命令本身,$1-$9代表第1個到第9個引數,十個以上引數需要用大括號包含,如$10}.
$*這個變數代表命令列中所有的引數,$*把所有的引數看成一個整體
$@這個變數也代表命令列中所有的引數,不過$@把每個引數區分對待
$#這個變數代表命令列中所有引數的個數

1)$n舉例

#建立檔案
[root@localhost sh]# vi count.sh 
#!/bin/bash
#給a變數賦值為$1
a=$1
#給b變數賦值為$2
b=$2
#變數sum的值為變數1和變數2的和
sum=$(( $a+$b))
#輸出sum變數
echo $sum
#$0舉例,輸出命令本身
echo $0
[root@localhost sh]# chmod 755 count.sh 
[root@localhost sh]# ./count.sh 22 33
55
./count.sh

2) ∗ 、 *、 @、$#舉例

[root@localhost sh]# vi para.sh

#!/bin/bash
#$*代表所有引數為整體
echo '$*' is $*
#$@代表所有引數區分對待
echo '$@' is $@
#$#代表引數個數
echo '$#' is $#
[root@localhost sh]# chmod 755 para.sh 
[root@localhost sh]# ./para.sh 11 22 33 44 55 66
$* is 11 22 33 44 55 66
$@ is 11 22 33 44 55 66
$# is 6

3) ∗ 、 *、 @區分

[root@localhost sh]# vi para2.sh
#!/bin/bash
#定義for迴圈,in後面有幾個值,for會迴圈多少次,注意"$*"需要用雙引號(呼叫變數的值)
#Shell把$*的所有引數堪稱是一個整體,所以這個迴圈只會迴圈1次。
for i in "$*"
   do
   echo $i
   done
echo ===================
#定義for迴圈,in後面有幾個值,for會迴圈多少次,注意"$@"需要用雙引號(呼叫變數的值)
#Shell把$@的所有引數區分對待,所以這個迴圈有幾個引數會迴圈多少次
for y in "$@"
   do
   echo $y
   done

[root@localhost sh]# chmod 755 para2.sh
[root@localhost sh]# ./para2.sh 11 22 33 44 55
11 22 33 44 55
===================
11
22
33
44
55

6.預定義變數($?)

主要用到$?判斷上一條命令是否正確執行,其餘次要

預定義變數作用
$?最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一$?個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。
$$當前程式的程式號(PID)
$!後臺執行的最後一個程式的程式號(PID)

1)$?

#ls正確執行
[root@localhost sh]# ls
count.sh  hello  para2.sh  para.sh  wh
#輸出$?,返回值為0,說明上一條命令正確執行
[root@localhost sh]# echo $?
0
#llls不存在此命令
[root@localhost sh]# llls
-bash: llls: 未找到命令
#輸出$?,返回值不為0,說明上一條命令未正確執行
[root@localhost sh]# echo $?
127

2)$ 、 、 !

[root@localhost sh]# vi ydy.sh
#!/bin/bash
#輸出當前程式的pid,此pid為執行ydy.sh時生產的程式pid
echo "ydy bl is $$"
#使用find命令在root目錄下查詢hello.sh,符號&的意思是把命令放入後臺執行
find /root -name hell.sh &
#輸出後臺執行命令的程式id,也就是find的命令的pid
echo "The ydy bl de ht is $!"
[root@localhost sh]# chmod 755 ydy.sh 
[root@localhost sh]# ./ydy.sh 
ydy bl is 1942
The ydy bl de ht is 1943

7.read接收鍵盤輸入(-p、-t、-n、-s)

[root@localhost ~]# read [引數] [變數名]
引數:
-p “提示資訊”  在等待read輸入時,輸出提示資訊
-t 秒數       read命令會一直等待使用者輸入,使用此選項可以指定等待時間
-n 字元數     read命令只接受指定的字元數,就會執行
-s 隱藏顯示    隱藏輸入的資料,適用於機密資訊的輸入

舉例

#-p、-t舉例
[root@localhost sh]# vi count2.sh
#!/bin/bash
#-t等待30秒,-p輸出提示語please input a num1,num2
read -t 30 -p "please input a num1:" num1
read -t 30 -p "please input a num2:" num2
sum=$(($num1 + $num2))
echo $sum
[root@localhost sh]# chmod 755 count2.sh 
[root@localhost sh]# ./count2.sh 
please input a num1:1
please input a num2:3
4
================================================================
#-n、-s舉例
[root@localhost sh]# vi count2.sh
#!/bin/bash
#-t等待30秒,-p輸出提示語please input a num1,num2
#指定num1輸入兩個字元
read  -n 2 -t 30 -p "please input a num1:" num1
#換行顯示
echo -e 
#指定num2隱藏輸入資料
read -t 30 -s -p "please input a num2:" num2
echo -e 
sum=$(($num1 + $num2))
echo $sum
[root@localhost sh]# chmod 755 count2.sh 
[root@localhost sh]# ./count2.sh 
please input a num1:12
#隱藏輸入45
please input a num2:
45

8.Shell的運算子

1)declare宣告變數型別

[root@localhost~] # declare [+/-] [引數] 變數名
[引數]
-:給變數設定型別屬性
+:取消變數的型別屬性
-a:將變數宣告為陣列型
-i:將變數宣告為整數型(integer)
-r:講變數宣告為只讀變數。注意,一旦設定為只讀變數,既不能修改變數的值,
也不能刪除變數,甚至不能通過+r取消只讀屬性
-x:將變數宣告為環境變數
-p:顯示指定變數的被宣告的型別

舉例一:數值運算(declare -i)

#不進行變數宣告,系統預設所有都為字串輸出
[root@localhost sh]# a=1
[root@localhost sh]# b=2
[root@localhost sh]# c=$a+$b
[root@localhost sh]# echo $c
1+2
#宣告$c為整數型,輸出則為a和b的和
[root@localhost sh]# a=1
[root@localhost sh]# b=2
[root@localhost sh]# declare -i c=$a+$b
[root@localhost sh]# echo $c
3

舉例二:陣列變數型別(declare -a)

**概念:**所謂陣列,就是相同資料型別的元素按一定順序排列的集合,就是把有限個型別相同的變數用一個名字命名,然後用編號區分他們的變數的集合,這個名字稱為陣列名,編號稱為下標。組成陣列的各個變數成為陣列的分量,也稱為陣列的元素,有時也稱為下標變數。

**通俗來講:**變數和陣列都是用來儲存資料的,只是變數只能賦予一個資料值,一旦重複複製,後一個值就會覆蓋前一個值。而陣列是可以賦予一組相同型別的資料值。大家可以把變數想象成一個小辦公室,這個辦公室只能容納一個人辦公,辦公室名就是變數名。而陣列是一個大辦公室,可以容納很多人同時辦公,在這個大辦公室辦公的每個人是通過不同的座位號來區分的,這個座位號就是陣列的下標,而大辦公室的名字就是陣列名。

#完整陣列寫法
[root@localhost sh]# declare -a name[0]=wh
#也可將declare -a去掉,預設“變數名[1]”被系統自動識別為陣列變數
[root@localhost sh]# name[1]=sxn
[root@localhost sh]# name[2]=hz
#輸出陣列的內容,如果只寫陣列名,那麼只會輸出第一個下標變數
[root@localhost sh]# echo $name
wh
#輸出整個陣列變數
[root@localhost sh]# echo ${name[*]}
wh sxn hz

舉例三:宣告環境變數(declare -x)

”declare -x“ = ”export“

declare -x命令把變數宣告為環境變數,和export命令的作用是一樣的

#declare -x宣告test為環境變數
[root@localhost sh]# declare -x test=123
[root@localhost sh]# env |grep test
test=123

舉例四:只讀屬性(declare -r)

注意一旦給變數設定了只讀屬性,那麼這個變數既不能修改變數的值,也不能刪除變數,甚至不能使用“+r”選項取消只讀屬性。命令如下:

#給test賦予只讀屬性
[root@localhost~]# declare -r test
#test變數的值就不能修改了
[root@localhost~]# test=456
-bash:test:readonlyvariable
#也不能取消只讀屬性
[root@localhost~]# declare +r test
-bash:declare:test:readonlyvariable
#也不能刪除變數
[root@localhost~]# unset test
-bash:unset:test:cannotunset:readonlyvariable

不過還好這個變數只是命令列宣告的,所以只要重新登入或重啟,這個變數就會消失了。

舉例五:查詢變數屬性(declare -p)和取消變數屬性(declare +)

變數屬性的查詢使用“-p”選項,變數屬性的取消使用“+”選項。命令如下:

#test變數是為環境變數-x
[root@localhost sh]# declare -p test
declare -x test="123"
#取消環境變數test
[root@localhost sh]# declare +x test
#test變數已去掉環境變數屬性
[root@localhost sh]# declare -p test
declare -- test="123"
#環境變數查詢已無test環境變數
[root@localhost sh]# env |test
[root@localhost sh]# 

2)數值運算 $((運算式))

使用“$((運算式))”

declare -i

[root@localhost ~]# a=11 
[root@localhost ~]# b=22
[root@localhost ~]# declare -i c=$a+$b
[root@localhost ~]# echo $c
33

expr、let數值運算工具

#expr
[root@localhost ~]# d=11
[root@localhost ~]# e=33
#expr 後+號左右必須帶空格
[root@localhost ~]# f=$(expr $d + $e)
[root@localhost ~]# echo $f
44
==============================
#let
[root@localhost ~]# a=12
[root@localhost ~]# b=13
[root@localhost ~]# let c=$a+$b
[root@localhost ~]# echo $c
25
[root@localhost ~]# n=20
#變數n的值等於變數本身再加1
[root@localhost ~]# let n+=1
[root@localhost ~]# echo $n
21

3)Shell常用運算子

在這裡插入圖片描述
在這裡插入圖片描述

舉例一:加減乘除法

[root@localhost ~]# a=$(((3+2)*8))
[root@localhost ~]# echo $a
40

舉例二:取模運算(取餘數)

[root@localhost ~]# b=$((14%4))
#14不能被4整除餘數是2
[root@localhost ~]# echo $b
2

舉例三:邏輯與

[root@localhost ~]# c=$((1&0))
#邏輯與運算只有想與的兩邊都是1,與的結果才是1,否則都是0
[root@localhost ~]# echo $c
0
[root@localhost ~]# c=$((3&5))
[root@localhost ~]# echo $c
1
[root@localhost ~]# c=$((3&0))
[root@localhost ~]# echo $c
0

四則運算指令碼(一)

此指令碼現階段編寫存在一個問題,無法指定輸入num1、2輸入的為數字

#!/bin/bash
#提示輸入num1
read -t 30 -p "please input num1:" num1
echo -e
#提示輸入num1
read -t 30 -p "please input num2:" num2
echo -e
#提示輸入oper(符號),且固定輸入一個字串
read -n 1 -t 30 -p "please input oper[+-*/]:" oper
echo -e
#[ == ]判斷變數oper,執行輸入的符號,對應輸出結果,
[ "$oper" == "+" ] && echo "$(($num1 + $num2))" && exit
[ "$oper" == "-" ] && echo "$(($num1 - $num2))" && exit
[ "$oper" == "*" ] && echo "$(($num1 * $num2))" && exit
[ "$oper" == "/" ] && echo "$(($num1 / $num2))" && exit
echo "qing shu ru zhengque yunsuanfu"

9.變數的測試與內容置換(x=${y-new})

常用

變數置換方式變數y沒有設定變數y為空制變數y設定值
x=${y-新值}x=新值x為空x=$y
#檢測x的值 來判斷y是否有值,值為是多少
#1.檢測x的值,證明y沒有值
#不設定y變數
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
new
[root@localhost ~]# set -u
[root@localhost ~]# echo $y
-bash: y: 為繫結變數
#2.檢測x的值,證明y有值,但為空
#設定y變數為空
#[root@localhost ~]# y=""
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x[root@localhost ~]# echo $y
y=
#3.檢測x的值,證明y有值且等於123
#設定y變數=123
#[root@localhost ~]# y=123
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
123
[root@localhost ~]# echo $y
y=123

還有其他測試方法
在這裡插入圖片描述

10.環境變數配置檔案

1)source命令

呼叫環境變數

[root@localhost ~]# source 配置檔案[root@localhost ~]#. 配置檔案

2)登陸時環境變數配置檔案

登陸時剩下的環境變數配置檔案

在Linux系統登入時主要生效的環境變數配置檔案有以下5個

所有使用者登入統一生效有:

/etc/profile

/etc/profile.d/*.sh

只針對登入使用者生效

~/.bash_profile
~/.bashrc
/etc/bashrc
在這裡插入圖片描述

(1)/etc/profile

在使用者登入過程先呼叫/etc/profile檔案
在這個環境變數配置檔案中會定義這些預設環境變數:

  • USER變數:根據登入的使用者,給這個變數賦值(就是讓USER變數的值是當前使用者)。

  • LOGNAME變數:根據USER變數的值,給這個變數賦值。

  • MAIL變數:根據登入的使用者,定義使用者的郵箱為/var/spool/mail/使用者名稱。

  • PATH變數:根據登入使用者的UID是否為0,判斷PATH變數是否包含/sbin、/usr/sbin和/usr/local/sbin這三個系統命令目錄。

  • HOSTNAME變數:更加主機名,給這個變數賦值。

  • HISTSIZE變數:定義歷史命令的儲存條數。

  • umask:定義umask預設許可權。注意/etc/profile檔案中的umask許可權是在“有使用者登入過程(也就是輸入了使用者名稱和密碼)”時才會生效。

  • 呼叫/etc/profile.d/*.sh檔案,也就是呼叫/etc/profile.d/目錄下所有以.sh結尾的檔案。

(2)/etc/profile.d/*.sh

  • 呼叫/etc/profile.d/*.sh檔案裡最常用的就是lang.sh檔案,而這個檔案又會呼叫/etc/sysconfig/i18n檔案,/etc/sysconfig/i18n就是我們前面講過的預設語系配置檔案

(3)~/.bash_profile

  • 在PATH變數後面加入了“:$HOME/bin”這個目錄

  • 呼叫了~/.bashrc檔案,

(4)~/.bashrc

  • 定義預設別名,自己定義的別名也放入了這個檔案
  • 由~/.bashrc呼叫了/etc/bashrc檔案

(5)/etc/bashrc

  • PS1變數:也就是使用者的提示符
  • 定義在非登入模式下的umask許可權、PATH變數追加值、呼叫/etc/profile.d/*.sh檔案

登入提示-bash-4.1#,證明刪除了5箇中某個配置檔案,直接拷貝一個即可還原

3)登出時生效的環境變數配置檔案

在使用者退出登入時,只會呼叫一個環境變數配置檔案,就是~/.bash_logout。這個檔案預設沒有寫入任何內容,可是如果我們希望再退出登入時執行一些操作,比如清除歷史命令,備份某些資料,就可以把命令寫入這個檔案。

#logout時才生效
[root@localhost ~]# logout

4)其他配置檔案

還有一些環節變數配置檔案,最常見的就是~/bashhistory檔案,也就是歷史命令儲存檔案

11.Shell登入資訊

1)/etc/issue

我們在登入tty1-tty6這六個本地終端時,會有幾行的歡迎介面,這些歡迎資訊是儲存在/etc/issue檔案中,重啟後生效

[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m

在這裡插入圖片描述

2)/etc/issue.net

/etc/issue是在本地終端登入是顯示歡迎資訊的,如果是遠端登入(如ssh遠端登入,或telnet遠端登入)需要顯示歡迎資訊,則需要配置/etc/issue.net這個檔案了。使用這個檔案時由兩點需要注意:

首先,在/etc/issue檔案中支援的轉義符,在/etc/issue.net檔案中不能使用。

[root@localhost ~]# vi /etc/issue.net
\S
Kernel \r on an \m
好好學習

其次,ssh遠端登入是否顯示/etc/issue.net檔案中的歡迎資訊,是由ssh的配置檔案決定的。
如果我們需要ssh遠端登入可以檢視/etc/issue.net的歡迎資訊,那麼首先需要修改ssh的配置檔案/etc/ssh/sshd_config,加入如下內容:

[root@localhost~]# vi /etc/ssh/sshd_config
…省略部分輸出…
#nodefaultbannerpath
#Bannernone
Banner/etc/issue.net
…省略部分輸出…
[root@localhost ~]# systemctl restart sshd

再次用ssh或者xshell登入頁面就會顯示提示資訊

3) /etc/motd

/etc/motd是在使用者輸入使用者名稱和密碼,正確登入之後顯示歡迎資訊。在/etc/motd檔案中的歡迎資訊,不論是本地登入,還是遠端登入都可以顯示。

12.定義Bash快捷鍵

[root@localhost ~]# stty -a

檔案,/etc/sysconfig/i18n就是我們前面講過的預設語系配置檔案

(3)~/.bash_profile

  • 在PATH變數後面加入了“:$HOME/bin”這個目錄

  • 呼叫了~/.bashrc檔案,

(4)~/.bashrc

  • 定義預設別名,自己定義的別名也放入了這個檔案
  • 由~/.bashrc呼叫了/etc/bashrc檔案

(5)/etc/bashrc

  • PS1變數:也就是使用者的提示符
  • 定義在非登入模式下的umask許可權、PATH變數追加值、呼叫/etc/profile.d/*.sh檔案

登入提示-bash-4.1#,證明刪除了5箇中某個配置檔案,直接拷貝一個即可還原

3)登出時生效的環境變數配置檔案

在使用者退出登入時,只會呼叫一個環境變數配置檔案,就是~/.bash_logout。這個檔案預設沒有寫入任何內容,可是如果我們希望再退出登入時執行一些操作,比如清除歷史命令,備份某些資料,就可以把命令寫入這個檔案。

#logout時才生效
[root@localhost ~]# logout

4)其他配置檔案

還有一些環節變數配置檔案,最常見的就是~/bashhistory檔案,也就是歷史命令儲存檔案

11.Shell登入資訊

1)/etc/issue

我們在登入tty1-tty6這六個本地終端時,會有幾行的歡迎介面,這些歡迎資訊是儲存在/etc/issue檔案中,重啟後生效

[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m

[外鏈圖片轉存中…(img-PwM7zjTm-1603980666816)]

2)/etc/issue.net

/etc/issue是在本地終端登入是顯示歡迎資訊的,如果是遠端登入(如ssh遠端登入,或telnet遠端登入)需要顯示歡迎資訊,則需要配置/etc/issue.net這個檔案了。使用這個檔案時由兩點需要注意:

首先,在/etc/issue檔案中支援的轉義符,在/etc/issue.net檔案中不能使用。

[root@localhost ~]# vi /etc/issue.net
\S
Kernel \r on an \m
好好學習

其次,ssh遠端登入是否顯示/etc/issue.net檔案中的歡迎資訊,是由ssh的配置檔案決定的。
如果我們需要ssh遠端登入可以檢視/etc/issue.net的歡迎資訊,那麼首先需要修改ssh的配置檔案/etc/ssh/sshd_config,加入如下內容:

[root@localhost~]# vi /etc/ssh/sshd_config
…省略部分輸出…
#nodefaultbannerpath
#Bannernone
Banner/etc/issue.net
…省略部分輸出…
[root@localhost ~]# systemctl restart sshd

再次用ssh或者xshell登入頁面就會顯示提示資訊

3) /etc/motd

/etc/motd是在使用者輸入使用者名稱和密碼,正確登入之後顯示歡迎資訊。在/etc/motd檔案中的歡迎資訊,不論是本地登入,還是遠端登入都可以顯示。

12.定義Bash快捷鍵

[root@localhost ~]# stty -a

相關文章