9.Shell基礎
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/stdin | 0 | 標準輸入 |
顯示器 | /dev/stdout | 1 | 標準輸出 |
顯示器 | /dev/stderr | 2 | 標準錯誤輸出 |
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、*、 @ 、 @、 @、#)
位置引數變數 | 作用 |
---|---|
$n | n為數字,$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
相關文章
- 【FPGA基礎】Latch基礎FPGA
- python基礎中的基礎Python
- 前端基礎之jQuery基礎前端jQuery
- Java基礎-語法基礎Java
- Pandas 基礎 (2) - Dataframe 基礎
- [今日白學]元件的基礎的基礎的基礎元件
- Python基礎篇-Python基礎01Python
- scala基礎語法-----Spark基礎Spark
- 【web前端基礎 | JS基礎】物件Web前端JS物件
- Python基礎:語法基礎(3)Python
- Java基礎-物件導向基礎Java物件
- 基礎
- JavaScript 基礎卷(一):基礎語法JavaScript
- 前端基礎入門四(JavaScript基礎)前端JavaScript
- 測試基礎(四)Jmeter基礎使用JMeter
- c#基礎-基礎-16.stringC#
- Linux基礎學習——檔案基礎Linux
- WiFi基礎(六):天線基礎知識WiFi
- Python基礎筆記01-Python基礎Python筆記
- Go 基礎教程--2-基礎知識Go
- Golang 基礎之基礎語法梳理 (三)Golang
- Web測試基礎-Html基礎知識WebHTML
- 多執行緒基礎-基礎實現執行緒
- Python基礎Python
- linux基礎Linux
- HTML基礎HTML
- CAPL基礎
- Redis基礎Redis
- es基礎
- shell基礎
- MySQL基礎MySql
- PostgreSQL基礎SQL
- RMI基礎
- milvus基礎
- VUE基礎Vue
- Docker 基礎Docker
- ShardingSphere基礎
- java基礎Java