婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 一篇教會你寫90%的shell腳本(入門小結)

一篇教會你寫90%的shell腳本(入門小結)

熱門標簽:地圖標注審核周期 沈陽ai電銷智能機器人 如何申請400的電話呀 合肥電銷外呼系統供應商 AI智能電銷機器人壞處 電話機器人對家居行業幫助大嗎 電商外呼系統排名 蘭州電銷機器人加盟 黑暗之魂3地圖標注

shell腳本?

在說什么是shell腳本之前,先說說什么是shell。

shell是外殼的意思,就是操作系統的外殼。我們可以通過shell命令來操作和控制操作系統,比如Linux中的Shell命令就包括ls、cd、pwd等等。總結來說,Shell是一個命令解釋器,它通過接受用戶輸入的Shell命令來啟動、暫停、停止程序的運行或對計算機進行控制。

shell 是一個應用程序,它連接了用戶和 Linux 內核,讓用戶能夠更加高效、安全、低成本地使用 Linux 內核,這就是 Shell 的本質。

shell 本身并不是內核的一部分,它只是站在內核的基礎上編寫的一個應用程序。

那么什么是shell腳本呢?

shell腳本就是由Shell命令組成的執行文件,將一些命令整合到一個文件中,進行處理業務邏輯,腳本不用編譯即可運行。它通過解釋器解釋運行,所以速度相對來說比較慢。

shell腳本中最重要的就是對shell命令的使用與組合,再使用shell腳本支持的一些語言特性,完成想要的功能。

 注釋

“# ”開頭的就是注釋,被編譯器忽略

  • 單行注釋: #
  • 多行注釋: :EOF … EOF 或者 :! … ! (: 標識多行注釋開始,并指定一個標識符作為開始結束的標志)

變量

變量類型

運行shell時,會同時存在三種變量:

  • 局部變量:局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量。
  • 環境變量:所有的程序,包括shell啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量。
  • shell變量:shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行

變量操作

  • 創建普通變量: name=“test” (=兩邊不可有空格)
  • 創建只可函數體中使用的局部變量: local name=“test” (使用local修飾的變量在函數體外無法訪問,并且local只能在函數體內使用)
  • 使用變量: echo $name 或者 echo ${name} (推薦使用大括號版)
  • 變量重新賦值: name=“new_test” (將原值覆蓋)
  • 只讀變量: name=“only_read” -> readonly name (使用readonly標識后的變量,不可被修改)
  • 刪除變量: unset name; (刪除之后不可訪問,刪除不掉只讀變量)

字符串變量

1)單引號

  • 單引號變量var='test' ,只能原樣輸出,變量無效
  • 單引號中不能出現一個單獨的單引號,轉義也不可以

2)雙引號

  • 雙引號變量var="my name is ${name}",變量有效
  • 可出現轉義符

3)拼接字符串

  • 中間無任何+,之類的字符
  • name=“this is”" my name"; name=“this is my name”; name=“this” is “my name” 等效
  • name=‘this is'' my nam'; name=‘this is my name'; name=‘this' is ‘my name' 等效

4)獲取字符串長度

  • 在${}中使用“#”獲取長度
  • name=“test”;
  • echo ${#name}; # 輸出為4

5)提取子字符串

  • 1:4 從第2個開始 往后截取4個字符
  • ::4 從第一個字符開始 往后截取4個字符
  • name=“this is my name”;
  • echo ${name:1:4} #輸出 is i
  • echo ${name::4} #輸出 this

數組

bash只支持一維數組,不支持多維數組

  • 定義數組:array_name=(li wang xiang zhang) (小括號做邊界、使用空格分離)
  • 單獨定義數組的元素: array_para[0]=“w”; array_para[3]=“s” (定義時下標不連續也可以)
  • 賦值數組元素:array_name[0]=“zhao”;
  • 獲取數組元素:
    • array_name[0]=“li”
    • array_name[3]=“zhang”
    • echo ${array_name[0]} # 輸出"li"
    • echo ${array_name[1]} # 輸出" "
    • echo ${array_name[3]} # 輸出"zhang"
    • echo ${array_name[@]} # 輸出"li zhang" 輸出數組所有元素,沒有元素的下標省略
  • 取得元素個數:${#array_name[@]} 或者 ${#array_name[*]}
  • 取得單個元素長度:${#array_name[1]}

參數傳遞

  • 獲取參數值:
    • $0 : 固定,代表執行的文件名
    • $1 : 代表傳入的第1個參數
    • $n : 代表傳入的第n個參數
  • $#:參數個數
  • $*: 以一個單字符串顯示所有向腳本傳遞的參數。如"$*“用「”」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數
  • $@:與$*相同,但是使用時加引號,并在引號中返回每個參數。
  • $$:腳本運行的當前進程號
  • $!:后臺運行的最后一個進程的ID
  • $?: 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。
  • $* 與 $@ 區別
    • 相同點:都是引用所有參數。
    • 不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價于 “1 2 3”(傳遞了一個參數),而 “@” 等價于 “1” “2” “3”(傳遞了三個參數)。

運算符

算數運算

  • + 、-、*、\ : 乘號前必須加\進行轉義才可以進行乘法運算
  • 加法運算
    • val=`expr 2 + 2` (使用linux命令expr進行輔助運算)
    • val=$[2+2] (4個空格不是必要的,不同于條件判斷)
    • val=$((2+2))

數字關系運算符

關系運算符只支持數字,不支持字符串,除非字符串的值是數字。

下面假定變量 a 為 10,變量 b 為 20

  • -eq :檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
  • -ne: 檢測兩個數是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
  • -gt: 檢測左邊的數是否大于右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
  • -lt : 檢測左邊的數是否小于右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
  • -ge: 檢測左邊的數是否大于等于右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
  • -le : 檢測左邊的數是否小于等于右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。

字符串運算符

下表列出了常用的字符串運算符,假定變量 a 為 “abc”,變量 b 為 “efg”:

  • = :檢測兩個字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
  • != :檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
  • -z :檢測字符串長度是否為0,為0返回 true。 [ -z $a ] 返回 false。
  • -n :檢測字符串長度是否為0,不為0返回 true。 [ -n “$a” ] 返回 true。
  • $ :檢測字符串是否為空,不為空返回 true。 [ $a ] 返回 true。

布爾運算符

下表列出了常用的布爾運算符,假定變量 a 為 10,變量 b 為 20:

  • ! :非運算,表達式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
  • -o :或運算,有一個表達式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
  • -a :與運算,兩個表達式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

邏輯運算符

以下介紹 Shell 的邏輯運算符,假定變量 a 為 10,變量 b 為 20:

  • :邏輯的 AND [[ $a -lt 100 $b -gt 100 ]] 返回 false
  • || :邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

文件運算符

  • -b file :檢測文件是否是塊設備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
  • -c file :檢測文件是否是字符設備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
  • -d file :檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
  • -f file :檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
  • -g file :檢測文件是否設置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
  • -k file :檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
  • -p file :檢測文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
  • -u file :檢測文件是否設置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
  • -r file :檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
  • -w file :檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
  • -x file :檢測文件是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
  • -s file :檢測文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。
  • -e file :檢測文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。

執行相關

命令替換

命令替換與變量替換差不多,都是用來重組命令行的,先完成引號里的命令行,然后將其結果替換出來,再重組成新的命令行。
執行命令:

  • `ls /etc` : 反引號 (所有的unix系統都支持)
  • $(ls /etc) : $+() (部分unix系統不支持)

多個嵌套使用時,從內向外執行

for file in \s /etc\ 或 for file in $(ls /etc) 循環中使用
`dirname $0` 獲取腳本文件所在的目錄
path=$(cd `dirname $0`;pwd) : 獲取腳本當前所在目錄,并且執行cd命令到達該目錄,使用pwd獲取路徑并賦值到path變量

算術運算

  • $[ ] : 加減乘除,不必添加空格
  • $(( )) :加減乘除等,不必添加空格

邏輯判斷

  • [ ] : 中括號旁邊和運算符兩邊必須添加空格 (可以使用,不推薦)
  • [[ ]]:中括號旁邊和運算符兩邊必須添加空格 (字符串驗證時,推薦使用)
  • (()) : 中括號旁邊和運算符兩邊必須添加空格 (數字驗證時,推薦使用)
  • [[]] 和 (()) 分別是[ ]的針對數學比較表達式和字符串表達式的加強版。
  • 使用[[ … ]]條件判斷結構,而不是[ … ],能夠防止腳本中的許多邏輯錯誤。比如,、||、和> 操作符能夠正常存在于[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。比如可以直接使用if [[ $a != 1 $a != 2 ]], 如果不適用雙括號, 則為if [ $a -ne 1] [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

[[ ]]中增加模式匹配特效;
(( ))不需要再將表達式里面的大小于符號轉義,除了可以使用標準的數學運算符外,還增加了以下符號

輸出

echo

僅用于字符串的輸出,沒有使用printf作為輸出的移植性好,建議使用printf

printf

printf 不會像 echo 自動添加換行符,我們可以手動添加 \n
無大括號,直接以空格分隔

格式:printf format-string [arguments...] 其中(format-string: 格式控制字符串、arguments: 參數列表)

案例:printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

%s %c %d %f 都是格式替代符

  • d:Decimal 十進制整數 對應位置參數必須是十進制整數,否則報錯!
  • s:String 字符串 對應位置參數必須是字符串或者字符型 否則報錯
  • c:Char 字符 對應位置參數必須是字符串或者字符型 否則報錯
  • f:Float 浮點 對應位置參數必須是數字型 否則報錯

%-10s : 指一個寬度為10個字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。

%-4.2f :指格式化為小數,寬度為4個字符,其中.2指保留2位小數。

轉義符:

  • \a :警告字符,通常為ASCII的BEL字符
  • \b :后退
  • \c :抑制(不顯示)輸出結果中任何結尾的換行字符(只在%b格式指示符控制下的參數字符串中有效),而且,任何留在參數里的字符、任何接下來的參數以及任何留在格式字符串中的字符,都被忽略
  • \f :換頁(formfeed)
  • \n :換行
  • \r :回車(Carriage return)
  • \t :水平制表符
  • \v :垂直制表符
  • \ :一個字面上的反斜杠字符
  • \ddd :表示1到3位數八進制值的字符。僅在格式字符串中有效
  • \0ddd :表示1到3位的八進制值字符

流程控制

和Java、PHP等語言不一樣,sh的流程控制不可為空,即if或者else的大括號中無任何語句

if else

if
if condition
then
 command1 
 command2
 ...
 commandN 
fi

if else

if condition
then
 command1 
 command2
 ...
 commandN
else
 command
fi

if else-if else

if condition1
then
 command1
elif condition2 
then 
 command2
else
 commandN
fi

for

for var in item1 item2 ... itemN
do
 command1
 command2
 ...
 commandN
done

while

while condition

while condition
do
 command
done

while 無限循環

while :
do
 command
done

until

until 循環執行一系列命令直至條件為 true 時停止。
until 循環與 while 循環在處理方式上剛好相反。

until condition
do
 command
done

case

Shell case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。
case需要一個esac(就是case反過來)作為結束標記,每個case分支用右圓括號,用兩個分號表示break,其中“;;”不是跳出循環,是不在去匹配下面的模式
case語句格式如下:

case 值 in
 模式1)
 command1
 command2
 ...
 commandN
 ;;
 模式2)
 command1
 command2
 ...
 commandN
 ;;
esac

跳出循環

  • break :跳出總循環
  • continue:跳出當前循環,繼續下一次循環

定義函數

可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。

函數定義

[ function ] funname()
{
 action;
 [return int;]
}

參數傳遞

  • 調用函數: fun_name 2 3 4
  • 函數中使用:和shell取用函數相同 $n $# $* $? 或者加上{}
funWithParam(){
 echo "第一個參數為 $1 !"
 echo "第二個參數為 $2 !"
 echo "第十個參數為 $10 !"
 echo "第十個參數為 ${10} !"
 echo "第十一個參數為 ${11} !"
 echo "參數總數有 $# 個!"
 echo "作為一個字符串輸出所有參數 $* !"}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
echo $? \# 判斷執行是否成功

函數返回值

  • return字樣可存在也可不存在
  • return 只能為 return [0-255],此處的返回可作為函數執行的狀態,通過$?獲取的便是這個返回值
  • 如果不加return , 則默認最后一條語句的執行狀態所為函數執行狀態的返回值,如果最后一條語句執行成功,則$?為0,否則不為0

使用函數返回值(Janusgraph圖數據庫官方啟動服務腳本片段)

  • return返回的數字,只是作為函數執行狀態的返回值,也就是接下來$?獲取的值
  • 對于類似于下面的BIN=\abs_path``語句,獲取的是函數體內所有的echo、printf輸出組合成的一個字符串
abs_path() {
 SOURCE="${BASH_SOURCE[0]}"
 while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )"  pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]]  SOURCE="$DIR/$SOURCE"
 done
 echo "test" 
 echo "$( cd -P "$( dirname "$SOURCE" )"  pwd )" 
 # 此函數的兩個echo輸出會組合成一個字符串作為下述BIN的值
}

 
BIN=`abs_path` # BIN賦值函數返回值,如果沒有return,則函數中所有的echo、printf輸出組合成一個字符串傳入BIN
path=${BIN}/nodetool # 可直接使用

輸入輸出重定向

一般情況下,每個 Unix/Linux 命令運行時都會打開三個文件:

  • 標準輸入文件(stdin):stdin的文件描述符為0,Unix程序默認從stdin讀取數據。
  • 標準輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認向stdout輸出數據。
  • 標準錯誤文件(stderr):stderr的文件描述符為2,Unix程序會向stderr流中寫入錯誤信息。

默認情況下,command > file 將 stdout 重定向到 file,command file 將stdin 重定向到 file。
如果希望執行某個命令,但又不希望在屏幕上顯示輸出結果,那么可以將輸出重定向到 /dev/null:

輸入重定向

  • bash.sh file : 將腳本的輸入重定向到file,由file提供參數

輸出重定向

  • bash.sh > file : 將腳本的輸出數據重定向到file中,覆蓋數據
  • bash.sh >> file : 將腳本的輸出數據重定向到file中,追加數據
  • command >> file 2>1 : 將 stdout 和 stderr 合并后重定向到 file

讀取外部輸入

命令:read arg (腳本讀取外部輸入并賦值到變量上)
在shell腳本執行到上述命令時,停止腳本執行并等待外部輸入,將外部輸入賦值到arg變量上,繼續執行腳本

文件引用

引用其他的文件之后,可以使用其變量、函數等等,相當于將引用的文件包含進了當前文件

兩種方式:

  • . file_path\file_name
  • source file_path\file_name

顏色標識

printf "\033[32m SUCCESS: yay \033[0m\n";
printf "\033[33m WARNING: hmm \033[0m\n";
printf "\033[31m ERROR: fubar \033[0m\n";

輸出結果:

長句換行

在shell中為避免一個語句過長,可以使用“\”進行換行
使用“\”換行,在腳本執行過程中還是當做一行一個語句執行,不同于enter直接換行

注意:\ 前添加一個空格 。 \ 后無空格直接換行。

 /mysql/bin/mysql \

 -h test_host -P 000 \

 -u test_user -ptest_password ;

shell操作mysql

下面案例為登錄mysql,并選擇操作數據庫,之后進行導入數據

 /mysql/mysql/bin/mysql \

 -h test_host -P 000 \

 -u test_user -ptest_password \

 -e"use test_database; source data_faile; " # -e 代表執行sql語句

-u 用戶名
-p 用戶密碼
-h 服務器ip地址
-D 連接的數據庫
-N 不輸出列信息
-B 使用tab鍵 代替 分隔符
-e 執行的SQL語句

退出腳本

命令:exit

在退出腳本時使用不同的錯誤碼,這樣可以根據錯誤碼來判斷發生了什么錯誤。

在絕大多數 shell 腳本中,exit 0 表示執行成功,exit 1 表示發生錯誤。
對錯誤與錯誤碼進行一對一的映射,這樣有助于腳本調試。

命令:set -e 或者 set +e

set -e表示從當前位置開始,如果出現任何錯誤都將觸發exit。相反,set +e表示不管出現任何錯誤繼續執行腳本。

如果腳本是有狀態的(每個后續步驟都依賴前一個步驟),那么請使用set -e,在腳本出現錯誤時立即退出腳本。
如果要求所有命令都要執行完(很少會這樣),那么就使用set +e。

shell腳本調試

檢查是否有語法錯誤-n:

bash -n script_name.sh

使用下面的命令來執行并調試 Shell 腳本-x:

bash -x script_name.sh

調試count_odd_number.sh 程序案例:

#!/usr/bin.env bash

# 用于計算數組中奇數的和
# @author liyangyang
# @time 2019/09/17

sum=0
for num in 1 2 3 4;do
 re=${num}%2
 if (( ${re} == 1 ));then
  sum=$[${sum}+${num}]
 fi
done
echo ${sum}

首先檢查有無語法錯誤:

bash -n count_odd_number.sh

沒有輸出,說明沒有錯誤,開始實際調試:

bash -x count_odd_number.sh

調試結果如下:

+ sum=0
+ for num in 1 2 3 4
+ re=1%2
+ (( 1%2 == 1 ))
+ sum=1
+ for num in 1 2 3 4
+ re=2%2
+ (( 2%2 == 1 ))
+ for num in 1 2 3 4
+ re=3%2
+ (( 3%2 == 1 ))
+ sum=4
+ for num in 1 2 3 4
+ re=4%2
+ (( 4%2 == 1 ))
+ echo 4
4

其中的輸出顯示了程序執行的每一步,通過觀察程序執行的步驟是否滿足預期從而達到調試的效果
帶有 + 表示的是 Shell 調試器的輸出,不帶 + 表示程序的輸出。

案例:

這是es(ElasticSearch)官方啟動服務的腳本,看可不可以理解吧~

#!/usr/bin/env bash

# CONTROLLING STARTUP:
#
# This script relies on a few environment variables to determine startup
# behavior, those variables are:
#
# ES_PATH_CONF -- Path to config directory
# ES_JAVA_OPTS -- External Java Opts on top of the defaults set
#
# Optionally, exact memory values can be set using the `ES_JAVA_OPTS`. Note that
# the Xms and Xmx lines in the JVM options file must be commented out. Example
# values are "512m", and "10g".
#
# ES_JAVA_OPTS="-Xms8g -Xmx8g" ./bin/elasticsearch

source "`dirname "$0"`"/elasticsearch-env

parse_jvm_options() {
 if [ -f "$1" ]; then
 echo "`grep "^-" "$1" | tr '\n' ' '`"
 fi
}

ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options

ES_JAVA_OPTS="`parse_jvm_options "$ES_JVM_OPTIONS"` $ES_JAVA_OPTS"

# manual parsing to find out, if process should be detached
if ! echo $* | grep -E '(^-d |-d$| -d |--daemonize$|--daemonize )' > /dev/null; then
 exec \

 "$JAVA" \

 $ES_JAVA_OPTS \

 -Des.path.home="$ES_HOME" \

 -Des.path.conf="$ES_PATH_CONF" \

 -cp "$ES_CLASSPATH" \

 org.elasticsearch.bootstrap.Elasticsearch \

 "$@"
else
 exec \

 "$JAVA" \

 $ES_JAVA_OPTS \

 -Des.path.home="$ES_HOME" \

 -Des.path.conf="$ES_PATH_CONF" \

 -cp "$ES_CLASSPATH" \

 org.elasticsearch.bootstrap.Elasticsearch \

 "$@" \

 - 
 retval=$?
 pid=$!
 [ $retval -eq 0 ] || exit $retval
 if [ ! -z "$ES_STARTUP_SLEEP_TIME" ]; then
 sleep $ES_STARTUP_SLEEP_TIME
 fi
 if ! ps -p $pid > /dev/null ; then
 exit 1
 fi
 exit 0
fi

exit $?

到此這篇關于一篇教會你寫90%的shell腳本(入門小結)的文章就介紹到這了,更多相關shell腳本入門內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • linux shell(.sh)腳本編寫和運行入門
  • Shell腳本編程30分鐘入門(小結)
  • 分享一個入門級可控多線程shell腳本代碼
  • Linux Shell 腳本編程入門教程
  • Linux Shell腳本系列教程(一):Shell入門
  • linux Shell入門:掌握Linux,OS X,Unix的Shell環境
  • 3000字掃盲shell基礎知識(新手必備)

標簽:常州 河池 黔南 淮南 隴南 河北 通遼 黔南

巨人網絡通訊聲明:本文標題《一篇教會你寫90%的shell腳本(入門小結)》,本文關鍵詞  一篇,教會,你寫,90%,的,shell,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一篇教會你寫90%的shell腳本(入門小結)》相關的同類信息!
  • 本頁收集關于一篇教會你寫90%的shell腳本(入門小結)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩成人在线一区| 在线视频一区二区免费| 欧美性大战xxxxx久久久| 蜜臀久久99精品久久久久久9| 久久精品视频在线免费观看| 欧美成人高清电影在线| 欧美日韩情趣电影| jizz一区二区| 91精品国产综合久久蜜臀| 日本韩国一区二区三区视频| 成人污视频在线观看| 国产原创一区二区三区| 成人精品免费视频| 福利电影一区二区| 激情综合五月婷婷| 91香蕉视频mp4| 欧美片在线播放| 国产精品久久影院| 国产精品日韩成人| 亚洲国产精品一区二区尤物区| 日韩—二三区免费观看av| 国产精品亚洲一区二区三区在线 | 精品久久久久久久人人人人传媒| 国产精品久久久久久久久快鸭| 亚洲国产精品一区二区尤物区| 美女脱光内衣内裤视频久久网站| 国产麻豆一精品一av一免费 | 国产午夜精品美女毛片视频| 亚洲欧洲精品一区二区三区| 午夜精品久久久久久久蜜桃app| 成人看片黄a免费看在线| 69堂成人精品免费视频| 亚洲精品成人天堂一二三| 色综合久久久久网| 欧美成人激情免费网| 亚洲国产人成综合网站| 一区二区欧美国产| 欧美美女激情18p| 亚洲天堂免费看| 国产精品12区| 欧美精品免费视频| 一区二区三区中文在线| 精品一区二区三区不卡| 欧美亚洲图片小说| 久久嫩草精品久久久精品一| 精品一区二区久久| 精品粉嫩超白一线天av| 成人精品免费看| 亚洲另类在线视频| 在线国产电影不卡| 日韩黄色免费网站| 91精品国产综合久久精品性色 | 91香蕉视频黄| 亚洲欧美二区三区| 色美美综合视频| 一区二区在线观看av| 欧美综合亚洲图片综合区| 日韩精品1区2区3区| 精品国产乱子伦一区| 另类小说一区二区三区| 91精品综合久久久久久| 成人午夜电影小说| 精品电影一区二区| 国产精品一卡二卡| 国产精品视频线看| 色美美综合视频| 久草这里只有精品视频| 一区二区在线观看av| 日韩视频一区二区三区在线播放 | 日韩精品三区四区| 欧美精品一区二区久久婷婷| 精品国产91洋老外米糕| 国产精品 日产精品 欧美精品| 久久久久一区二区三区四区| 成人免费看视频| 国产成人综合精品三级| 亚洲一区欧美一区| 国产精品无码永久免费888| 欧美日韩国产首页| 99久久精品99国产精品| 丁香婷婷深情五月亚洲| 亚洲欧美日韩久久精品| 日韩激情视频网站| 亚洲自拍都市欧美小说| 69成人精品免费视频| 91久久免费观看| 黄色小说综合网站| 日韩和欧美一区二区三区| 久久老女人爱爱| 日韩美女一区二区三区| 欧美影院一区二区三区| 国产精品一区不卡| 一区精品在线播放| 成人av资源在线| 久久99精品一区二区三区三区| 精品一区二区日韩| 精品一二三四区| 免费的国产精品| 精品亚洲aⅴ乱码一区二区三区| 日韩电影免费在线观看网站| 日韩在线一区二区| 国内精品伊人久久久久av影院| 狠狠狠色丁香婷婷综合久久五月| 亚洲国产日韩一区二区| 国产精品三级电影| 亚洲男人的天堂在线aⅴ视频| 亚洲精品一区二区精华| 久久久久国产精品厨房| 在线播放一区二区三区| 欧美视频在线一区二区三区 | 色偷偷久久一区二区三区| 不卡大黄网站免费看| 99久久精品久久久久久清纯| 亚洲综合色区另类av| 亚洲国产成人午夜在线一区| 中文字幕一区免费在线观看| 亚洲婷婷综合色高清在线| 国产精品久久午夜| 另类小说图片综合网| 一本久道久久综合中文字幕| 欧美日韩免费一区二区三区| 日韩免费看的电影| 亚洲福利视频三区| 国产在线播精品第三| 狠狠色丁香久久婷婷综合_中 | 国产成人亚洲综合a∨婷婷图片| 99九九99九九九视频精品| 久久久久久久一区| 亚洲第一电影网| 亚洲成av人片在线| 欧美系列在线观看| 久久久99久久| 国产成人一区二区精品非洲| 欧美乱妇一区二区三区不卡视频 | 精品国产精品网麻豆系列| 久久精品亚洲精品国产欧美kt∨| 亚洲bdsm女犯bdsm网站| 99国产一区二区三精品乱码| 在线欧美日韩国产| 中文字幕乱码一区二区免费| 欧美成人官网二区| 麻豆精品视频在线观看| 欧美日韩精品三区| 久久成人久久爱| 日韩欧美成人一区二区| 国产91丝袜在线播放| 日韩欧美在线123| 国产自产2019最新不卡| 91麻豆精品国产自产在线观看一区 | 亚洲国产成人午夜在线一区| 不卡视频免费播放| 丝袜脚交一区二区| 日本一区二区免费在线观看视频| 欧美在线制服丝袜| 男女视频一区二区| 国产精品久久久久久亚洲毛片| 99久久99久久免费精品蜜臀| 亚洲激情在线激情| 欧美久久高跟鞋激| av中文字幕一区| 国产精品乡下勾搭老头1| 亚洲综合色婷婷| 欧美极品美女视频| 精品视频一区二区不卡| 国产一二三精品| 美腿丝袜一区二区三区| 久久久不卡影院| 精品久久久久av影院| 在线亚洲高清视频| 国产毛片精品视频| 国产 欧美在线| 91在线云播放| 欧美日韩精品欧美日韩精品| 欧美日韩一区高清| 在线不卡a资源高清| 91精品欧美福利在线观看| 精品日韩在线观看| 中文字幕一区二区三区不卡| 中文字幕一区二区三| 一区二区成人在线视频| 久久精品国产一区二区三区免费看 | 国产欧美一区二区精品忘忧草| 精品久久久三级丝袜| 亚洲国产精品精华液2区45| 国产欧美视频在线观看| 国产揄拍国内精品对白| 国产馆精品极品| 不卡影院免费观看| 91在线小视频| 久久久91精品国产一区二区三区| 中文字幕一区二区三区四区不卡| 亚洲综合色噜噜狠狠| 一区二区三区成人| 亚洲另类在线一区| 午夜精品成人在线视频| 久久国产精品99久久久久久老狼 | 国产精品看片你懂得| 欧美精品一级二级三级| www.亚洲在线| 亚洲欧美一区二区三区国产精品 |