日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

對(duì)話 UNIX: Squirrel--可移植的 shell 和腳本語言

瀏覽:402日期:2024-06-08 08:43:28

1799 年,一名法國陸軍工程師取得了一項(xiàng)重大發(fā)現(xiàn)。不,不是鵝肝醬、卡門培爾奶酪、巴氏消毒法或沙特(Sartre)— 實(shí)際上,他發(fā)現(xiàn)了能夠破譯埃及古代象形文字的鑰匙 —— 羅塞塔石碑(參見 圖 1)。

圖 1. 羅塞塔石碑,1100 磅重,其上使用三國語言篆刻了稅收策略。碑文展示的是減免僧侶稅款的詔書。

這塊石碑制作于公元前 196 年,篆刻了對(duì)同一段文字的三種不同語言版本 — 分別是象形文字、通俗體文字(埃及草書)和希臘文字。通過對(duì)照翻譯,或在不同語言版本之間尋找對(duì)應(yīng)的詞匯,羅塞塔石碑解讀出已經(jīng)失傳已久的象形文字的含義。

換句話說,將羅塞塔石碑想像成 Babelfish。即使在公元前 196 年,就出現(xiàn)了使用一種以上的語言進(jìn)行表達(dá)。

公元 2000 年末,軟件開發(fā)人員面對(duì)著一個(gè)相似的問題。有太多的語言和方法可以用來表達(dá)同一內(nèi)容。即使對(duì)于命令行,也有許多類似的內(nèi)容可供選擇,包括各種 shell 和不同的命令組合。

通常來講,多樣性是件好事,但是它也會(huì)讓人覺得害怕。應(yīng)該選擇哪種解決方案?這種技術(shù)是否能夠跟上需求的變化?時(shí)間和精力方面的投入能否得到回報(bào)?這些編寫良好的代碼(或 Perl 代碼)是否會(huì)過時(shí)?更糟糕的是,是否需要針對(duì)其他環(huán)境轉(zhuǎn)換(重寫)所有內(nèi)容?

如果您不希望局限于 Fish shell、Bash shell、Z shell、Windows operating system 的 cmd.exe 或其他一些 shell 腳本語言的特性,那么請(qǐng)嘗試使用 Squirrel Shell。Squirrel Shell 提供了一種高級(jí)的、面向?qū)ο蟮哪_本語言,在 Unix、Linux、Mac OS X 和 Windows 系統(tǒng)上都可以良好地運(yùn)行。您只需要編寫一次腳本,就可以在任意平臺(tái)上運(yùn)行。

更妙的是,您需要做的工作非常簡單。

獲得 Squirrel

根據(jù) GNU Public License version 3 (GPLv3) 的條款,Squirrel Shell 很容易獲得并且可以免費(fèi)使用。最新的版本為 2008 年 10 月 11 日發(fā)布的 1.2.2。Squirrel Shell 的創(chuàng)建者和維護(hù)者是 Constantin "Dinosaur" Makshin。

Squirrel Shell 的下載頁面(參見 參考資料)提供了針對(duì) 32 位和 64 位 Windows 的源代碼和二進(jìn)制代碼。如果您使用 Unix 或 Linux,請(qǐng)檢查發(fā)行版附帶的庫,尋找合適的二進(jìn)制文件或從頭構(gòu)建 Squirrel Shell。

從頭構(gòu)建 Squirrel Shell 非常簡單。下載并提取源代碼 tarball 文件,放到源代碼目錄,然后使用非常典型的構(gòu)建 shell,如 清單 1 所示。

清單 1. 從頭構(gòu)建 Squirrel Shell

 $ ./configure --with-pcre=system && make && sudo make install Checking CPU architecture...x86 Checking for install.../usr/bin/install ... Configuration has been completed successfully. Build for x86 CPU architecture Installation prefix: /usr/local Allow debugging: no Build static librarIEs Use system PCRE 6.7 library Install MIME information: auto Create symbolic link: no Compile C code with 'gcc' Compile C++ code with 'g++' Create static libraries with 'ar rc' Create executables and shared libraries with 'g++' Install files with 'install' 

要查找與包有關(guān)的選項(xiàng)列表以進(jìn)行配置,需在命令行中輸入 ./configure --help。

為方便起見,Squirrel Shell 打包了 Perl Compatible Regular Expression (PCRE) 庫的源代碼,這些內(nèi)容在程序中被大量使用。如果系統(tǒng)缺少 PCRE,打包后的代碼可以使構(gòu)建變得簡單快捷。然而,如果系統(tǒng)已經(jīng)有了 PCRE,那么可以通過指定 --with-pcre=system 選項(xiàng)來使用它。另一種方法是指定 --with-pcre=auto 以鏈接到更新的系統(tǒng)庫或 Squirrel Shell 的副本。

構(gòu)建的結(jié)果是得到一個(gè)新的二進(jìn)制文件,名為 squirrelsh。假設(shè)此文件被安裝到 PATH 變量的某個(gè)目錄中,比如 /usr/local/bin,那么輸入 squirrelsh 以啟動(dòng)該 shell。在命令行提示符下,輸入命令 printl(getenv("HOME")); 以輸出主目錄的路徑:

$ squirrelsh > printl( getenv( "HOME" ) ); /home/strike > exit(); 

Squirrel Shell 基于 Squirrel 編程語言(參見 參考資料 獲得更多信息的鏈接)。該語言類似于 C++,并且提供了非常類似于 Python 和 Ruby 等面向?qū)ο竽_本語言的特性。Squirrel Shell 納入了 Squirrel 中的所有特性和數(shù)據(jù)類型,并添加了一些專門為常見 shell 腳本任務(wù)編寫的新功能,比如復(fù)制文件和讀取環(huán)境變量。

盡管 Squirrel Shell 的語法對(duì)于日常的命令行使用過于繁雜 —echo $HOME 是和 Squirrel Shell 的 printl( "~") 具有等效功能的 Bash 命令 — 但是它擁有出色的腳本。您只需要編寫一次,就可以到處運(yùn)行,而不需要針對(duì) Unix 和 Windows 分別編寫。正如 Dinosaur 這樣評(píng)價(jià)他的工作,“Squirrel Shell 主要是充當(dāng)一個(gè)腳本翻譯器。

使用 Squirrel 編寫腳本

讓我們看一看一個(gè) Squirrel Shell 腳本的示例。清單 2 展示了文件 listing2.nut,此腳本將遞歸地列出您的主目錄的內(nèi)容。

清單 2. listing2.nut

 #!/usr/bin/env squirrelsh  function reveal( filedir ) {  if ( !exist( filedir ) ) { return;  }   if ( filename( filedir ) == ".." || filename( filedir ) == "." ) { return;  }   if ( filetype( filedir ) == FILE ) { printl( filename( filedir, true ) ); return;  }  printl("Directory: " + filename( filedir, true) );  local names = readdir( filedir );  foreach( index, name in names ) { reveal( name );  } }  local previous = getcwd();  chdir( "~" );  reveal( getcwd() );  chdir( previous );  exit( 0 ); 

按照規(guī)定,每個(gè) shell 腳本的第一行將向操作系統(tǒng)表明要啟動(dòng)哪個(gè)程序來解釋腳本。通常,這一行會(huì)顯示 #! /usr/bin/bash 或 #! /bin/zsh 以從某個(gè)位置啟動(dòng)特定 shell 或解釋器。

#!/usr/bin/env squirrelsh 有一些不同。它啟動(dòng)了一個(gè)特殊的程序 env,此程序又啟動(dòng) PATH 變量中找到的第一個(gè) squirrelsh 實(shí)例。因此,可以修改 PATH 變量以支持某個(gè)程序的本地版本 — 即您自己的、修改后的 squirrelsh 副本,位于 $HOME/bin/squirrelsh — 而不要修改 shell 腳本的內(nèi)容。

注意:這個(gè)技巧適用于所有解釋器。例如,#!/usr/bin/env ruby 將按照 PATH 設(shè)置的指示,調(diào)用您喜歡的 Ruby 版本??傊?,如果計(jì)劃發(fā)布所編寫的任何 shell 腳本,在第一行中使用 #!/usr/bin/env application 表單,因?yàn)樗?“移植性 更強(qiáng):它將運(yùn)行用戶 在他/她的 PATH 變量中已經(jīng)配置好的應(yīng)用程序版本。

清單 2 的其余部分應(yīng)該比較熟悉,至少對(duì)于方法是這樣。函數(shù) reveal() 是遞歸的:

如果為 reveal() 傳遞一個(gè)無效的路徑或 “小圓點(diǎn)(.,當(dāng)前目錄)或 “兩個(gè)小圓點(diǎn)(..,父目錄),那么遞歸將結(jié)束。

否則,如果參數(shù) filedir 是一個(gè)文件,代碼將輸出其名稱并返回,并再一次停止進(jìn)一步的遞歸。函數(shù) filename() 可以接受一到兩個(gè)參數(shù)。如果只有一個(gè)參數(shù),或者第二個(gè)參數(shù)為 false,那么將忽略擴(kuò)展文件名。如果提供 true 作為第二個(gè)參數(shù),將返回完整的文件名。

如果參數(shù)是一個(gè)目錄,代碼將輸出其名稱,然后掃描內(nèi)容(不需要執(zhí)行深度優(yōu)先處理,因?yàn)槟夸泝?nèi)容并沒有按特定的順序排列。下一個(gè)示例將改進(jìn)輸出)。

需要注意一點(diǎn):由于對(duì) reveal() 的調(diào)用是同一個(gè)函數(shù)中的最后一條語句,Squirrel 虛擬機(jī)(VM)— 運(yùn)行腳本代碼的引擎 — 可以通過稱為尾遞歸(tail recursion)的技術(shù)將遞歸改為迭代。實(shí)際上,尾遞歸消除了對(duì)遞歸使用調(diào)用棧的需要;因此,可以實(shí)現(xiàn)任意深度的遞歸并且可以避免棧溢出。

Squirrel 的語法相當(dāng)簡單,因此使用這種語言編寫代碼非??旖?,特別是如果您曾經(jīng)使用過 C、C++ 或任何更高級(jí)的語言編寫過代碼的話,這一點(diǎn)則體現(xiàn)得更充分。

最妙的是,這個(gè) shell 代碼是可移植的。將它轉(zhuǎn)移到 Windows 機(jī)器上,在其上安裝 Squirrel Shell,然后就可以運(yùn)行您的代碼。

改進(jìn)表

與典型 shell 相比,Squirrel 的優(yōu)秀特性之一就是它豐富的數(shù)據(jù)結(jié)構(gòu)。如果數(shù)據(jù)可以進(jìn)行良好地組織,那么即使是復(fù)雜的問題通常也能夠快速得到解決。Squirrel 提供了真正的對(duì)象、異構(gòu)數(shù)組和關(guān)聯(lián)數(shù)組(在 Squirrel 中稱為 表)。

一個(gè) Squirrel 表由一些 slot 或 (鍵-值)對(duì)組成。除 Null 以外的任何值都可以充當(dāng)一個(gè)鍵;任何值都可以被分配給一個(gè) slot。您將使用 “箭頭 操作符創(chuàng)建一個(gè)新的 slot(<-)。

讓我們對(duì) 清單 2 的代碼稍加改進(jìn),在將目錄轉(zhuǎn)變?yōu)槿魏巫幽夸浿罢故舅膬?nèi)容。使用什么方法?使用一個(gè)本地表在單獨(dú)的 slot 中存放文件和子目錄,然后相應(yīng)地處理兩個(gè)類別。清單 3 展示了新的代碼。

清單 3. 增強(qiáng)后的清單 2 將首先輸出目錄的內(nèi)容,然后遞歸到子目錄

 #!/usr/bin/env squirrelsh  function reveal( filedir ) {  local tally = {};  tally[FILE] <- [];  tally[DIR] <- [];  if ( !exist( filedir ) ) { return;  }   if ( filename( filedir ) == ".." || filename( filedir ) == "." ) { return;  }   local names = readdir( filedir );  foreach( index, name in names ) { tally[ filetype( name ) ].append( name ) ;  }   foreach( index, file in tally[FILE] ) { printl( file );  }   foreach( index, dir in tally[DIR] ) { printl( filename( dir ) + "/" );  }  foreach( index, dir in tally[DIR] ) { reveal( dir );  }  }  local entrIEs = readdir( (__argc >= 2) ? __argv[1] : "." );  exit( 0 ); 

在這里非常適合使用表這種數(shù)據(jù)結(jié)構(gòu)。reveal() 中的表有兩個(gè) slot:一個(gè)用于文件,另一個(gè)用于目錄。filetype( name ) 函數(shù)的返回值 — 常量 FILE 或常量 DIR — 將文件系統(tǒng)中的每一項(xiàng)整理到相應(yīng)的 slot 中。

此外,每個(gè) slot 是一個(gè)數(shù)組,由 tally[FILE] <- [] 和 tally[DIR] <- []; 這兩條語句創(chuàng)建。([] 是一個(gè)空數(shù)組)。由于 tally 是函數(shù)內(nèi)的本地變量,它將在每次調(diào)用時(shí)重新創(chuàng)建并清空范圍,并且在每個(gè)調(diào)用被返回時(shí)自動(dòng)銷毀。

數(shù)組函數(shù) append( arg ) 將 arg 添加到數(shù)組的末尾,從而在此過程中形成了一個(gè)列表。在執(zhí)行完 foreach( index, name in names ) 循環(huán)后,所有項(xiàng)都被添加到這兩個(gè) slot 中其中一個(gè)的列表中。函數(shù)其余部分的代碼將輸出文件,接著輸出目錄,然后是遞歸。

當(dāng)然,如果沒有命令行參數(shù)的話,shell 腳本的價(jià)值就沒有那么大了。特殊 Squirrel Shell 變量 __argc 和 __argv 分別以字符串?dāng)?shù)組形式包含命令行參數(shù)的計(jì)數(shù)和參數(shù)列表。根據(jù)約定,__argv[0] 始終都作為 shell 腳本的名稱;因此,如果 __argc 的值至少為 2,那么將提供額外的參數(shù)。為了簡單起見,這個(gè)腳本只處理第一個(gè)額外參數(shù) argv[1]。

作為參考,清單 4 展示了一個(gè) Ruby 腳本(作者為 Mr. Makshin),此腳本的功能與清單 3 相同。即使該腳本已像 Ruby 那樣簡潔,但它在簡潔性方面仍然遜色于 Squirrel Shell 代碼。

清單 4. 使用 Ruby 重新實(shí)現(xiàn)清單 3

 !/usr/bin/ruby  # List Directory contents.  path = ARGV[0] == nil ? "." : ARGV[0].dup  # Remove trailing slashes while path =~ //$/  path.chop! end  entrIEs = Dir.open(path) for entry in entries  unless entry == "." || entry == ".." filePath= "#{path}/#{entry}" fileStat = File.stat(filePath) if fileStat.directory?  puts "dir : #{filePath}" elsif fileStat.file?  puts "file: #{filePath}" end  end end  entries.close() 

有關(guān) Squirrel 語言的更多信息,請(qǐng)參閱 Squirrel Programming Language Reference(參見 參考資料 獲得鏈接)。

巧妙的是,Squirrel Shell 中的幾乎所有函數(shù)都去掉了底層操作系統(tǒng)的細(xì)節(jié),因此您的代碼可以盡可能保持通用。例如,filename() 函數(shù)(在前兩個(gè)清單中使用)將引導(dǎo)路徑(leading path)從文件路徑名中分離 — 比如,將 /home/example/some/Directory/file.txt 簡化為 file.txt — 而不管您使用的是何種平臺(tái)。類似地,readdir() 和 filetype() 允許您不必了解真實(shí)的、底層操作和文件系統(tǒng)的圈套和陷阱。通常,普通的 shell 并不能提供這種抽象(較為高級(jí)的腳本語言則可以)。

其他有用的、獨(dú)立于平臺(tái)的功能包括 convpath() 和 run(),前者可以將路徑名轉(zhuǎn)換成本地路徑名格式,而后者可以調(diào)用另一個(gè)可執(zhí)行文件。convpath() 函數(shù)可以執(zhí)行雙向轉(zhuǎn)換,因此對(duì)于編寫跨平臺(tái)腳本非常有用。

正則表達(dá)式

Shell 腳本通常用于自動(dòng)化系統(tǒng)管理和維護(hù)工作。實(shí)現(xiàn)這種自動(dòng)化主要依靠正則表達(dá)式,它是用來查找、匹配和分解字符串的一組真正的象形文字。如前所述,Squirrel Shell 需要 PCRE 庫,這種庫在 Perl、PHP、Ruby 和其他許多解釋器和程序中都可找到。PCRE 是用于數(shù)據(jù)處理的重要武器。

盡管非常完整,Squirrel Shell 的正則表達(dá)式實(shí)現(xiàn)有一些不同,可能會(huì)令您想起 PHP 實(shí)現(xiàn)。要在 Squirrel Shell 中使用正則表達(dá)式,需要先定義正則表達(dá)式,對(duì)其進(jìn)行編譯,進(jìn)行比較,然后再迭代結(jié)果(如果有的話)。

清單 5 展示的示例程序演示了 Squirrel Shell 中的正則表達(dá)式(代碼由 Mr. Makshin 編寫并且得到使用許可)。

清單 5. 演示 Squirrel Shell 中的正則表達(dá)式

 #!/usr/bin/env squirrelsh  // Match a regular expression against text  print("Text: "); local text = scan();  print("Pattern: "); local pattern = scan();  local re = regcompile(pattern); if (!re) {  printl("Failed to compile regular expression - " + regerror());  exit(1); }  local matches = regmatch(re, text); if (!matches) {  printl("Failed to match regular expression - " + regerror());  regfree(re);  exit(1); }  regfree(re); printl("Matches found:"); foreach (match in matches)  printl("t"" + substr(text, match[0], match[1]) + """); 

在這里,scan() 從標(biāo)準(zhǔn)輸出中讀取一些文本和一個(gè)模式,但是并不包含通常用于確定正則表達(dá)式的起始和結(jié)束部分的前斜杠(/)字符。

對(duì)于一個(gè)模式,函數(shù) reqgcompile() 將編譯此模式,這將提高匹配的速度。您可以對(duì) reqgcompile() 函數(shù)使用一個(gè)標(biāo)記以啟用或禁用區(qū)分大小寫的功能(等同于 PCRE /i 修飾符),并且可以使用另一個(gè)選項(xiàng)針對(duì)一行或多行進(jìn)行匹配(等同于 PCRE /m 選項(xiàng))。如果沒有對(duì)正則表達(dá)式執(zhí)行編譯,那么所有匹配將失敗。

regmatch(re, text) 函數(shù)將比較正則表達(dá)式和文本,如果沒有匹配的話就生成 Null 值,否則生成一個(gè)由成對(duì)整數(shù)組成的數(shù)組(雙元素?cái)?shù)組)。每一對(duì)中的第一個(gè)整數(shù)表示匹配的開始;第二個(gè)整數(shù)表示匹配結(jié)束。這解釋了最后一行代碼中 substr(text, match[0], match[1]) 的使用。

執(zhí)行完比較后,可以迭代結(jié)果。如果在任何時(shí)候不再需要編譯后的正則表達(dá)式,則使用 regfree() 刪除它。還有一個(gè) regfreeall() 函數(shù)可以處理所有已編譯表達(dá)式所持有的所有資源。

Squirrel Shell 的限制

在理想情況下,相同的編程邏輯將應(yīng)用到 Unix、Linux 和 Windows 中,并且效率至少和以前一樣高,這樣程序員會(huì)更加高興。可惜操作系統(tǒng)各不相同,您經(jīng)常需要為了某個(gè)特定系統(tǒng)而求助于定制代碼。

在這些情況下,無論是 Squirrel Shell 還是您都無法脫離平臺(tái),Squirrel Shell 提供了一個(gè)方便的函數(shù)來探測操作系統(tǒng),這樣代碼就可以適當(dāng)?shù)膱?zhí)行。

清單 6 展示了如何使用 platform() 函數(shù)作出決策。該函數(shù)始終返回一個(gè)值,但是該值可能是 unknown。

清單 6. platform() 函數(shù)生成操作系統(tǒng)類型

 print( "Made by ... ");  local platform = platform();  switch ( platform ) {  case "linux": printl( "Linus." ); break;   case "Macintosh": printl( "Steve." ); break;   case "win32":  case "win64": printl( "Bill." ); break;   default: printl( "Unknown" ); } 

您可以通過 Squirrel Shell 環(huán)境變量 PLATFORM 查找當(dāng)前平臺(tái)的類型:

> printl( PLATFORM ); linux 

環(huán)境變量 CPU_ARCH 生成處理器,shell 將針對(duì)該處理器進(jìn)行編譯:

> printl( CPU_ARCH ); x86 

結(jié)束語

Squirrel Shell 的其他函數(shù)將管理文件、處理環(huán)境和執(zhí)行策略。實(shí)際上,它的三角學(xué)內(nèi)置函數(shù)就有 20 余種。Version 2.0 目前正在規(guī)劃之中,并且將包含更多類、對(duì) Unicode 的支持、改進(jìn)的交互模式,以及一個(gè)模塊化的插件架構(gòu)。

Squirrel Shell 并不算得上一種交互式 shell,但是這沒關(guān)系。在這方面已經(jīng)出現(xiàn)了很多選擇。作為一種腳本運(yùn)行程序,Squirrel Shell 要比其同類出色許多。其數(shù)據(jù)結(jié)構(gòu)要比傳統(tǒng) shell 更加強(qiáng)大,它的語法簡單易懂,其底層虛擬引擎支持從枚舉類型到線程等所有內(nèi)容。Squirrel 引擎也很小巧,不超過 6000 行代碼。您甚至可以將完整的 Squirrel 嵌入到另一個(gè)應(yīng)用程序中。

當(dāng)您需要為兩個(gè)平臺(tái)編寫代碼時(shí),請(qǐng)嘗試使用 Squirrel Shell!它使您能夠輕松編寫自己的代碼。

標(biāo)簽: Unix系統(tǒng)
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
a国产在线视频| 91av亚洲| 丝袜美腿亚洲色图| 国内精品99| 99re国产精品| 亚洲精品护士| 欧美中文一区| 一本一道久久a久久| 日本精品一区二区三区在线观看视频| 中文字幕日韩亚洲| 欧美有码在线| 国产不卡人人| 精品一区欧美| 免播放器亚洲| 久久黄色影视| 国产成年精品| 美女久久久久| 奇米亚洲欧美| 午夜av不卡| 综合干狼人综合首页| 国产乱码精品一区二区三区四区 | 精品国产第一福利网站| 久久国产日韩| 国产乱码精品| 99在线|亚洲一区二区| 国产剧情一区二区在线观看| 日韩国产欧美| 亚州国产精品| 精品日韩视频| 日韩黄色在线观看| 久久国产毛片| 日韩不卡一区二区| 中国字幕a在线看韩国电影| 欧美成人a交片免费看| 久久av网址| 亚洲免费福利一区| 日韩中文在线电影| 91精品一区| 免费精品国产的网站免费观看| 日韩激情网站| 国产激情精品一区二区三区| 美女久久一区| 亚洲综合三区| 在线视频亚洲欧美中文| 亚洲精品99| 在线成人动漫av| 成人自拍av| 亚洲少妇在线| 91精品国产乱码久久久久久久| 精品一区二区三区免费看| 国产丝袜一区| 日韩avvvv在线播放| 日本午夜精品视频在线观看| 日韩不卡一区二区三区 | 欧美日韩水蜜桃| 国产精品白丝一区二区三区| 亚洲一区日韩| 视频精品一区二区| 亚洲综合激情在线| 蜜臀a∨国产成人精品| 亚洲国产日韩欧美在线| 午夜久久黄色| 蜜臀国产一区二区三区在线播放| 视频精品一区二区| 久久激情五月激情| 欧美日韩国产观看视频| 黄色亚洲大片免费在线观看| 日韩av资源网| 日本不卡在线视频| 日韩av不卡一区二区| 日韩不卡一区二区| 麻豆91在线播放| 国产精品黑丝在线播放| 国产在线观看www| 99精品视频在线| 激情欧美丁香| 中文字幕一区二区三区在线视频| 日韩精品视频网站| 老色鬼精品视频在线观看播放| 精品国产乱码久久久久久樱花| 国产成人精品一区二区免费看京| 久久精品一区二区不卡| 亚洲免费网址| 国产激情精品一区二区三区| 日韩专区精品| 国精品一区二区| 亚洲精品人人| 丝袜美腿诱惑一区二区三区| 亚洲丝袜美腿一区| 久久精品国产网站| 久久精品播放| 日本aⅴ亚洲精品中文乱码 | 久久一区精品| 伊人久久大香线蕉av不卡| 中文字幕日韩高清在线| 精品三级国产| 国产视频亚洲| av中文资源在线资源免费观看| 免费一级片91| 日韩大片在线观看| 日本强好片久久久久久aaa| 日韩精品一区二区三区免费观影 | 精品一区毛片| 久久亚洲精品中文字幕| 午夜宅男久久久| 国产色播av在线| 国产劲爆久久| 亚洲午夜国产成人| 亚洲午夜久久久久久尤物| 欧美 日韩 国产一区二区在线视频 | 精品91久久久久| 精品一区二区三区的国产在线观看| 久久性天堂网| 欧美高清不卡| 九九色在线视频| 精品99在线| 麻豆精品蜜桃视频网站| 日韩欧美美女在线观看| 免费观看久久久4p| 在线视频日韩| 99国产一区| 欧美日韩日本国产亚洲在线 | 国产精品国产三级在线观看| 美女日韩在线中文字幕| 免费av一区二区三区四区| 久久久久99| 久久精品影视| 欧美精品激情| 中文日韩在线| 亚洲精品在线观看91| 欧美性感美女一区二区| av高清一区| 国产综合精品| 欧美成人综合| 中文字幕中文字幕精品| 天堂成人免费av电影一区| 日韩精品一区第一页| 亚洲专区视频| 久久不见久久见中文字幕免费| 嫩呦国产一区二区三区av| 成人在线视频免费| 不卡视频在线| 亚洲精品护士| 国产极品模特精品一二| 成人精品国产亚洲| 99精品综合| 爽好久久久欧美精品| 欧美亚洲一级| 蜜臀国产一区| 中文字幕日韩亚洲| 日韩av资源网| av高清不卡| 日韩视频一区| 欧美日韩精品一区二区三区视频 | 日韩美女国产精品| 日韩欧美中文在线观看| 国产精品久久久久久久久久白浆 | 国产精品一区二区三区av麻| 免费在线欧美黄色| 欧美成人综合| 欧美在线黄色| 亚洲小说欧美另类婷婷| 91亚洲无吗| 亚洲欧美日韩高清在线| 亚洲精品午夜av福利久久蜜桃| 国产成人免费av一区二区午夜| 欧美午夜精品一区二区三区电影| 亚洲欧美日韩高清在线| 国产精品成人3p一区二区三区| 国产伊人精品| 精品入口麻豆88视频| 亚洲一区欧美| 日韩欧美字幕| 国产精品久久免费视频| 国产视频一区在线观看一区免费| 免费在线观看一区| 亚洲精品在线国产| 亚洲午夜一级| 日韩电影免费网站| 国产日韩欧美一区二区三区| 久久高清精品| 九九精品调教| 久久69成人| 国产剧情一区二区在线观看| 亚洲精品伊人| 在线观看一区| 在线亚洲精品| 欧美日韩一区自拍| 久久精品资源| 亚洲ab电影| 樱桃成人精品视频在线播放| 亚洲国产福利| 国产精品久久久久久av公交车 | 欧美黑人巨大videos精品| 综合一区在线| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美在线资源| 国产精品嫩草99av在线| 91成人超碰| 亚洲一区欧美二区|