久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

對話 UNIX: 更多 shell 腳本技術

瀏覽:13日期:2024-06-13 17:53:04

盡管在近兩年使用過 Unix 的一些人可能嘗試過 shell 腳本編程,但是他們很可能只是研究操作系統的細節(jié),并不精通 shell 腳本編程。本文針對那些希望進一步了解 shell 腳本,并開始編寫更高級腳本的讀者。本文提供腳本編程的基礎知識,包括如何簡化腳本、如何盡可能保持腳本的靈活性、如何編寫干凈的腳本、在腳本內編寫注釋以及調試腳本。

保持簡單

在人們學習如何編寫 shell 腳本時,常常遇到的一個問題是,重復他們在另一個腳本中已經做過的工作。他們其實不需要復制原來的腳本并修改幾個硬編碼值,只需創(chuàng)建一個函數來處理兩個腳本的重復部分。創(chuàng)建集中的函數還可以促進標準化,幫助創(chuàng)建統一的腳本。如果一個函數在腳本的一個部分工作正常,那么它在腳本中的其他地方也會正常工作。

例如,清單 1 所示的腳本應該濃縮和簡化為更簡單、更干凈的程序。

清單 1. 可以簡化的腳本示例

#!/usr/bin/kshif [[ $# -lt 2 ]]then echo "Usage: ${0##*/} <file name #1> <file name #2> exit 0fiif [[ ! -f "${1}" ]]then echo "Unable to find file '${1}'" exit 1fiif [[ ! -r "${1}" ]]then echo "Unable to read file '${1}'" exit 2figzip ${1}ls -l ${1}.gzif [[ ! -f "${2}" ]]then echo "Unable to find file '${2}'" exit 1fiif [[ ! -r "${2}" ]]then echo "Unable to read file '${2}'" exit 2figzip ${2}ls -l ${2}.gz

這個腳本看起來很糟糕!(謝天謝地,它只是一個示例)。這個腳本應該盡可能進行濃縮。從便于閱讀的角度來看,清單 2 提供的版本更干凈。

清單 2. 對清單 1 腳本進行濃縮的版本

#!/usr/bin/kshexit_msg() { [[ $# -gt 1 ]] && echo "${0##*/} (${1}) - ${2}" exit ${1:-0}}[[ $# -lt 2 ]] && exit_msg 0 "Usage: ${0##*/} <file name #1> <file name #2>for _FNAME in $@do [[ ! -f "${_FNAME}" ]] && exit_msg 1 "Unable to find file '${_FNAME}'" [[ ! -r "${_FNAME}" ]] && exit_msg 2 "Unable to read file '${_FNAME}'" gzip ${_FNAME} ls -l ${_FNAME}.gzdone

注意到這兩者的差異了嗎?這個腳本增加了一個簡單的函數來顯示一個消息并帶適當的返回碼退出,還把所有操作轉移到一個 for 循環(huán)中,這使這個腳本看起來更干凈、更容易理解了。

保持靈活性

編程和 shell 腳本編程的新手常常犯的另一個錯誤是,在程序或 shell 腳本中對靜態(tài)值進行硬編碼。這會限制腳本的靈活性,是一種糟糕的編程習慣。這迫使管理員或開發(fā)人員不得不經常修改腳本以使用其他值;為了避免這個問題,應該使用變量并為腳本或函數提供參數。

例如,清單 3 是一個編寫得很差的不靈活的示例腳本。

清單 3. 不靈活的示例腳本

#!/bin/bashif [[ -f /home/cormany/FileA ]]then echo "Found file '/home/cormany/FileA'"elif [[ -f /home/cormany/DirA/FileA ]]then echo "Found file '/home/cormany/DirA/FileA'"else echo "Unable to find file FileA"fi

這個腳本可以正常工作,但是它只能在兩個位置搜索一個文件。

清單 4 提供相同的功能,但是允許用戶在任何位置搜索任何文件。

清單 4. 使腳本更靈活

#!/bin/bashexit_msg() { [[ $# -gt 1 ]] && echo "${0##*/} (${1}) - ${2}" exit ${1:-0}}[[ $# -lt 2 ]] && exit_msg 1 "Usage: ${0##*/} <file name> <location>"_FNAME="${1}"_DNAME="${2}"[[ ! -d "${_DNAME}" ]] && exit_msg 2 "Unable to read or find Directory '${_DNAME}'"if [[ -f "${_DNAME}/${_FNAME}" ]]then exit_msg 0 "Found file '${_DNAME}/${_FNAME}'"else exit_msg 3 "Unable to find file '${_DNAME}/${_FNAME}'"fi

這個腳本更靈活,因為它允許用戶指定要搜索的任何文件和任何搜索目錄。

提供選項

在編寫一個 shell 腳本時,一些用戶可能會說,“它真不錯! 或者 “我喜歡使用它;而同時,其他用戶可能不同意這個評價,他們可能不希望執(zhí)行相同的操作。人們喜歡有選擇,為什么不給他們提供選項呢?內置的 shell 命令 getopt 可以完成這個任務。

清單 5 提供一個在 AIX 中使用 getopt 的基本示例。

清單 5. getopt 示例

#!/usr/bin/ksh_ARGS=`getopt -o x --long xxxxx -n ${0##*/} -- "$@"`while [[ $# -gt 0 ]]do case "${1}" in-x|--xxxxx) echo "Arg x hit!"shift;;--) shift; break;; *) echo "Invalid Option: ${1}"break;; esacdone

在執(zhí)行包含 getopt(稱為 opttest)的腳本時,如果在 -x 或 --xxxxx 中使用有效的參數,getopt 會識別出開關并執(zhí)行 case 開關中的代碼:

# ./hm -xArg x hit!

下面是使用無效開關或選項時的結果:

# ./hm -aInvalid Option: -a

文檔,文檔,文檔

我們在職業(yè)生涯中早晚會受到這個問題的困擾。老板要求您看看一個 10 年前編寫的腳本,它的作者已經不再為公司工作了。您會說 “沒問題 嗎?通常情況下,可能沒問題;但是,如果這個腳本很復雜,執(zhí)行了您不習慣使用的命令,采用的編寫風格與您的風格不一樣,或者干脆就不能正常工作,您就遇到大麻煩了。在這種情況下,一些反映作者當初編寫這個腳本時的想法的提示會有很大的幫助。有時候,您開發(fā)了一個自認為只使用一次的腳本,但是以后卻發(fā)現還需要修改它。或者,您用幾星期時間編寫了一個巨大的腳本,您了解這個腳本的所有細節(jié),但是如果別人閱讀它,卻不知所云。這幾種情況說明,文檔之于開發(fā)人員就像腳本之于用戶,都非常重要。

看看清單 6 所示的函數。

清單 6. 沒有注釋的腳本示例

confirm_and_exit() { [[ ${_DEBUG_LEVEL} -ge 3 ]] && set -x while [[ -z ${_EXIT_ANS} ]] docup_echo "Are you sure you want to exit? [Y/N] c" ${_PROMPT_ERR_ROW} ${_PROMPT_ERR_COL}${_TPUT_CMD} cnormread ${_NO_EOL_FLAG:+${_READ_FLAG:-'-n'}} ${_NO_EOL_FLAG} _EXIT_ANS${_TPUT_CMD} civis done case ${_EXIT_ANS} in[Nn]) unset _EXIT_ANS; return 0;;[Yy]) exit_msg 0 1 "Exiting Script";;  *) invalid_selection ${_EXIT_ANS}; unset _EXIT_ANS;; esac return 0}

如果您有比較豐富的 shell 腳本編程經驗,可能能夠讀懂這個腳本。但是,腳本編程的初學者很難理解這個函數的作用。如果花上幾分鐘在這個腳本中添加注釋,情況就大不一樣了。清單 7 給出包含注釋的同一個函數。

清單 7. 包含注釋的腳本示例

########################################## function confirm_and_exit#########################################confirm_and_exit() { # if the debug level is set to 3 or higher, send every evaluated line to stdout [[ ${_DEBUG_LEVEL} -ge 3 ]] && set –x # Continue to prompt the user until they provide a valid answer while [[ -z ${_EXIT_ANS} ]] do# prompt user if they want to exit the script# cup_echo function calls tput cup <x> <y># syntax:# cup_echo <string to display> <row on stdout to display><column on stdout to display>cup_echo "Are you sure you want to exit? [Y/N] c" ${_PROMPT_ERR_ROW} ${_PROMPT_ERR_COL}# change cursor to normal via tput${_TPUT_CMD} cnorm# read value entered by user# if _NO_EOL_FLAG is supplIEd, use value of _READ_FLAG or “-n# if _NO_EOL_FLAG is supplied, use value as characters aloud on read# assign value entered by user to variable _EXIT_ANSread ${_NO_EOL_FLAG:+${_READ_FLAG:-'-n'}} ${_NO_EOL_FLAG} _EXIT_ANS# change cursor to invisible via tput${_TPUT_CMD} civis done # if user entered “n, return to previous block of code with return code 0 # if user entered “y, exit the script # if user entered anything else, execute function invalid_selection case ${_EXIT_ANS} in[Nn]) unset _EXIT_ANS; return 0;;[Yy]) exit_msg 0 1 "Exiting Script";;  *) invalid_selection ${_EXIT_ANS}; unset _EXIT_ANS;; esac # exit function with return code 0 return 0}

對于這么小的函數,這似乎太麻煩了,甚至有點過分,但是對于 shell 腳本編程新手和閱讀這個函數的人員而言,注釋是非常有價值的。

在 shell 腳本中,注釋的另一個極其有幫助的用途是,解釋變量的有效值以及解釋返回碼的含義。

清單 8 中的示例取自一個 shell 腳本的開頭。

清單 8. 未加注釋的變量示例

#!/usr/bin/bashtrap 'exit_msg 1 0 "Signal Caught. Exiting..."' HUP INT QUIT KILL ABRTtrap 'window_size_changed' WINCH_MSG_SLEEP_TIME=3_RETNUM_SIZE=6_DEBUG_LEVEL=0_TMPDIR="/tmp"_SP_LOG="${0##*/}.log"_SP_REQUESTS="${HOME}/sp_requests"_MENU_ITEMS=15LESS="-P LINE: %l"export _SP_REQUESTS _TMPDIR _SP_LOG _DB_BACKUP_DIRexport _DEBUG_LEVEL _NEW_RMSYNC _RMTOTS_OFFSET_COL

同樣,很難理解 trap 語句的作用以及每個變量可以是哪些值。除非把整個腳本都讀一遍,否則不可能看出這些變量的意義。另外,這里沒有提到這個腳本中使用的任何返回碼。這會大大增加解決 shell 腳本問題的難度。向 清單 8 的代碼行中添加一些注釋和一個專門描述返回碼的注釋塊,這樣就可以顯著降低理解難度。看看下面的清單 9。

清單 9. 帶注釋的變量示例

#!/usr/bin/bash########################################################################## traps########################################################################## trap when a user is attempting to leave the scripttrap 'exit_msg 1 0 "Signal Caught. Exiting..."' HUP INT QUIT KILL ABRTtrap 'window_size_changed' WINCH# trap when a user has resized the window################################################################################################################################################### defined/exported variables#########################################################################_MSG_SLEEP_TIME=3  # seconds to sleep for all messages # (if not defined, default will is 1 second)_CUSTNUM_SIZE=6  # length of a customer number in this location # (if not defined, default is 6)_DEBUG_LEVEL=0 # log debug messages. log level is accumulative # (i.e. 1 = 1, 2 = 1 & 2, 3 = 1, 2, & 3) # (if not defined, default is 0) # Log levels: # 0 = No messages # 1 = brIEf messages (start script, errors, etc) # 2 = environment setup (set / env) # 3 = set -x (A LOT of spam)_TMPDIR="/tmp" # Directory to put work/tmp files # (if not defined, default is /tmp)_SP_LOG="${0##*/}.log"  # log of script events_SP_REQUESTS="${HOME}/sp_requests"# file to customer record requests,  # also read at startup_MENU_ITEMS=15# default number of items to display per page  # (it not defined, default is 10)LESS="-P LINE: %l"# format 'less' prompt. MAN less if more info# export the variables defined aboveexport _MSG_SLEEP_TIME _CUSTNUM_SIZE _DEBUG_LEVEL _TMPDIR_SP_LOG _SP_REQUESTS _MENU_ITEMS#########################################################################

看起來好多了,不是嗎?所有東西都組織有序,并且有詳細的描述,初次閱讀這個腳本的人更容易理解它的作用。

調試

編寫完一個腳本之后,就要第一次運行它了。但是,如果在執(zhí)行腳本時顯示某些意外的錯誤,應該怎么辦呢?沒有人是完美的,而且從頭編寫腳本并保持沒有錯誤需要大量時間和豐富的經驗;大多數時候,開發(fā)人員很容易漏掉一個字母或者顛倒了兩個字母的順序,這幾乎是不可避免的。不必擔心:AIX、其他風格的 Unix 和 Linux 中的 shell 已經考慮到了這個問題,可以幫助您進行調試。

例如,清單 10 中的 shell 腳本(名為 make_errors)已經編寫好等待執(zhí)行。

清單 10. 包含錯誤的腳本示例

#!/bin/bash_X=1while [[ ${_X} -le 10 ]]do [[ ${_X} -lt 5 ]] && echo "X is less than 5! _Y=`expr ${_X) + 1` if [[ ${_Y} -eq 6 ]]echo "Y is now equal to ${_Y}" fi _X=${_Y}done

但是,初次執(zhí)行這個腳本時,顯示以下錯誤:

# ./make_errors./make_errors: line 11: unexpected EOF while looking for matching `"'./make_errors: line 16: syntax error: unexpected end of file

Vim 是一種出色的調試工具,您可能使用過它,但不一定了解它的真正價值。Vim 是一種強大的文本編輯器,但是它對調試也很有幫助。如果通過設置 .exrc 或 .vimrc 文件指定用不同的顏色顯示某些錯誤,Vim 就會替您完成大部分調試工作,見圖 1。

圖 1. 用 Vim 進行調試

第一個錯誤消息(line 11: unexpected EOF while looking for matching `"')指出在第 11 行上有錯誤,但是看過這一行之后,并沒有發(fā)現任何錯誤。再看看第 9 行。echo 后面的字符串的末尾缺少一個雙引號(")。這個示例很好地說明了在進行調試時為什么必須查看整個腳本。錯誤消息中顯示的行號不一定是出現錯誤的實際位置。報告第 11 行有錯誤是因為第 9 行用雙引號標出一個字符串的開頭,但是這個字符串直到第 11 行還沒有結束。要想糾正這個錯誤,應該在第 9 行末尾添加雙引號。

其他一些問題也會顯示為錯誤。在第 11 行上,變量值 _X 后面是一個用紅色突出顯示的后圓括號())。這是 Vim 替您做出的判斷,它指出這里有錯誤。這里用一個前花括號({)標出了變量值 _X 的開頭,但是沒有用后花括號(})結束。只需把 ) 改為 },就能夠糾正這個錯誤。

到目前為止,已經糾正了兩個錯誤。再次運行這個腳本,看看會發(fā)生什么:

./make_errors: line 12: syntax error near unexpected token `fi'./make_errors: line 12: ` fi'

還有另一個錯誤。錯誤消息指出問題出現在第 12 行上,但是這一行只有一個用來結束 if 語句的 fi。這有什么錯呢?請牢記前一個錯誤的情況。并非所有錯誤都源自 shell 所報告的行上。shell 僅僅報告發(fā)生錯誤的位置,但是錯誤的根源可能出現在這個位置之前。對于這個小腳本,可以很有把握地猜測錯誤可能出現在實際的 if 語句中。回憶一下基本的腳本編程邏輯:if 語句由 if、then 和 fi 組成。看看這個條件語句,可以看出缺少了 then。只需在腳本中添加 then。完成之后,這個腳本應該類似于清單 11。

清單 11. 糾正清單 10 中的錯誤之后的腳本

#!/bin/bash_X=1while [[ ${_X} -le 10 ]]do [[ ${_X} -lt 5 ]] && echo "X is less than 5!" _Y=`expr ${_X} + 1` if [[ ${_Y} -eq 6 ]] thenecho "Y is now equal to ${_Y}" fi _X=${_Y}done

再次運行這個腳本:

# ./make_errorsX is less than 5!X is less than 5!X is less than 5!X is less than 5!Y is now equal to 6

恭喜!這個腳本現在正常工作了!

set -x 選項

有時候,對 shell 腳本執(zhí)行基本的錯誤排除步驟并不像前一個示例那么容易。如果所有努力都失敗了,并且想不出腳本的錯誤之處在哪里,那么最后一招就是動用 “殺手锏!Ksh、Bash 和其他現代 shell 都支持在 set 命令中使用 -x 開關。如果使用 set –x 選項,執(zhí)行的每個命令都顯示在 stdout 中。為了突出顯示執(zhí)行的代碼,set –x 把 PS4 變量的值加在顯示的每行代碼前面。請記住,這種做法會產生大量文本,所以在查看輸出時要有耐心。

減小前一個示例中的循環(huán)計數值,在腳本的開頭添加 set -x 和一個注釋,見清單 12。

清單 12. set -x 示例

#!/bin/bashset -x# loop through and display some test statements_X=1while [[ ${_X} -le 4 ]]do [[ ${_X} -lt 2 ]] && echo "X is less than 2! _Y=`expr ${_X} + 1` if [[ ${_Y} -eq 3 ]] thenecho "Y is now equal to ${_Y}" fi _X=${_Y}done

在執(zhí)行這個腳本之前,把 PS4 變量改為某個看起來醒目的字符串:

# export PS4="DEBUG => "

接下來,執(zhí)行這個腳本,就會看到可能非常有價值的信息,見清單 13。

清單 13. set -x 的輸出

# ./make_errorsDEBUG => _X=1DEBUG => [[ 1 -le 4 ]]DEBUG => [[ 1 -lt 2 ]]DEBUG => echo 'X is less than 2!'X is less than 2!DDEBUG => expr 1 + 1DEBUG => _Y=2DEBUG => [[ 2 -eq 3 ]]DEBUG => _X=2DEBUG => [[ 2 -le 4 ]]DEBUG => [[ 2 -lt 2 ]]DDEBUG => expr 2 + 1DEBUG => _Y=3DEBUG => [[ 3 -eq 3 ]]DEBUG => echo 'Y is now equal to 3'Y is now equal to 3DEBUG => _X=3DEBUG => [[ 3 -le 4 ]]DEBUG => [[ 3 -lt 2 ]]DDEBUG => expr 3 + 1DEBUG => _Y=4DEBUG => [[ 4 -eq 3 ]]DEBUG => _X=4DEBUG => [[ 4 -le 4 ]]DEBUG => [[ 4 -lt 2 ]]DDEBUG => expr 4 + 1DEBUG => _Y=5DEBUG => [[ 5 -eq 3 ]]DEBUG => _X=5DEBUG => [[ 5 -le 4 ]]

可以看到這里有大量信息:處理并執(zhí)行的每個命令都顯示出來了。還要注意,在調試信息中沒有顯示 shell 腳本中的注釋。這是因為 shell 在讀取注釋之后并不執(zhí)行它。還好,在完成前面的修改之后,這個腳本沒有錯誤了!

在使用 set -x 時還要記住一點:如果腳本有內部函數,而且 set -x 放在代碼的主體部分,那么它的輸出會包含子函數的運算過程。但是,如果 set -x 只放在內部函數中,那么 debug 選項的影響范圍只包含這個內部函數中的代碼和在其中調用的子函數;shell 腳本的主體并不包含在內,這是因為它不知道它的內部函數會調用這個例程。

結束語

無論是使用 shell 腳本、C、Java™ 語言或其他語言,我們都在不斷地改進編程方法。堅持簡單化的基本規(guī)則,保持代碼簡潔靈活,給代碼加上適當的注釋,再借助調試工具的幫助,您很快就能編寫出出色的 shell 腳本。祝您好運!

標簽: Unix系統
主站蜘蛛池模板: 嫩草视频网 | 欧美一区二区三区在线观看视频 | 韩国av一区二区 | 午夜精品在线观看 | 91看片网站 | 欧美中文在线 | www.91在线 | 久久中文在线观看 | 欧美日韩国产一区二区三区 | 天天爽夜夜爽夜夜爽精品视频 | 亚洲视频免费网站 | 精品久久一区 | 中文字幕在线视频第一页 | 国产精品久久婷婷六月丁香 | 在线观看国产高清视频 | 久久精品国产清自在天天线 | 日韩中文在线 | 国产一区二区影院 | 一级免费黄色免费片 | 亚洲精品乱码久久久久久国产主播 | 在线观看国产一级片 | 欧美黄色片 | 来个毛片 | 99精品一区二区 | 亚洲精品久久久久久一区二区 | 国产精品久久久久久久久久久久冷 | 91精品国产成人 | 91香蕉视频在线观看 | 韩日精品在线观看 | 成人国产精品色哟哟 | 国产精品二区一区二区aⅴ污介绍 | 污视频在线观看免费 | 欧美一区二区在线播放 | 欧美午夜一区 | 欧美成年黄网站色视频 | 欧美高清视频在线观看 | 精品久久av | 亚洲电影在线观看 | 国产大片黄色 | 久久爱9191| 精品国产鲁一鲁一区二区三区 | 成年人网站在线免费观看 | 久久久精品免费观看 | 国产高清小视频 | 综合色成人 | 国产美女精品一区二区三区 | 欧美一区二区三区在线观看视频 | 日韩欧美在线播放 | 欧美大片一区二区 | 99福利视频 | 五月天婷婷综合 | 中文字幕视频在线 | 国产三级日本三级美三级 | 久久中文字幕一区 | 欧美日韩成人 | 国产精品乱码人人做人人爱 | 日本免费视频在线观看 | 色婷婷一区二区三区四区 | 91免费看| 毛片在线视频 | 成人精品网站在线观看 | 在线欧美日韩 | 国产精品.xx视频.xxtv | 亚洲成人综合网站 | 国产精品一区av | 国产乱码精品1区2区3区 | av网站免费线看 | 日本久久久久 | 亚洲中字幕女 | 国产三区在线成人av | 成人黄色电影小说 | 精品免费视频 | 91 久久| 亚洲在线视频 | 欧美日韩第一页 | 精品国产乱码一区二区三区a | 黄色日本视频 | 五月天婷婷激情视频 | 免费高潮视频95在线观看网站 | 久草视| 国产97色在线 | 亚洲 | 国产欧美日韩综合精品一区二区 | 婷婷丁香六月天 | 成人av免费在线观看 | av一区二区三区 | 久久精品国产亚洲 | 久久精品久久精品国产大片 | 日韩二区三区 | 成人精品久久久 | 中文字幕精品一区二区三区精品 | 亚洲精品乱码 | 久久精品视频免费 | 免费在线观看一级毛片 | 91大神免费观看 | 日韩专区一区二区三区 | 免费黄色片一区二区 | 在线视频 亚洲 | 色综久久 | 一区二区久久 | 日韩a∨| www.色综合| 欧美日韩国产综合视频 | 国产精品一二 | 国产黄色免费视频 | 亚洲午夜视频在线观看 | 欧美日韩综合视频 | 欧美一级性 | 国产综合久久 | 在线播放一区二区三区 | av天天操| 成人精品鲁一区一区二区 | 在线看亚洲 | 久久亚洲精品中文字幕 | 6080yy精品一区二区三区 | 午夜社区 | 黄色一级大片视频 | 中文字幕在线资源 | 国产精品乱码一区二区三区 | 999精品免费 | 色www精品视频在线观看 | 亚洲高清网 | 国产日韩一区二区三区 | av在线播放免费 | 日韩欧美成人影院 | 三级视频在线 | 国家aaa的一级看片 操操操夜夜操 | 欧美日韩国产精品一区二区亚洲 | 91高清在线观看 | 一区二区视频网站 | 久在线视频 | 久久久久久av | 国产小视频在线播放 | 亚洲精品中文字幕 | 91视频在线播放视频 | 国产丝袜在线 | 国产一级免费视频 | 精久久| 最新中文字幕在线 | 日韩aaa视频| 91精品一区二区三区久久久久久 | 中文字幕99| 日韩欧美国产一区二区 | 日韩在线视频中文字幕 | 一级黄色片a级 | 一区中文字幕 | 国产免费网址 | 人人操日日干 | 国产精品久久久久久久久免费桃花 | 一级黄色影视 | 日韩午夜| 超碰av人人 | 成人做爰69片免费 | www.操.com | 九九热在线视频免费观看 | 国产精品久热 | 国产在线精品一区二区 | 自拍偷拍专区 | 深夜成人小视频 | 99精品视频在线 | baoyu123成人免费看视频 | 日本欧美在线 | 亚洲成人在线视频网站 | 三级视频网站 | 精品国产31久久久久久 | www.se天堂| 亚洲欧美中文日韩v在线观看 | 成人免费视频7777777 | 97夜夜操| 久草中文在线 | 一级片av | 国产一区二区三区在线免费 | 一本色道久久综合狠狠躁篇的优点 | 精品久久久久久久 | 日韩一区二区三区av | 国产成人jvid在线播放 | 欧美日本精品 | 国产成人免费视频网站高清观看视频 | 日本色网址 | 日韩欧美中文 | 久久国产精品视频 | 色综合天天综合网国产成人网 | 久久都是精品 | 欧美日韩电影一区二区三区 | 二区在线观看 | 国产精品视频 | 欧美性一级| 精品久久伊人 | 在线观看免费av网站 | 欧美久久久网站 | av免费网站在线观看 | 九九香蕉视频 | 午夜精品久久久久久久男人的天堂 | 国产午夜精品一区二区三区 | 中文字幕亚洲精品 | 久久爱www.| 午夜高清视频 | 中文在线资源 | 中国一级毛片 | 日韩免费网 | 涩涩片影院| 久久亚洲欧美日韩精品专区 | 成人av影院 | 日韩中文一区二区 | 久久天堂| 色婷婷网 | 欧美精品一区二区三区四区在线 | 国产一区二区黑人欧美xxxx | 精品久久久久一区二区国产 | 污视频免费网站观看 | 亚洲国产精品久久久久婷婷老年 | 中文字幕亚洲欧美精品一区四区 | 日日操av | 四虎精品在线 | 国产黄网 | 国产香蕉视频在线播放 | 午夜精品久久久久久久男人的天堂 | 一区二区三区四区在线播放 | 一区二区久久 | 欧美一级黄 | 日韩在线中文字幕 | 亚洲免费视频网址 | 最近的中文字幕在线看视频 | 亚洲视频区 | 国产69精品99久久久久久宅男 | 久久综合九色综合欧美狠狠 | 久久国产精品视频 | 黄色网免费看 | 亚洲欧美精品一区二区三区 | 亚洲精品一区二区三区精华液 | 正在播放欧美 | 一区二区免费在线 | 日韩av免费在线播放 | 国产亚洲欧美一区 | 欧美a区| 欧美日韩精品一区二区三区在线观看 | 亚洲精品二三区 | 久久精品视频网站 | 色av综合| m豆传媒在线链接观看 | 日韩在线 | 成人久久久久爱 | 99精品网站| 99精品欧美一区二区三区 | 国产日韩精品视频 | 亚洲国产精品99久久久久久久久 | 精品国产欧美一区二区 | 国产精品久久久av | 亚洲一区二区免费在线观看 | 欧美三级视频在线播放 | 国产无套一区二区三区久久 | www.视频在线观看 | 在线视频中文字幕 | 国产成人午夜高潮毛片 | 一区二区三区视频免费看 | 不卡视频一区二区三区 | 国产综合99| 欧美精品中文字幕久久二区 | 亚洲美女久久 | 国产成人片 | 日本一区二区三区四区 | 一区二区免费视频 | 成人免费网站 | 毛片网免费| 武道仙尊动漫在线观看 | 蜜月久久99静品久久久久久 | 综合色爱 | 最新中文字幕在线 | 久久只有精品 | 日本天天色 | 国产无套丰满白嫩对白 | 成人天堂666 | 特级毛片在线大全免费播放 | 国产在线2 | 超碰九七在线 | 久久性色| 国产欧美精品一区二区三区四区 | 天天操天天舔 | 国产精品免费久久 | 中文字幕一区二区三区精彩视频 | 欧美视频网站 | 欧美日韩精品久久久 | 人人草视频在线观看 | a免费视频| 玖玖成人 | 欧美日韩中文 | 中文字幕日韩在线 | 亚洲协和影视 | 91久久看片| 国产精品久久久一区 | 一区二区日韩欧美 | 欧美精品一二三 | 九九热欧美 | 黑人巨大精品欧美一区二区免费 | a免费在线观看 | 亚洲精品一区二区三区蜜桃久 | 欧美一级播放 | 精品国产乱码久久久久久久软件 | 中文在线播放 | 91嫩草在线 | 亚洲第一视频网站 | 久久精品在线观看视频 | 一级毛片视屏 | 国产女人和拘做受视频 | 久久伊 | 毛片链接| 97成人精品视频在线观看 | 精品久久久久av | 精品国产青草久久久久福利 | 国产黄色大片 | 欧美久草 | 成人午夜精品一区二区三区 | 一区二区免费在线视频 | 成人免费一区二区三区视频网站 | 午夜视频在线观看网站 | 午夜草民福利电影 | 午夜av电影 | 国产在线不卡一区 | 亚洲成人免费影院 | 免费在线看a| 国产中文一区二区三区 | 欧美一区日韩一区 | 香蕉三级| 91久久综合亚洲鲁鲁五月天 | 91成人区| 国产精品久久久久久亚洲调教 | 亚洲欧美在线观看 | 午夜免费视频网站 | 久久久亚洲 | 91操碰 | 亚洲一区二区三区在线免费观看 | 亚洲日韩欧美一区二区在线 | 欧美日韩精品一区二区在线播放 | 视频精品一区 | 国产精品亚洲成在人线 | 国产精品高清在线观看 | 亚洲不卡网站 | 欧美久久久久 | 国产在线精品一区 | 日本视频黄| 国产ts余喵喵和直男多体位 | 国外成人在线视频 | 欧美色图另类 | 麻豆亚洲| 成人免费视频在线观看 | 黄网在线观看 | 一区二区三区免费网站 | 久久久久久久一区 | 久久com| 黄色成人av | 欧美不卡 | 国产精品久久久久9999 | 日韩视频国产 | 欧美日韩国产综合在线 | 国产美女精品一区二区三区 | 日本黄色免费大片 | 成人在线 | 伊人电影综合网 | 免费在线日韩 | 亚洲精品国产a久久久久久 国产毛片毛片 | 日韩在线观看 | 蜜桃av一区二区三区 | 国产精品视频免费观看 | 成人日韩av | 一区二区电影 | 一级片在线观看 | 国产a级毛片 | 在线日韩视频 | 在线色av| 欧美性一区二区三区 | 青青草99| 日韩午夜激情 | 午夜精品久久久久久久久久久久 | 精品国产成人 | 成人在线视频免费观看 | 亚洲视频二区 | 成人h动漫免费观看网站 | 女人色网 | jizz在线播放 | 日韩欧美在线一区二区 | 91电影在线观看 | 婷婷成人在线 | 日韩成人影院 | 久久午夜综合久久 | 免费在线观看av的网站 | 日本a在线 | 嫩草视频入口 | 综合色爱 | 91国内精品久久 | 成人不卡 | 欧美成人激情视频 | 操操操av| 射久久| 99视频在线免费观看 | 国产h在线| 国产一级免费视频 | 欧美日韩在线二区 | 日本高清无卡码一区二区久久 | 国产精品福利网站 | 久久免费黄色网址 | 亚洲精品久久久久国产 | 亚洲a级在线观看 | 久久精品 | 亚洲动漫在线观看 | 国产一级黄色av | 午夜伦理影院 | 一区二区三区在线免费观看 | 精品国产黄色片 | 中文字幕国产视频 | 无码少妇一区二区三区 | 色综合五月婷婷 | 精品欧美乱码久久久久久 | 亚色在线 | 亚洲天堂一区 | 日韩一区二区在线观看 | 99精品一区| 日韩免费观看视频 | 永久看片 | 亚洲无吗天堂 | www.亚洲成人网 | 国产一级片 | 日韩精品一区在线 | 欧美日韩亚洲视频 | 日韩中文字幕无码一区二区三区 | 午夜激情免费在线观看 | 亚洲免费人成在线视频观看 | 一级免费黄色免费片 | 成人国产在线 | 亚洲高清视频在线 | 久久久久久影院 | 国产亚洲欧美一区二区 | 亚洲永久免费观看 | 国产自产才c区 | 国产精品久久久久国产a级 91福利网站在线观看 | 91在线免费观看 | 中文字幕在线观看一区二区三区 | 成人亚洲一区二区 | 欧洲一区二区三区 | 91久久久www播放日本观看 | 男女做爰高清无遮挡免费视频 | 成人av视| 久久av资源 | 成人福利在线观看 | 人人操日日干 | 麻豆精品久久 | 国精品产品区三区 | 亚洲成人网一区 | 亚洲国产成人在线观看 | 久久成人午夜 | 日韩在线不卡视频 | a级网站在线观看 | 成人av电影网址 | 日韩精品一区二区三区老鸭窝 | 91精品久久 | 超级碰在线视频 | 国产激情亚洲 | 狠狠躁夜夜躁人人爽天天天天97 | 99成人 | 中国大陆高清aⅴ毛片 | 久草视频在线播放 | 福利网在线 | 久久久久久久中文 | 中文字幕久久精品 | 久久久久久网站 | 日韩一二三区视频 | 久久成人免费视频 | 欧美大片一区二区 | 亚洲精品国偷拍自产在线观看 | 麻豆网址| 91.成人天堂一区 | 久久国产精品一区二区 | 色狠狠一区 | 在线观看免费的av | 性视频一区二区 | 欧美日韩视频在线 | 午夜成人在线视频 | 日韩中文一区二区 | 日本jizz在线观看 | 一级片视频免费 | 成人av网址在线观看 | 成人av免费观看 | 91av国产在线视频 | 国产一区二区免费电影 | 精品国产伦一区二区三区观看说明 | 欧美一级黄色网 | 久久精品国产免费 | 视频精品一区 | 二区在线观看 | 麻豆精品久久 | 91精品久久久久久久久久久久久久久 | 日韩精品一区二区三区老鸭窝 | 日韩免费在线 | 国产亚洲一区二区三区在线观看 | 国产激情在线观看 | 成人在线小视频 | 久久mm | 在线观看欧美日韩 | 午夜精品视频 | 免费国产一区 | 亚洲男人天堂网 | 成人在线播放网站 | 日韩欧美中文在线 | 精品二区视频 | 亚洲综合色网 | 欧美在线 | 亚洲 | 91社影院在线观看 | 国产一区二区三区免费观看 | 超碰在线天天 | 国产精品欧美一区二区 | 禁果av一区二区三区 | 少妇无套高潮一二三区 | 亚洲男人av| se在线播放| 亚洲精品夜夜夜 | 高清一区二区三区 | 日韩av在线免费 | 狠狠操电影| 精品久久久久久亚洲综合网 | 久久成年人视频 | 亚洲一区二区三区高清 | 性视频一区二区 | 精品91在线 | 日p视频免费看 | 精品成人在线视频 | 午夜电影 | 91视频三区 | 欧美久久久 | 毛片毛片毛片毛片毛片毛片 | 久久女人网| 午夜小影院 | 伊人在线 | 欧美日韩亚洲高清 | 99久热在线精品视频观看 | 男人久久天堂 | 久草高清在线 | 国产精品美女久久久久久久久久久 | 国产黑丝在线 | 三级黄色片在线免费观看 | 四虎影院观看 | 一区二区久久久 | 国产一级在线观看 | 97超碰自拍| 成人精品鲁一区一区二区 | 日韩久久久一区二区 | 国产亚洲精品成人av久久影院 | 国产视频中文字幕 | 亚洲一区日韩 | 精品一区二区三区在线观看 | 成人一级片在线观看 | 伊人干综合 | 天堂av中文在线 | 日韩精品在线免费 | 国产毛片精品 | 国产一区av在线 | 成人欧美一区二区三区在线播放 | 成人欧美一区二区三区黑人孕妇 | 国产一区二区三区免费观看 | 欧美在线观看一区 | 中文字幕高清视频 | 一级毛片免费 | 亚洲国产精品99久久久久久久久 | 久久99精品久久久久久园产越南 | 欧美激情在线狂野欧美精品 | 久久精品中文字幕 | 免费视频一区二区 | 中文在线一区二区 | 亚洲视频在线观看一区二区三区 | 亚洲 中文 欧美 日韩 在线观看 | 一区二区中文字幕 | 亚洲国产中文字幕 | 欧美色爽| 亚洲电影在线观看 | 久久久久久久久综合 | 热re99久久精品国产99热 | 三级在线免费 | 国产精品久久婷婷六月丁香 | 精品综合 | 一级毛片免费在线 | 国产高清第一页 | 特级毛片www | 午夜精品久久久久久久男人的天堂 | av一级毛片| 成人在线播放 | 天堂视频在线 | 色吧综合网 | 欧美一区二区免费 | 国产欧美精品一区二区色综合 | 国产欧美精品 | 在线观看a视频 | 国产99久久精品一区二区永久免费 | 丁香久久 | 亚洲欧美一区二区三区在线 | 欧美日韩视频一区二区 | 国产精品一区二区在线 | 日韩视频一区二区三区四区 | 不卡视频一二三区 | 亚洲wu码 | h免费在线观看 | 一本色道精品久久一区二区三区 | 一区二区日韩精品 | hsck成人网| 欧美一区二区三区免费 | 欧美综合激情 | 亚洲国产精品综合久久久 | 欧洲美女7788成人免费视频 | 中文字幕日韩欧美 | 久久久精品欧美一区二区免费 | 日韩视频免费在线播放 | 日韩视频在线免费 | 蜜桃精品久久久久久久免费影院 | 中文字幕在线一区 | 7777久久| 四虎网址 | 欧美小电影 | 美女在线国产 | 黄网站免费在线观看 |