shell 基礎 (下)

7、shell變量

變量命名規則
  • 變量名必須以字母或下劃線打頭,名字中間只能由字母、數字和下劃線組成
  • 變量名在有效範圍內必須是惟一的
變量的分類
  • 用戶自定義變量
  • 環境變量:主要保存的是和系統操做環境相關的數據。變量能夠自定義,可是對系統生效的環境變量名和變量做用是固定的。
  • 位置參數變量:主要是用來向腳本當中傳遞參數或數據的,變量名不能自定義,變量做用是固定的。

一、用戶自定義變量

定義變量
  • 變量名=變量值
  • 例如:x=5
  • 例如:name="yuan ke"
變量的調用
  • echo $變量名
  • 例如:echo $x
  • 例如:echo $name
[root@localhost ~]# x=5
[root@localhost ~]# name="yuan ke"
[root@localhost ~]# echo $name
yuan ke
[root@localhost ~]# echo $x
5
變量的疊加
  • x=123
  • x="$x"456
[root@localhost ~]# x=123
[root@localhost ~]# echo $x
123
[root@localhost ~]# x="$x"456
[root@localhost ~]# echo $x
123456
變量的查看

set 查看系統下全部已經生效的變量,包括系統的環境變量和用戶自定義變量。python

-u 選項 執行 set -u 命令之後,若是調用沒有聲明的變量時會報錯。nginx

[root@localhost ~]# set | less
name='yuan ke'
x=123456
[root@localhost ~]# echo $a ······沒有給s設置變量,沒有任何提示

[root@localhost ~]# set -u ······執行命令後
[root@localhost ~]# echo $a
-bash: a: 未綁定變量 ······系統會提示沒有綁定變量
變量刪除

unset 變量名web

[root@localhost ~]# unset name
[root@localhost ~]# set | name
-bash: name: 未找到命令

二、環境變量

source 命令

source 環境變量配置文件名 或者 . 環境變量配置文件名正則表達式

# 修改配置文件後,必須註銷從新登陸才能生效,使用source 命令能夠不用從新登陸

環境變量配置文件

PATH、HISTSIZE、PS一、HOSTNAME等環境變量寫入對應的環境變量配置文件shell

環境變量配置文件中主要是定義對系統操做環境生效的系統默認的環境變量,如PATH等。bash

  • /etc/profile 用戶環境變量,交互登陸才執行
  • /etc/bashrc 用戶不用登陸,執行shell就生效
  • /etc/profile.d/*.sh
  • ~/.bash_profile
  • ~/.bashrc
  • ~/.bash_history
  • ~/.bash_logout 用戶退出後須要作的一些操做

在/etc/目錄下的配置文件會對全部用戶生效,放在家目錄的配置文件,只會對當前用戶生效。less

PS1=[\u@\h \W]$ssh

修改用戶 主機名 家目錄等信息post

[root@localhost ~]# PS1='[\u@\h \w]\$'
[root@localhost ~]#cd data/
[root@localhost ~/data]#
[root@localhost ~/data]#PS1='<\u@\h \W>\$'
<root@localhost data>#

shell 特殊符號code

  • *匹配任意內容
  • ?匹配任意一個內容
  • [] 匹配中括號中的一個字符
  • #註釋字符
  • \ 脫義字符
  • | 管道符

\ 脫義字符

[root@localhost ~]#a=1
[root@localhost ~]#b=2
[root@localhost ~]#c=$a$b
[root@localhost ~]#echo $c
12
[root@localhost ~]#c='$a$b'
[root@localhost ~]#echo $c
$a$b
[root@localhost ~]#c=$a$b
[root@localhost ~]#c=\$a\$b
[root@localhost ~]#echo $c
$a$b

和管道有關的命令

  • cut 分割,-d分隔符 -f 指定段號 -c 指定第幾個字符
[root@localhost ~]#cat /etc/passwd | head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1
root
bin
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1,2
root:x
bin:x
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1-3
root:x:0
bin:x:1
  • sort 排序,-n 以數字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
[root@localhost ~]#sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@localhost ~]#sort 1.txt
<
>
,
[
]
\
111
.123
222
333
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
bbb
bin:x:1:1:bin:/bin:/sbin/nologin
ccc
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync

以數字的順序排序

[root@localhost ~]#sort -n 1.txt 
<
>
,
[
]
\
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
bbb
bin:x:1:1:bin:/bin:/sbin/nologin
ccc
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
.123
111
222
333
# 須要注意的是按數字順序排序的時候數字前面的字母默認是0
  • wc -l 統計行數 -m 統計字符數 -w 統計詞
[root@localhost ~]#cat /etc/passwd | wc -l
20
[root@localhost ~]#cat /etc/passwd | wc -m
908
[root@localhost ~]#cat /etc/passwd | wc -c
908
  • uniq 去重 -c 統計行數
[root@localhost ~]#cat 2.txt 
111
222
333
123
123
aaa
bbb
ccc
ddd
abc
abc
[root@localhost ~]#sort 2.txt |uniq -c
      1 111
      2 123
      1 222
      1 333
      1 aaa
      2 abc
      1 bbb
      1 ccc
      1 ddd
  • tee 和> 相似,重定向的同時還在屏幕上顯示, -a追加
[root@localhost ~]#sort 2.txt | uniq -c | tee a.txt
      1 111
      2 123
      1 222
      1 333
      1 aaa
      2 abc
      1 bbb
      1 ccc
      1 ddd
[root@localhost ~]#cat a.txt 
      1 111
      2 123
      1 222
      1 333
      1 aaa
      2 abc
      1 bbb
      1 ccc
      1 ddd
  • tr 替換字符,tr 'a''b',大小寫替換tr '[a-z]' '[A-Z]'
[root@localhost ~]#echo "xuexi" | tr 'x' 'X'
XueXi
  • split 切割,-b 大小(默認單位字節),-l行數

特殊符號

  • $ 變量前綴,!$組合,正則裏面表示行尾
  • ;多條命令寫到一行,用分號分割
  • ~用戶家目錄,後面正則表達式表示匹配符
  • &放到命令後面 會把命令丟到後臺
  • #> >> 2> 2>> &>
  • []指定字符中的一個,[0-9],[a-zA-Z],[abc]
  • || 和 &&,用於命令之間
[root@localhost ~]#ls 1.txt ; wc -l 2.txt 
1.txt
11 2.txt

|| 表示或,若是第一條命令執行正確,第二條命令則不執行。若是第一條命令執行錯誤,則執行第二條命令。

[root@localhost ~]#ls 123.txt || wc -l 2.txt 
ls: 沒法訪問123.txt: 沒有那個文件或目錄
11 2.txt
[root@localhost ~]#ls 1.txt || wc -l 2.txt 
1.txt

&& 若是第一條命令執行成功了才執行第二條命令,若是第一條命令錯誤,第二條命令則不執行。

[root@localhost ~]#ls 1.txt && wc -l 2.txt 
1.txt
11 2.txt
[root@localhost ~]#ls 123.txt && wc -l 2.txt 
ls: 沒法訪問123.txt: 沒有那個文件或目錄
相關文章
相關標籤/搜索