【LINUX 運(yùn)維】第二章 shell 基礎(chǔ)003之Bash 的變量和運(yùn)算符

      網(wǎng)友投稿 821 2025-03-31

      四、Bash?的變量和運(yùn)算符

      1、什么是變量

      在定義變量時(shí),有一些規(guī)則需要遵守:

      2???變量名稱可以由字母、數(shù)字和下劃線組成,但是不能以數(shù)字開(kāi)頭。如果變量名是“2name”

      則是錯(cuò)誤的。

      2???在??Bash??中,變量的默認(rèn)類型都是字符串型,如果要進(jìn)行數(shù)值運(yùn)算,則必修指定變量類型為

      數(shù)值型。

      2???變量用等號(hào)連接值,等號(hào)左右兩側(cè)不能有空格。

      2???變量的值如果有空格,需要使用單引號(hào)或雙引號(hào)包括。如:“test="hello??world!"”。其

      中雙引號(hào)括起來(lái)的內(nèi)容“$”、“\”和反引號(hào)都擁有特殊含義,而單引號(hào)括起來(lái)的內(nèi)容都是

      普通字符。

      2???在變量的值中,可以使用“\”轉(zhuǎn)義符。

      2???如果需要增加變量的值,那么可以進(jìn)行變量值的疊加。不過(guò)變量需要用雙引號(hào)包含"$變量名

      "或用${變量名}包含變量名。例如:

      [root@localhost ~]# test=123 [root@localhost ~]# test="$test"456 [root@localhost ~]# echo $test 123456 #疊加變量 test,變量值變成了 123456 [root@localhost ~]# test=${test}789 [root@localhost ~]# echo $test 123456789 #再疊加變量 test,變量值編程了 123456789

      變量值的疊加可以使用兩種格式:“$變量名”或${變量名}

      2???如果是把命令的結(jié)果作為變量值賦予變量,則需要使用反引號(hào)或$()包含命令。例如:

      [tester@TesterPC ShellProData]$ test=$(date) [tester@TesterPC ShellProData]$ echo $test Sun Apr 3 17:21:34 JST 2022 [tester@TesterPC ShellProData]$

      2???環(huán)境變量名建議大寫,便于區(qū)分。

      2、變量的分類

      2???用戶自定義變量:這種變量是最常見(jiàn)的變量,由用戶自由定義變量名和變量的值。

      2???環(huán)境變量:這種變量中主要保存的是和系統(tǒng)操作環(huán)境相關(guān)的數(shù)據(jù),比如當(dāng)前登錄用戶,用戶的家目錄,命令的提示符等。不是太好理解吧,那么大家還記得在?Windows?中,同一臺(tái)電腦可以有多個(gè)用戶登錄,而且每個(gè)用戶都可以定義自己的桌面樣式和分辨率,這些其實(shí)就是Windows?的操作環(huán)境,可以當(dāng)做是?Windows?的環(huán)境變量來(lái)理解。環(huán)境變量的變量名可以自由定義,但是一般對(duì)系統(tǒng)起作用的環(huán)境變量的變量名是系統(tǒng)預(yù)先設(shè)定好的。

      2???位置參數(shù)變量:這種變量主要是用來(lái)向腳本當(dāng)中傳遞參數(shù)或數(shù)據(jù)的,變量名不能自定義,變量作用是固定的。

      2???預(yù)定義變量:是?Bash?中已經(jīng)定義好的變量,變量名不能自定義,變量作用也是固定的。

      3、用戶自定義變量

      1)、變量定義

      [tester@TesterPC ShellProData]$ 6name="yuchuanhuaying" bash: 6name=yuchuanhuaying: command not found... #變量名不能用數(shù)字開(kāi)頭 [tester@TesterPC ShellProData]$ name = "yuchuanhuaying" bash: name: command not found... #等號(hào)左右兩側(cè)不能有空格 [tester@TesterPC ShellProData]$ name=yuchuanhuaying [tester@TesterPC ShellProData]$ name=yuchuan huaying bash: huaying: command not found... #變量的值如果有空格,必須用引號(hào)包含 [tester@TesterPC ShellProData]$

      2)、變量調(diào)用

      [tester@TesterPC ShellProData]$ name="yuchuan huaying" #定義變量 name [tester@TesterPC ShellProData]$ echo $name yuchuan huaying #輸出變量 name 的值 [tester@TesterPC ShellProData]$

      3)、變量查看

      [root@localhost ~]# set [選項(xiàng)] 選項(xiàng): -u: 如果設(shè)定此選項(xiàng),調(diào)用未聲明變量時(shí)會(huì)報(bào)錯(cuò)(默認(rèn)無(wú)任何提示) -x: 如果設(shè)定此選項(xiàng),在命令執(zhí)行之前,會(huì)把命令先輸出一次

      #直接使用 set 命令,會(huì)查詢系統(tǒng)中所有的變量,包含用戶自定義變量和環(huán)境變量 [tester@TesterPC ShellProData]$ set | grep -n -A5 -B5 "PS1" 55-OSTYPE=linux-gnu 56-PATH=/home/tester/.local/bin:/home/tester/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 57-PIPESTATUS=([0]="0" [1]="0") 58-PPID=330703 59-PROMPT_COMMAND='printf "3]0;%s@%s:%s

      #直接使用 set 命令,會(huì)查詢系統(tǒng)中所有的變量,包含用戶自定義變量和環(huán)境變量 [tester@TesterPC ShellProData]$ set | grep -n -A5 -B5 "PS1" 55-OSTYPE=linux-gnu 56-PATH=/home/tester/.local/bin:/home/tester/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 57-PIPESTATUS=([0]="0" [1]="0") 58-PPID=330703 59-PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"' 60:PS1='[\u@\h \W]\$ ' 61-PS2='> ' 62-PS4='+ ' 63-PWD=/home/tester/MasterData/ShellProData 64-SElinux_LEVEL_REQUESTED= 65-SELINUX_ROLE_REQUESTED= [tester@TesterPC ShellProData]$

      7" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"' 60:PS1='[\u@\h \W]$ ' 61-PS2='> ' 62-PS4='+ ' 63-PWD=/home/tester/MasterData/ShellProData 64-SELINUX_LEVEL_REQUESTED= 65-SELINUX_ROLE_REQUESTED= [tester@TesterPC ShellProData]$

      #當(dāng)設(shè)置了-u 選項(xiàng)后,如果調(diào)用沒(méi)有設(shè)定的變量會(huì)有報(bào)錯(cuò)。默認(rèn)是沒(méi)有任何輸出的。 [tester@TesterPC ShellProData]$ echo $huaying [tester@TesterPC ShellProData]$ set -u [tester@TesterPC ShellProData]$ echo $huaying -bash: huaying: unbound variable [tester@TesterPC ShellProData]$

      [root@localhost ~]# set -x [root@localhost ~]# ls + ls --color=auto anaconda-ks.cfg install.log install.log.syslog sh tdir test testfile #如果設(shè)定了-x 選項(xiàng),會(huì)在每個(gè)命令執(zhí)行之前,先把命令輸出一次

      4)、變量刪除

      [root@localhost ~]# unset 變量名

      4?、環(huán)境變量

      1)、環(huán)境變量設(shè)置

      #使用 export 聲明的變量即是環(huán)境變量 [tester@TesterPC ShellProData]$ export age="20" [tester@TesterPC ShellProData]$

      2)、環(huán)境變量查詢和刪除

      env?命令和?set?命令的區(qū)別是,set?命令可以查看所有變量,而?env?命令只能查看環(huán)境變量。

      #刪除環(huán)境變量 gender [tester@TesterPC ShellProData]$ export gender="Manl" [tester@TesterPC ShellProData]$ [tester@TesterPC ShellProData]$ unset gender [tester@TesterPC ShellProData]$ [tester@TesterPC ShellProData]$ env | grep gender [tester@TesterPC ShellProData]$

      3)、系統(tǒng)默認(rèn)環(huán)境變量

      [tester@TesterPC ShellProData]$ env #定義顏色的顯示 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;3 SSH_CONNECTION=10.81.234.13 56502 10.81.234.130 22 #語(yǔ)系 LANG=en_US.UTF-8 HISTCONTROL=ignoredups DISPLAY=localhost:10.0 #主機(jī)名 HOSTNAME=TesterPC OLDPWD=/home/tester/MasterData which_declare=declare -f XDG_SESSION_ID=25 #當(dāng)前登錄的用戶 USER=tester SELINUX_ROLE_REQUESTED= #當(dāng)前所在目錄 PWD=/home/tester/MasterData/ShellProData SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass #當(dāng)前登錄用戶的家目錄 HOME=/home/tester #當(dāng)前操作環(huán)境是用ssh連接的,這里記錄客戶端IP SSH_CLIENT=10.81.234.13 56502 22 #自定義的環(huán)境變量 age=20 SELINUX_LEVEL_REQUESTED= XDG_DATA_DIRS=/home/tester/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share #ssh 連接的終端是pts/0 SSH_TTY=/dev/pts/0 #用戶郵箱 MAIL=/var/spool/mail/tester #終端環(huán)境 TERM=xterm #當(dāng)前的shell SHELL=/bin/bash TC_LIB_DIR=/usr/lib64/tc SELINUX_USE_CURRENT_RANGE= #當(dāng)前在第一層shell中 SHLVL=1 GDK_BACKEND=x11 #登錄用戶 LOGNAME=tester DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 #系統(tǒng)查找命令的路徑 PATH=/home/tester/.local/bin:/home/tester/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin #歷史命令條數(shù) HISTSIZE=1000 LESSOPEN=||/usr/bin/lesspipe.sh %s BASH_FUNC_which%%=() { ( alias; eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@" } #上一次執(zhí)行命令的最后一個(gè)參數(shù)或命令本身 _=/usr/bin/env [tester@TesterPC ShellProData]$

      env?命令可以查詢到所有的環(huán)境變量,可是還有一些變量雖然不是環(huán)境變量,卻是和?Bash?操作接口相關(guān)的變量,這些變量也對(duì)我們的?Bash?操作終端起到了重要的作用。這些變量就只能用??set?命令來(lái)查看了,我只列出重要的內(nèi)容吧:

      【LINUX 運(yùn)維】第二章 shell 基礎(chǔ)003之Bash 的變量和運(yùn)算符

      [root@localhost ~]# set BASH=/bin/bash <--Bash 的位置 BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu") <--Bash 版本 BASH_VERSION='4.1.2(1)-release' <--bash 的版本 COLORS=/etc/DIR_COLORS <--顏色記錄文件 HISTFILE=/root/.bash_history <--歷史命令保存文件 HISTFILESIZE=1000 <--在文件當(dāng)中記錄的歷史命令最大條數(shù) HISTSIZE=1000 <--在緩存中記錄的歷史命令最大條數(shù) LANG=zh_CN.UTF-8 <--語(yǔ)系環(huán)境 MACHTYPE=i386-redhat-linux-gnu <--軟件類型是 i386 兼容類型 MAILCHECK=60 <--每 60 秒去掃描新郵件 PPID=2166 <--父 shell 的 PID。我們當(dāng)前 Shell 是一個(gè)子 shell PS1='[\u@\h \W]$ ' <--命令提示符 PS2='> ' <--如果命令一行沒(méi)有輸入完成,第二行命令的提示符 UID=0 <--當(dāng)前用戶的 UID

      2???PATH?變量:系統(tǒng)查找命令的路徑先查詢下?PATH?環(huán)境變量的值:

      [tester@TesterPC ShellProData]$ echo $PATH /home/tester/.local/bin:/home/tester/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin [tester@TesterPC ShellProData]$

      PATH?變量的值是用“:”分割的路徑,這些路徑就是系統(tǒng)查找命令的路徑。也就是說(shuō)當(dāng)我們輸入了一個(gè)程序名,如果沒(méi)有寫入路徑,系統(tǒng)就會(huì)到??PATH??變量定義的路徑中去尋找,是否有可以執(zhí)行的程序。如果找到則執(zhí)行,否則會(huì)報(bào)“命令沒(méi)有發(fā)現(xiàn)”的錯(cuò)誤。那么是不是我們把自己的腳本拷貝到??PATH??變量定義的路徑中,我們自己寫的腳本也可以不輸入路徑而直接運(yùn)行呢?

      [root@localhost ~]# cp /root/sh/hello.sh /bin/ #拷貝 hello.sh 到/bin 目錄 [root@localhost ~]# hello.sh Mr. Shen Chao is the most honest man. #hello.sh 可以直接執(zhí)行了

      那么我們是不是可以修改?PATH?變量的值,而不是把程序腳本復(fù)制到/bin/目錄中。當(dāng)然是可以的,我們通過(guò)變量的疊加就可以實(shí)現(xiàn)了:

      [root@localhost ~]# PATH="$PATH":/root/sh #在變量 PATH 的后面,加入/root/sh 目錄

      [root@localhost ~]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/ bin:/root/sh

      #查詢?PATH?的值,變量疊加生效了當(dāng)然我們這樣定義的??PATH??變量只是臨時(shí)生效,一旦重啟或注銷就會(huì)消失,如果想要永久生效,需要寫入環(huán)境變量配置文件,我們?cè)凇碍h(huán)境變量配置文件”小節(jié)中再詳細(xì)介紹。

      2???PS1?變量:命令提示符設(shè)置PS1?是一個(gè)很有意思的變量(這可不是?SONY?的游戲機(jī)哦),是用來(lái)定義命令行的提示符的,可以安裝我們自己的需求來(lái)定義自己喜歡的提示符。PS1?可以支持以下這些選項(xiàng):

      ?????? \d:顯示日期,格式為“星期??月??日”

      ?????? \H:顯示完整的主機(jī)名。如默認(rèn)主機(jī)名“l(fā)ocalhost.localdomain”

      ?????? \h:顯示簡(jiǎn)寫主機(jī)名。如默認(rèn)主機(jī)名“l(fā)ocalhost”

      ?????? \t:顯示?24?小時(shí)制時(shí)間,格式為“HH:MM:SS”

      ?????? \T:顯示?12?小時(shí)制時(shí)間,格式為“HH:MM:SS”

      ?????? \A:顯示?24?小時(shí)制時(shí)間,格式為“HH:MM”

      ?????? \@:顯示?12?小時(shí)制時(shí)間,格式為“HH:MM??am/pm”

      ?????? \u:顯示當(dāng)前用戶名

      ?????? \v:顯示?Bash?的版本信息

      ?????? \w:顯示當(dāng)前所在目錄的完整名稱

      ????? \W:顯示當(dāng)前所在目錄的最后一個(gè)目錄

      ????? \#:執(zhí)行的第幾個(gè)命令

      ????? \$:提示符。如果是?root?用戶會(huì)顯示提示符為“#”,如果是普通用戶會(huì)顯示提示符為“$”

      這些選項(xiàng)該怎么用啊?我們先看看?PS1?變量的默認(rèn)值吧:

      [root@localhost ~]# echo $PS1 [\u@\h \W]\$ #默認(rèn)的提示符是顯示“[用戶名@簡(jiǎn)寫主機(jī)名 最后所在目錄](méi)提示符”

      在?PS1?變量中,如果是可以解釋的符號(hào),如“\u”、“\h”等,則顯示這個(gè)符號(hào)的作用。如果是不能解釋的符號(hào),如“@”或“空格”,則原符號(hào)輸出。那么我們修下??PS1??變量,看看會(huì)出現(xiàn)社么情況吧:

      [root@localhost ~]# PS1='[\u@\t \w]\$ ' #修改提示符為‘[用戶名@當(dāng)前時(shí)間 當(dāng)前所在完整目錄](méi)提示符’ [root@04:46:40 ~]#cd /usr/local/src/ #切換下當(dāng)前所在目錄,因?yàn)榧夷夸浭强床怀鰜?lái)區(qū)別的 [root@04:47:29 /usr/local/src]# #看到了嗎?提示符按照我們的設(shè)計(jì)發(fā)生了變化

      這里要小心,PS1?變量的值要用單引號(hào)包含,否則設(shè)置不生效。再舉個(gè)例子吧:

      [root@04:50:08 /usr/local/src]#PS1='[\u@\@ \h \# \W]\$' [root@04:53 上午 localhost 31 src]# #提示符又變了。\@:時(shí)間格式是 HH:MM am/pm;\#:會(huì)顯示執(zhí)行了多少個(gè)命令

      PS1?變量可以自由定制,好像看到了點(diǎn)?Linux?可以自由定制和修改的影子,還是很有意思的。不過(guò)說(shuō)實(shí)話一個(gè)提示符已經(jīng)使用習(xí)慣了,如果換一個(gè)還是非常別扭的,還是改回默認(rèn)的提示符吧:

      [root@04:53 上午 localhost 31 src]#PS1='[\u@\h \W]\$ ' [root@localhost src]#

      2???LANG?語(yǔ)系變量

      LANG?變量定義了?Linux?系統(tǒng)的主語(yǔ)系環(huán)境,這個(gè)變量的默認(rèn)值是:

      [root@localhost src]# echo $LANG zh_CN.UTF-8

      這是因?yàn)槲覀??Linux??安裝時(shí),選擇的是中文安裝,所以默認(rèn)的主語(yǔ)系變量是“zh_CN.UTF-8”。那么?Linux?中到底支持多少語(yǔ)系呢?我們可以使用以下命令查詢:

      [root@localhost src]# locale -a | more aa_DJ aa_DJ.iso88591 aa_DJ.utf8 aa_ER …省略部分輸出… #查詢支持的語(yǔ)系 [root@localhost src]# locale -a | wc -l 735 #是在太多了,統(tǒng)計(jì)一下有多少個(gè)吧

      我們支持這么多的語(yǔ)系,當(dāng)前系統(tǒng)到底是什么語(yǔ)系呢?使用?locale?命令直接查詢:

      [tester@TesterPC ShellProData]$ locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= [tester@TesterPC ShellProData]$

      我們還要通過(guò)文件/etc/sysconfig/i18n?定義系統(tǒng)的默認(rèn)語(yǔ)系,查看下這個(gè)文件的內(nèi)容:

      [root@localhost src]# cat /etc/sysconfig/i18n LANG="zh_CN.UTF-8"

      這又是當(dāng)前系統(tǒng)語(yǔ)系,又是默認(rèn)語(yǔ)系,有沒(méi)有快暈倒的感覺(jué)。解釋下吧,我們可以這樣理解,默認(rèn)語(yǔ)系是下次重啟之后系統(tǒng)所使用的語(yǔ)系,而當(dāng)前系統(tǒng)語(yǔ)系是當(dāng)前系統(tǒng)使用的語(yǔ)系。如果系統(tǒng)重啟,會(huì)從默認(rèn)語(yǔ)系配置文件/etc/sysconfig/i18n?中讀出語(yǔ)系,然后賦予變量?LANG?讓這個(gè)語(yǔ)系生效。也就是說(shuō),LANG?定義的語(yǔ)系只對(duì)當(dāng)前系統(tǒng)生效,要想永久生效就要修改/etc/sysconfig/i18n?文件了。說(shuō)到這里,我們需要解釋下?Linux?中文支持的問(wèn)題。是不是我們只要定義了語(yǔ)系為中文語(yǔ)系,如zh_CN.UTF-8??就可以正確顯示中文了呢?這要分情況,如果我們是在圖形界面中,或者是使用遠(yuǎn)程連接工具(如??SecureCRT),只要正確設(shè)置了語(yǔ)系,那么是可以正確顯示中文的。當(dāng)然遠(yuǎn)程連接工具也要配置正確的語(yǔ)系環(huán)境,具體配置方式可以參考?Linux?系統(tǒng)安裝章節(jié)。那么如果是純字符界面(本地終端?tty1-tty6)是不能顯示中文的,因?yàn)?Linux?的純字符界面時(shí)不能顯示中文這么復(fù)雜的編碼的。如果我們非要在純字符界面顯示中文,那么只能安裝中文插件,如zhcon?等。我們舉個(gè)例子吧:

      [root@localhost src]# echo $LANG zh_CN.UTF-8 #我當(dāng)前使用遠(yuǎn)程工具連接,只要語(yǔ)系正確,則可以正確顯示中文 [root@localhost src]# df 文件系統(tǒng) 1K-塊 已用 可用 已用% 掛載點(diǎn) /dev/sda3 19923216 1813532 17097616 10% / tmpfs 312672 0 312672 0% /dev/shm /dev/sda1 198337 26359 161738 15% /boot #df 命令可以看到中文是正常的

      但如果是純字符界面呢?雖然我們是中文安裝的,但純字符界面的語(yǔ)系可是“en_US.UTF-8”,如圖?11-2?所示:

      [tester@TesterPC ShellProData]$ echo $LANG en_US.UTF-8 [tester@TesterPC ShellProData]$ df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 32789408 0 32789408 0% /dev tmpfs 32819636 0 32819636 0% /dev/shm tmpfs 32819636 26728 32792908 1% /run tmpfs 32819636 0 32819636 0% /sys/fs/cgroup /dev/mapper/cl-root 536604672 8937344 527667328 2% / /dev/sda1 493568 311124 182444 64% /boot /dev/mapper/cl-u 536604672 11650524 524954148 3% /u /dev/mapper/cl-home 1005625344 7137944 998487400 1% /home tmpfs 6563924 44 6563880 1% /run/user/1000 [tester@TesterPC ShellProData]$

      圖?11-2??字符界面語(yǔ)系那么我們更改下語(yǔ)系為中文,看看會(huì)出現(xiàn)什么情況吧:

      圖?11-3??字符界面設(shè)置中文語(yǔ)系

      如果我們非要在純字符界面中設(shè)置中文語(yǔ)系,那么就會(huì)出現(xiàn)亂碼。怎么解決呢?安裝?zhcon?中文插件吧,安裝并不復(fù)雜,查詢下安裝說(shuō)明應(yīng)該可以輕松安裝。

      5?、位置參數(shù)變量

      位置參數(shù)變量

      作??????????????????用

      $n

      n?為數(shù)字,$0?代表命令本身,$1-$9?代表第一到第九個(gè)參數(shù),十以上

      的參數(shù)需要用大括號(hào)包含,如${10}.

      $*

      這個(gè)變量代表命令行中所有的參數(shù),$*把所有的參數(shù)看成一個(gè)整體

      $@

      這個(gè)變量也代表命令行中所有的參數(shù),不過(guò)$@把每個(gè)參數(shù)區(qū)分對(duì)待

      $#

      這個(gè)變量代表命令行中所有參數(shù)的個(gè)數(shù)

      [root@localhost sh]# vi count.sh #!/bin/bash # Author: shenchao (E-mail: shenchao@atguigu.com) num1=$1 #給 num1 變量賦值是第一個(gè)參數(shù) num2=$2 #給 num2 變量賦值是第二個(gè)參數(shù) sum=$(( $num1 + $num2)) #變量 sum 的和是 num1 加 num2 #Shell 當(dāng)中的運(yùn)算還是不太一樣的,我們 Shell 運(yùn)算符小節(jié)中詳細(xì)介紹 echo $sum #打印變量 sum 的值

      那么還有幾個(gè)位置參數(shù)變量是干嘛的呢?我們?cè)趯憘€(gè)腳本來(lái)說(shuō)明下:

      [root@localhost sh]# vi parameter.sh #!/bin/bash # Author: shenchao (E-mail: shenchao@atguigu.com) echo "A total of $# parameters" #使用$#代表所有參數(shù)的個(gè)數(shù) echo "The parameters is: $*" #使用$*代表所有的參數(shù) echo "The parameters is: $@" #使用$@也代表所有參數(shù)

      那么“$*”和“$@”有區(qū)別嗎?還是有區(qū)別的,$*會(huì)把接收的所有參數(shù)當(dāng)成一個(gè)整體對(duì)待,而$@則會(huì)區(qū)分對(duì)待接收到的所有參數(shù)。還是舉個(gè)例子:

      [root@localhost sh]# vi parameter2.sh #!/bin/bash # Author: shenchao (E-mail: shenchao@atguigu.com) for i in "$*" #定義 for 循環(huán),in 后面有幾個(gè)值,for 會(huì)循環(huán)多少次,注意“$*”要用雙引號(hào)括起來(lái) #每次循環(huán)會(huì)把 in 后面的值賦予變量 i #Shell 把$*中的所有參數(shù)看成是一個(gè)整體,所以這個(gè) for 循環(huán)只會(huì)循環(huán)一次 do echo "The parameters is: $i" #打印變量$i 的值 done x=1 #定義變量 x 的值為 1 for y in "$@" #同樣 in 后面的有幾個(gè)值,for 循環(huán)幾次,每次都把值賦予變量 y #可是 Shell 中把“$@”中的每個(gè)參數(shù)都看成是獨(dú)立的,所以“$@”中有幾個(gè)參數(shù),就會(huì)循環(huán)幾次 do echo "The parameter$x is: $y" #輸出變量 y 的值 x=$(( $x +1 )) #然變量 x 每次循環(huán)都加 1,為了輸出時(shí)看的更清楚 done

      6?、預(yù)定義變量

      預(yù)定義變量

      作??????????????????用

      $?

      最后一次執(zhí)行的命令的返回狀態(tài)。如果這個(gè)變量的值為?0,證明上一個(gè)命令正確執(zhí)行;如果這個(gè)變量的值為非?0(具體是哪個(gè)數(shù),由命令自己來(lái)決定),則證明上一個(gè)命令執(zhí)行不正確了。

      $$

      當(dāng)前進(jìn)程的進(jìn)程號(hào)(PID)

      $!

      后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程號(hào)(PID)

      我們先來(lái)看看“$?”這個(gè)變量,看起來(lái)不好理解,我們還是舉個(gè)例子:

      [root@localhost sh]# ls count.sh hello.sh parameter2.sh parameter.sh #ls 命令正確執(zhí)行 [root@localhost sh]# echo $? 0 #預(yù)定義變量“$?”的值是 0,證明上一個(gè)命令執(zhí)行正確 [root@localhost sh]# ls install.log ls: 無(wú)法訪問(wèn) install.log: 沒(méi)有那個(gè)文件或目錄 #當(dāng)前目錄中沒(méi)有 install.log 文件,所以 ls 命令報(bào)錯(cuò)了 [root@localhost sh]# echo $? 2 #變量“$?”返回一個(gè)非 0 的值,證明上一個(gè)命令沒(méi)有正確執(zhí)行 #至于錯(cuò)誤的返回值到底是多少,是在編寫 ls 命令時(shí)定義好的,如果碰到文件不存在就返回?cái)?shù)值 2

      接下來(lái)我們來(lái)說(shuō)明下“$$”和“$!”這兩個(gè)預(yù)定義變量,我們寫個(gè)腳本吧:

      [root@localhost sh]# vi variable.sh #!/bin/bash # Author: shenchao (E-mail: shenchao@atguigu.com) echo "The current process is $$" #輸出當(dāng)前進(jìn)程的 PID。 #這個(gè) PID 就是 variable.sh 這個(gè)腳本執(zhí)行時(shí),生成的進(jìn)程的 PID find /root -name hello.sh & #使用 find 命令在 root 目錄下查找 hello.sh 文件 #符號(hào)&的意思是把命令放入后臺(tái)執(zhí)行,工作管理我們?cè)谙到y(tǒng)管理章節(jié)會(huì)詳細(xì)介紹 echo "The last one Daemon process is $!" #輸出這個(gè)后臺(tái)執(zhí)行命令的進(jìn)程的 PID,也就是輸出 find 命令的 PID 號(hào)

      7、接收鍵盤輸入

      [root@localhost ~]# read [選項(xiàng)] [變量名] 選項(xiàng): -p “提示信息”: 在等待 read 輸入時(shí),輸出提示信息 -t 秒數(shù): read 命令會(huì)一直等待用戶輸入,使用此選項(xiàng)可以指定等待時(shí)間 -n 字符數(shù): read 命令只接受指定的字符數(shù),就會(huì)執(zhí)行 -s: 隱藏輸入的數(shù)據(jù),適用于機(jī)密信息的輸入 變量名: 變量名可以自定義,如果不指定變量名,會(huì)把輸入保存入默認(rèn)變量 REPLY 如果只提供了一個(gè)變量名,則整個(gè)輸入行賦予該變量 如果提供了一個(gè)以上的變量名,則輸入行分為若干字,一個(gè)接一個(gè)地賦予各個(gè)變量,而命令行上 的最后一個(gè)變量取得剩余的所有字

      還是寫個(gè)例子來(lái)解釋下?read?命令:

      [root@localhost sh]# vi read.sh #!/bin/bash # Author: shenchao (E-mail: shenchao@atguigu.com) read -t 30 -p "Please input your name: " name #提示“請(qǐng)輸入姓名”并等待 30 秒,把用戶的輸入保存入變量 name 中 echo "Name is $name" #看看變量“$name”中是否保存了你的輸入 read -s -t 30 -p "Please enter your age: " age #提示“請(qǐng)輸入年齡”并等待 30 秒,把用戶的輸入保存入變量 age 中 #年齡是隱私,所以我們用“-s”選項(xiàng)隱藏輸入 echo -e "\n" #調(diào)整輸出格式,如果不輸出換行,一會(huì)的年齡輸出不會(huì)換行 echo "Age is $age" read -n 1 -t 30 -p "Please select your gender[M/F]: " gender #提示“請(qǐng)選擇性別”并等待 30 秒,把用戶的輸入保存入變量 gender #使用“-n 1”選項(xiàng)只接收一個(gè)輸入字符就會(huì)執(zhí)行(都不用輸入回車) echo -e "\n" echo "Sex is $gender"

      8?、Shell?的運(yùn)算符

      1)數(shù)值運(yùn)算的方法

      那如果我需要進(jìn)行數(shù)值運(yùn)算,可以采用以下三種方法中的任意一種:

      2???使用?declare?聲明變量類型

      既然所有變量的默認(rèn)類型是字符串型,那么只要我們把變量聲明為整數(shù)型不就可以運(yùn)算了嗎?使用?declare?命令就可以實(shí)現(xiàn)聲明變量的類型。命令如下:

      [root@localhost ~]# declare [+/-][選項(xiàng)] 變量名 選項(xiàng): -: 給變量設(shè)定類型屬性 +: 取消變量的類型屬性 -a: 將變量聲明為數(shù)組型 -i: 將變量聲明為整數(shù)型(integer) -r: 講變量聲明為只讀變量。注意,一旦設(shè)置為只讀變量,既不能修改變量的值, 也不能刪除變量,甚至不能通過(guò)+r 取消只讀屬性 -x: 將變量聲明為環(huán)境變量 -p: 顯示指定變量的被聲明的類型

      例子?1:數(shù)值運(yùn)算

      那我們只要把變量聲明為整數(shù)型不就可以運(yùn)算了嗎?試試吧:

      [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 #給變量 aa 和 bb 賦值 [root@localhost ~]# declare -i cc=$aa+$bb #聲明變量 cc 的類型是整數(shù)型,它的值是 aa 和 bb 的和 [root@localhost ~]# echo $cc 33 #這下終于可以相加了

      這樣運(yùn)算好麻煩啊,沒(méi)有辦法啊,Shell?在數(shù)值運(yùn)算這里確實(shí)是比較麻煩,習(xí)慣就好了-_-!。

      例子?2:數(shù)組變量類型

      數(shù)組這個(gè)東東只有寫一些較為復(fù)雜的程序才會(huì)用到,大家可以先不用著急學(xué)習(xí)數(shù)組,當(dāng)有需要的時(shí)候再回來(lái)詳細(xì)學(xué)習(xí)。那么數(shù)組是什么呢?所謂數(shù)組,就是相同數(shù)據(jù)類型的元素按一定順序排列的集合,就是把有限個(gè)類型相同的變量用一個(gè)名字命名,然后用編號(hào)區(qū)分他們的變量的集合,這個(gè)名字稱為數(shù)組名,編號(hào)稱為下標(biāo)。組成數(shù)組的各個(gè)變量成為數(shù)組的分量,也稱為數(shù)組的元素,有時(shí)也稱為下標(biāo)變量。一看定義就一頭霧水,更加不明白數(shù)組是什么了。那么換個(gè)說(shuō)法,變量和數(shù)組都是用來(lái)保存數(shù)據(jù)的,只是變量只能賦予一個(gè)數(shù)據(jù)值,一旦重復(fù)復(fù)制,后一個(gè)值就會(huì)覆蓋前一個(gè)值。而數(shù)組是可以賦予一組相同類型的數(shù)據(jù)值。大家可以把變量想象成一個(gè)小辦公室,這個(gè)辦公室只能容納一個(gè)人辦公,辦公室名就是變量名。而數(shù)組是一個(gè)大辦公室,可以容納很多人同時(shí)辦公,在這個(gè)大辦公室辦公的每個(gè)人是通過(guò)不同的座位號(hào)來(lái)區(qū)分的,這個(gè)座位號(hào)就是數(shù)組的下標(biāo),而大辦公室的名字就是數(shù)組名。

      還是舉個(gè)例子吧:

      [root@localhost ~]# name[0]="shen chao" #數(shù)組中第一個(gè)變量是沈超(大辦公室第一個(gè)辦公桌坐最高大威猛帥氣的人) [root@localhost ~]# name[1]="li ming" #數(shù)組第二個(gè)變量是李明(大辦公室第二個(gè)辦公桌坐頭發(fā)锃亮的人) [root@localhost ~]# name[2]="tong gang" #數(shù)組第三個(gè)變量是佟剛(大辦公室第三個(gè)辦公桌坐眼睛比超哥還小的老師) [root@localhost ~]# echo ${name} shen chao #輸出數(shù)組的內(nèi)容,如果只寫數(shù)組名,那么只會(huì)輸出第一個(gè)下標(biāo)變量 [root@localhost ~]# echo ${name[*]} shen chao li ming tong gang #輸出數(shù)組所有的內(nèi)容

      注意數(shù)組的下標(biāo)是從?0?開(kāi)始的,在調(diào)用數(shù)組值時(shí),需要使用${數(shù)組[下標(biāo)]}的方式來(lái)讀取。不過(guò)好像在剛剛的例子中,我們并沒(méi)有把??name??變量聲明為數(shù)組型啊,其實(shí)只要我們?cè)诙x變量時(shí)采用了“變量名[下標(biāo)]”的格式,這個(gè)變量就會(huì)被系統(tǒng)認(rèn)為是數(shù)組型了,不用強(qiáng)制聲明。

      例子?3:??環(huán)境變量

      我們其實(shí)也可以使用?declare?命令把變量聲明為環(huán)境變量,和?export?命令的作用是一樣的:

      [root@localhost ~]# declare -x test=123 #把變量 test 聲明為環(huán)境變量

      例子?4:只讀屬性

      注意一旦給變量設(shè)定了只讀屬性,那么這個(gè)變量既不能修改變量的值,也不能刪除變量,甚至不能使用“+r”選項(xiàng)取消只讀屬性。命令如下:

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

      不過(guò)還好這個(gè)變量只是命令行聲明的,所以只要重新登錄或重啟,這個(gè)變量就會(huì)消失了。

      例子?5:查詢變量屬性和取消變量屬性變量屬性的查詢使用“-p”選項(xiàng),變量屬性的取消使用“+”選項(xiàng)。命令如下:

      [root@localhost ~]# declare -p cc declare -i cc="33" #cc 變量是 int 型 [root@localhost ~]# declare -p name declare -a name='([0]="shen chao" [1]="li ming" [2]="tong gang")' #name 變量是數(shù)組型 [root@localhost ~]# declare -p test declare -rx test="123" #test 變量是環(huán)境變量和只讀變量 [root@localhost ~]# declare +x test #取消 test 變量的環(huán)境變量屬性 [root@localhost ~]# declare -p test declare -r test="123" #注意,只讀變量屬性是不能取消的

      2???使用?expr?或?let?數(shù)值運(yùn)算工具

      要想進(jìn)行數(shù)值運(yùn)算的第二種方法是使用??expr??命令,這種命令就沒(méi)有?declare?命令復(fù)雜了。命令如下:

      [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 #給變量 aa 和變量 bb 賦值 [root@localhost ~]# dd=$(expr $aa + $bb) #dd 的值是 aa 和 bb 的和。注意“+”號(hào)左右兩側(cè)必須有空格

      [root@localhost ~]# echo $dd 33

      使用?expr?命令進(jìn)行運(yùn)算時(shí),要注意“+”號(hào)左右兩側(cè)必須有空格,否則運(yùn)算不執(zhí)行。至于?let?命令和?expr?命令基本類似,都是?Linux?中的運(yùn)算命令,命令格式如下:

      [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 #給變量 aa 和變量 bb 賦值 [root@localhost ~]# let ee=$aa+$bb [root@localhost ~]# echo $ee 33 #變量 ee 的值是 aa 和 bb 的和 [root@localhost ~]# n=20 #定義變量 n [root@localhost ~]# let n+=1 #變量 n 的值等于變量本身再加 1 [root@localhost ~]# echo $n 21

      expr?命令和?let?命令大家可以按照習(xí)慣使用,不過(guò)?let?命令對(duì)格式要求要比?expr?命令寬松,所以推薦使用?let?命令進(jìn)行數(shù)值運(yùn)算。

      2???使用“$((運(yùn)算式))”或“$[運(yùn)算式]”方式運(yùn)算其實(shí)這是一種方式“$(())”和“$[]”這兩種括號(hào)按照個(gè)人習(xí)慣使用即可。命令如下:

      [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 [root@localhost ~]# ff=$(( $aa+$bb )) [root@localhost ~]# echo $ff 33 #變量 ff 的值是 aa 和 bb 的和 [root@localhost ~]# gg=$[ $aa+$bb ] [root@localhost ~]# echo $gg 33 #變量 gg 的值是 aa 和 bb 的和

      這三種數(shù)值運(yùn)算方式,大家可以按照自己的習(xí)慣來(lái)進(jìn)行使用。不過(guò)我們推薦使用“$((運(yùn)算式))”的方式

      2)、Shell?常用運(yùn)算符

      優(yōu)先級(jí)

      運(yùn)算符

      說(shuō)明

      13

      -,??+

      單目負(fù)、單目正

      12

      !,??~

      邏輯非、按位取反或補(bǔ)碼

      11

      *??,??/??,??%

      乘、除、取模

      10

      +,??-

      加、減

      9

      <>

      按位左移、按位右移

      8

      ??=,?????

      小于或等于、大于或等于、小于、大于

      7

      ==??,??!=

      等于、不等于

      6

      &

      按位與

      5

      ^

      按位異或

      4

      |

      按位或

      3

      &&

      邏輯與

      2

      ||

      邏輯或

      1

      =,+=,-=,*=,/=,%=,&=,

      ^=,??|=,??<<=,??>>=

      賦值、運(yùn)算且賦值

      運(yùn)算符優(yōu)先級(jí)表明在每個(gè)表達(dá)式或子表達(dá)式中哪一個(gè)運(yùn)算對(duì)象首先被求值,數(shù)值越大優(yōu)先級(jí)越高,具有較高優(yōu)先級(jí)級(jí)別的運(yùn)算符先于較低級(jí)別的運(yùn)算符進(jìn)行求值運(yùn)算。

      例子?1:?加減乘除

      [root@localhost ~]# aa=$(( (11+3)*3/2 )) #雖然乘和除的優(yōu)先級(jí)高于加,但是通過(guò)小括號(hào)可以調(diào)整運(yùn)算優(yōu)先級(jí) [root@localhost ~]# echo $aa 21

      例子?2:取模運(yùn)算

      [root@localhost ~]# bb=$(( 14%3 )) [root@localhost ~]# echo $bb 2 #14 不能被 3 整除,余數(shù)是 2

      例子?3:邏輯與

      [root@localhost ~]# cc=$(( 1 && 0 )) [root@localhost ~]# echo $cc 0 #邏輯與運(yùn)算只有想與的兩邊都是 1,與的結(jié)果才是 1,否則與的結(jié)果是 0

      9?、變量的測(cè)試與內(nèi)容置換

      變量置換方式

      變量?y?沒(méi)有設(shè)置

      變量?y?為空值

      變量?y?設(shè)置值

      x=${y-新值}

      x=新值

      x?為空

      x=$y

      x=${y:-新值}

      x=新值

      x=新值

      x=$y

      x=${y+新值}

      x?為空

      x=新值

      x=新值

      x=${y:+新值}

      x?為空

      x?為空

      x=新值

      x=${y=新值}

      x=新值

      y=新值

      x?為空

      y?值不變

      x=$y

      y?值不變

      x=${y:=新值}

      x=新值

      y=新值

      x=新值

      y=新值

      x=$y

      y?值不變

      x=${y?新值}

      新值輸出到標(biāo)準(zhǔn)錯(cuò)誤

      輸出(就是屏幕)

      x?為空

      x=$y

      x=${y:?新值}

      新值輸出到標(biāo)準(zhǔn)錯(cuò)誤

      輸出

      新值輸出到標(biāo)準(zhǔn)錯(cuò)誤

      輸出

      x=$y

      如果大括號(hào)內(nèi)沒(méi)有“:”,則變量?y?是為空,還是沒(méi)有設(shè)置,處理方法是不同的;如果大括號(hào)內(nèi)有“:”,則變量?y?不論是為空,還是沒(méi)有沒(méi)有設(shè)置,處理方法是一樣的。如果大括號(hào)內(nèi)是“-”或“+”,則在改變變量?x?值的時(shí)候,變量?y?是不改變的;如果大括號(hào)內(nèi)是“=”,則在改變變量?x?值的同時(shí),變量?y?的值也會(huì)改變。如果大括號(hào)內(nèi)是“?”,則當(dāng)變量?y?不存在或?yàn)榭諘r(shí),會(huì)把“新值”當(dāng)成報(bào)錯(cuò)輸出到屏幕上。看的頭都暈了吧,舉幾個(gè)例子說(shuō)明下吧:

      例子?1:

      [root@localhost ~]# unset y #刪除變量 y [root@localhost ~]# x=${y-new} #進(jìn)行測(cè)試 [root@localhost ~]# echo $x new #因?yàn)樽兞?y 不存在,所以 x=new [root@localhost ~]# echo $y #但是變量 y 還是不存在的

      和表?11-12?對(duì)比下,這個(gè)表是不是可以看懂了。這是變量?y?不存在的情況,那如果變量?y?的值是空呢?

      [root@localhost ~]# y="" #給變量 y 賦值為空 [root@localhost ~]# x=${y-new} #進(jìn)行測(cè)試 [root@localhost ~]# echo $x [root@localhost ~]# echo $y #變量 x 和變量 y 值都是空

      那如果變量?y?有值呢?

      [root@localhost ~]# y=old #給變量 y 賦值 [root@localhost ~]# x=${y-new} #進(jìn)行測(cè)試 [root@localhost ~]# echo $x old [root@localhost ~]# echo $y old #變量 x 和變量 y 的值都是 old

      例子?2:

      那如果大括號(hào)內(nèi)是“=”號(hào),又該是什么情況呢?先測(cè)試下變量?y?沒(méi)有設(shè)置的情況:

      [root@localhost ~]# unset y #刪除變量 y [root@localhost ~]# x=${y:=new} #進(jìn)行測(cè)試 [root@localhost ~]# echo $x new [root@localhost ~]# echo $y new #變量 x 和變量 y 的值都是 new

      一旦使用“=”號(hào),那么變量?y?和變量?x?都會(huì)同時(shí)進(jìn)行處理,而不像例子?1?中只改變變量?x?的值。那如果變量?y?為空又是什么情況呢?

      [root@localhost ~]# y="" #設(shè)定變量 y 為空 [root@localhost ~]# x=${y:=new} #進(jìn)程測(cè)試 [root@localhost ~]# echo $x new [root@localhost ~]# echo $y new #變量 x 和變量 y 的值都是 new

      一旦在大括號(hào)中使用“:”,那么變量?y??為空或者不設(shè)定,處理方式都是一樣的了。那如果??y??已經(jīng)賦值了,又是什么情況:

      [root@localhost ~]# y=old #給 y 賦值 [root@localhost ~]# x=${y:=new} #進(jìn)行測(cè)試 [root@localhost ~]# echo $x old [root@localhost ~]# echo $y old #原來(lái)變量 x 和變量 y 的值都是 old

      例子?3:

      再測(cè)試下大括號(hào)中是“?”的情況吧:

      [root@localhost ~]# unset y #刪除變量 y [root@localhost ~]# x=${y?new} -bash: y: new #會(huì)把值“new”輸出到屏幕上

      那如果變量?y?已經(jīng)賦值了呢:

      [root@localhost ~]# y=old #給變量 y 賦值 [root@localhost ~]# x=${y?new} #進(jìn)行測(cè)試 [root@localhost ~]# echo $x old [root@localhost ~]# echo $y old

      #變量?x?和變量?y?的值都是?old

      Linux Shell 運(yùn)維

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:如何在幻燈片中添加多條參考線?(幻燈片怎么加線條)
      下一篇:excel區(qū)域中包含錯(cuò)誤值的排名公式
      相關(guān)文章
      亚洲春黄在线观看| 午夜亚洲www湿好大| 久久精品国产精品亚洲精品| 亚洲AV无码乱码精品国产| 亚洲综合av一区二区三区不卡| 亚洲色av性色在线观无码| 亚洲VA中文字幕无码毛片| 国产亚洲福利精品一区| 亚洲中文字幕无码永久在线| 久久影视综合亚洲| 国产综合精品久久亚洲| 亚洲伊人久久综合影院| 国产AV无码专区亚洲AWWW| 亚洲自偷自偷偷色无码中文| 国产亚洲A∨片在线观看| 亚洲精品成人网站在线观看| 国产成人亚洲精品青草天美| 久久亚洲精品无码| 久久久亚洲欧洲日产国码aⅴ| 亚洲色图在线观看| 久久亚洲精品人成综合网| 亚洲视频在线观看免费| 久久丫精品国产亚洲av| 亚洲美女aⅴ久久久91| 亚洲国产品综合人成综合网站| 亚洲成在人线电影天堂色| 亚洲一区二区三区播放在线| 亚洲AV成人一区二区三区在线看| 亚洲午夜成人精品无码色欲| 亚洲av无码av在线播放| 全亚洲最新黄色特级网站 | 自拍偷自拍亚洲精品被多人伦好爽| 国产美女亚洲精品久久久综合| 国产精品亚洲一区二区三区在线| 亚洲AV无码乱码国产麻豆穿越| 蜜芽亚洲av无码精品色午夜| 亚洲女人18毛片水真多| 亚洲中文字幕无码中文| 国产精品亚洲色婷婷99久久精品| 亚洲精品国产精品国自产观看| 亚洲热妇无码AV在线播放|