bash 字符串處理


歡迎關(guān)注微信公眾號(hào)生信寶典:https://mp.weixin.qq.com/s/lWNp_6W_jLiogmtlk9nO2A
本篇是我最開始學(xué)習(xí)Linux命令時(shí)看的一篇帖子吧彪,最早見于ChinaUnix (這次查找其出處時(shí)發(fā)現(xiàn)2002年就有這篇)思劳。學(xué)習(xí)過程中熊杨,轉(zhuǎn)載到我的博客,遇到問題就查一下冠桃。這次看到蛾扇,把格式整理了,部分內(nèi)容做了校對(duì)舶赔,增加了解釋和示例,分享于此谦秧,也是對(duì)之前16Linux入門和生物信息常用Linux命令文章 (包括最基礎(chǔ)操作竟纳、環(huán)境變量、可執(zhí)行屬性油够,命令行運(yùn)行監(jiān)測(cè)蚁袭、常見錯(cuò)誤、快捷操作石咬、管道、標(biāo)準(zhǔn)輸入輸出卖哎、軟件安裝鬼悠、Docker、Conda亏娜、定期備份焕窝、配置信息查詢、awk维贺、sed它掂、vim)的補(bǔ)充。

Bash特殊字符

  1. 通配符:

*: 匹配任何字符

**: 匹配任何字符串

*?: 匹配任何單個(gè)字符

  1. 集合運(yùn)算符

用一些單個(gè)字溯泣、一個(gè)連續(xù)范圍或斷續(xù)的字符集合作為通配符

[a-z]: 用字符集合作通配符匹配單個(gè)字符, 如: [aeiou], [a-o], [A-Z], [0-9]

[!A-Za-z0-9]: 除了集合外的所有字符組成的集合作通配符

  1. 花括號(hào)展開式(可以嵌套):

c{a{r,t,n}, b{r,t,n}}s 可以匹配cars cats cans cbrs cbts cbns

  1. 其它特殊字符:

(): 子shell運(yùn)行虐秋;比如 (cd ehbio; mdkir ysx)進(jìn)入ehbio目錄,新建ysx文件夾垃沦,運(yùn)行完之后還在當(dāng)前目錄客给。

': 強(qiáng)引用字符串, 不解釋特殊字符

": 弱引用字符串, 解釋所有特殊字符

;: 命令分隔符(命令終止符), 運(yùn)行在一行里執(zhí)行多條命令;一般在終端直接寫判斷語(yǔ)句或執(zhí)行for循環(huán)時(shí)用。

#: 行注釋
$: 變量表達(dá)式肢簿,變量解析
&: 在后臺(tái)執(zhí)行命令靶剑,在for循環(huán)中也可用作命令分割符,取代done前面的;

Bash變量

  1. 自定義變量

用戶自定義的變量由字母池充、數(shù)字和下劃線組成, 并且變量名的第一個(gè)字符不能為數(shù)字, 且變量名大小寫敏感桩引。

varname=value 注意bash不能在等號(hào)兩側(cè)留空格

shell語(yǔ)言是非類型的解釋型語(yǔ)言, 給一個(gè)變量賦值實(shí)際上就是定義了變量, 而且可以賦不同類型的值。引用變量有兩種方式, $varname和${varname}, 為防止變量在字符串中產(chǎn)生歧義建議使用第二種方式, 引用未定義的變量其值為空收夸。

ct@ehbio:~$ a="EHBIO"
ct@ehbio:~$ echo ${a}
EHBIO
ct@ehbio:~$ echo $a
EHBIO

#出錯(cuò)了
ct@ehbio:~$ echo $agood

#引用變量時(shí)大括號(hào)的作用
ct@ehbio:~$ echo ${a}good
EHBIOgood
ct@ehbio:~$ echo $a.good
EHBIO.good

#出錯(cuò)了
ct@ehbio:~$ echo $a_good

#引用變量時(shí)大括號(hào)的作用
ct@ehbio:~$ echo ${a}_good
EHBIO_good

為了使變量可以在其它進(jìn)程中使用, 需要將變量導(dǎo)出: export varname

  1. 環(huán)境變量

可以用set命令給變量賦值或查看環(huán)境變量值, 使用unset命令清除變量值, 使用export導(dǎo)出變量將可以使其它進(jìn)程訪問到該環(huán)境變量坑匠。可以把設(shè)置保存到.bashrc.bash_profile中, 成為永久的環(huán)境變量咱圆。

環(huán)境變量不限于我們之前講過的可執(zhí)行程序的環(huán)境變量笛辟、動(dòng)態(tài)庫(kù)功氨、Python模塊的環(huán)境變量,任何變量都可以的手幢。

  1. 位置變量

位置變量對(duì)應(yīng)于命令行參數(shù), 其中$0為腳本名稱, $1為第一個(gè)參數(shù), 依次類推, 參數(shù)超過9個(gè)必須使用${}引用變量捷凄。shell保留這些變量, 不允許用戶以另外的方式定義它們, 傳給腳本或函數(shù)的位置變量是局部和只讀的, 而其余變量為全局的(可以用local關(guān)鍵字聲明為局部)。

  1. 其它變量

$?: 保存前一個(gè)命令的返回碼; 0為運(yùn)行成功围来,常用來判斷上一個(gè)程序的退出狀態(tài)跺涤。

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

$!: 上一個(gè)子進(jìn)程的進(jìn)程號(hào)

$#: 傳給腳本或函數(shù)的參數(shù)個(gè)數(shù), 即位置變量數(shù)減1(1代表腳本自身)
$*$@: 傳給腳本的所有參數(shù)(不包含腳本本身), 每個(gè)參數(shù)以$IFS分隔(一般內(nèi)為空格\TAB\換行); 兩者的不同點(diǎn)是引號(hào)括起來時(shí),$*會(huì)被作為一個(gè)整體监透,$@還是單個(gè)的參數(shù)桶错。

ct@ehbio:~$ cat ehbio_testParam.sh
#!/bin/bash

echo "EHBIO${IFS}great"

echo '$*'
echo -ne "\t";
echo $*

echo '$@'
echo -ne "\t";
echo $@

echo 'Each element in $*:'

for i in "$*"; do
    echo -ne "\t";
    echo $i;
done


echo 'Each element in $@:'
for i in "$@"; do
    echo -ne "\t";
    echo $i;
done

ct@ehbio:~$ bash ehbio_testParam.sh sheng xin bao dian
EHBIO   
great
$*
    sheng xin bao dian
$@
    sheng xin bao dian
Each element in $*:
    sheng xin bao dian
Each element in $@:
    sheng
    xin
    bao
    dian

Bash操作符

  1. 字符串操作符(替換操作符)

${var:-word}: 如果var存在且不為空, 返回它的值, 否則返回word
${var:=word}: 如果var存在且不為空, 返回它的值, 否則將word賦給var, 返回它的值
${var:+word}: 如果var存在且不為空, 返回word, 否則返回空
${var:?message} 如果var存在且不為空, 返回它的值,
否則顯示“-bash: var: message”, 然后退出當(dāng)前命令或腳本
${var:offset[:length]} 從offset位置開始返回var的一個(gè)長(zhǎng)為length的子串,
若沒有l(wèi)ength, 則默認(rèn)到var串末尾

ct@ehbio:~$ echo ${var:?message}
-bash: var: message
ct@ehbio:~$ var='sheng xin bao dian'
ct@ehbio:~$ echo ${var:6:3}
xin
ct@ehbio:~$ echo ${var:?message}
sheng xin bao dian
ct@ehbio:~$ echo $?
0
ct@ehbio:~$ unset var
ct@ehbio:~$ echo ${var:?message}
-bash: var: message
ct@ehbio:~$ echo $?
1
ct@ehbio:~$ echo ${var:=ehbio}
ehbio
ct@ehbio:~$ echo ${var}
ehbio
  1. 模式匹配操作符

${var#pattern} 從var頭部開始, 刪除和pattern匹配的最短模式串, 然后返回 剩余串

${var##pattern} 從var頭部開始, 刪除和pattern匹配的最長(zhǎng)模式串, 然后返回 剩余串, basename path=${path##*/}

${var%pattern} 從var尾部開始, 刪除和pattern匹配的最短模式串, 然后返回 剩余串, dirname path=${path%/*}

${var%%pattern} 從var尾部開始, 刪除和pattern匹配的最長(zhǎng)模式串, 然后返回 剩余串

${var/pattern/string} 用string替換var中和pattern匹配的最長(zhǎng)模式串

個(gè)人最常用的是最后一個(gè),常用于for循環(huán)中胀蛮。

ct@ehbio:~$ var='sheng xin bao dian good'
ct@ehbio:~$ ${var/good/great}
-bash: sheng: command not found
ct@ehbio:~$ echo ${var/good/great}
sheng xin bao dian great

比如獲取fastq文件的名字部分

for i in `ls *_1.fq.gz`; do j=${i/_1.fq.gz/}; echo "$j"; done

Shell中條件和test命令

Bash可以使用[ … ]結(jié)構(gòu)或test命令測(cè)試復(fù)雜條件
格式: [ expression ]test expression
返回一個(gè)代碼, 表明條件為真還是為假, 返回0為真, 否則為假院刁。
注: 左括號(hào)和右括號(hào)前空格必須的語(yǔ)法要求

  1. 文件測(cè)試操作符

-d file: file存在并且是一個(gè)目錄
-e file: file存在
-f file: file存在并且是一個(gè)普通文件
-g file: file存在并且是SGID(設(shè)置組ID)文件
-r file: 對(duì)file有讀權(quán)限
-s file: file存在并且不為空
-u file: file存在并且是SUID(設(shè)置用戶ID)文件
-w file: 對(duì)file有寫權(quán)限
-x file: 對(duì)file有執(zhí)行權(quán)限, 如果是目錄則有查找權(quán)限
-O file: 擁有file
-G file: 測(cè)試是否是file所屬組的一個(gè)成員
-L file: file為符號(hào)鏈接
file1 –nt file2: file1比file2新

file1 –ot file2: file1比file2舊

舉兩個(gè)例子

ct@ehbio:~$ touch older
ct@ehbio:~$ touch newer

ct@ehbio:~$ if test -e older; then echo "older esists"; fi
older esists
ct@ehbio:~$ if test -s older; then echo "older is unempty"; fi
ct@ehbio:~$ if [ -s older ]; then echo "older is unempty"; fi
ct@ehbio:~$ if [ ! -s older ]; then echo "older is empty"; fi
older is empty
ct@ehbio:~$ if [ newer -nt older ]; then echo "newer"; fi
newer
  1. 字符串操作符

str1=str2 str1和str2匹配
str1!=str2 str1和str2不匹配
str1>str2 str1大于str2
-n str str的長(zhǎng)度大于0(不為空)
-z str str的長(zhǎng)度為0(空串),常用于判斷必須的命令行參數(shù)是否傳入

# 字符串的大小比較的是最先遇到的不同的ASCII碼的大小
ct@ehbio:~$ if test "10">"20"; then echo "10>20"; fi
10>20
ct@ehbio:~$ if test 10>20; then echo "10 < 20"; fi
  1. 整數(shù)操作符

var1 –eq var2 var1等于var2
var1 –ne var2 var1不等于var2
var1 –ge var2 var1大于等于var2
var1 –gt var2 var1大于var2
var1 –le var2 var1小于等于var2
var1 –lt var2 var1小于var2

ge: great equal; gt: great than

需要注意的是常用的數(shù)學(xué)運(yùn)算符給了字符串比較粪狼,數(shù)字比較使用的卻是英文縮寫

數(shù)學(xué)表達(dá)式也可以

if (( 3>2 )); then echo 'TRUE'; fi
TRUE
  1. 邏輯操作符

!expr 對(duì)expr求反
expr1 && expr2 對(duì)expr1與expr2求邏輯與, 當(dāng)expr1為假時(shí)不再執(zhí)行expr2
expr1 || expr2 對(duì)expr1與expr2求邏輯或, 當(dāng)expr1為真時(shí)不再執(zhí)行expr2

Shell流控制

  1. 條件語(yǔ)句: if

if, then, elif, else, fi是關(guān)鍵詞退腥,其它的是需要替換掉的。

if conditions; then
    do sth when conditions are true
elif another_conditions; then
    do sth when another_conditions are true
else:
    do sth when above condiitons are all false
fi
if test $guanzhu_sxbd == "already"; then
    echo "Enjoy it"
elif test $guanzhu_hjyz == "already"; then
    echo "Enjoy it"
else
    echo "Guan zhu them"
fi

Enjoy it
  1. 確定性循環(huán): for do done 常用的批量操作方式

遍歷一個(gè)列表再榄,取出每個(gè)元素狡刘,針對(duì)性操作。

for i in `ls *_1.fq.gz`; do 
    echo "$i"; 
done
  1. 不確定性循環(huán): whileuntil
declare -i a #定義整數(shù)變量
a=1   # 初始化變量
while test $a -lt 3; do
    echo $a
    a=$a+1
done 

echo $a
  1. 選擇結(jié)構(gòu): caseselect (類似getopts)
ct@ehbio:~$ cat select_case.sh

PS3="Input the position of selected parameter (1 for exit):"

select opts in a b c d
do
    case $opts in
        a)
            exit 0;
            ;;
        b)
            echo " Parameters $opts"
            ;;
        c)
            echo " Parameters $opts"
            ;;
        d)
            echo " Parameters $opts"
            ;;
        ?)
            echo "Unknown"
            ;;
    esac
done

ct@ehbio:~$ bash select_case.sh 
1) a
2) b
3) c
4) d
Input the position of selected parameter (1 for exit):2
 Parameters b
Input the position of selected parameter (1 for exit):3
 Parameters c
Input the position of selected parameter (1 for exit):4
 Parameters d
Input the position of selected parameter (1 for exit):1

  1. 命令shift

將存放在位置變量中的命令行參數(shù)依次向左傳遞shift n 命令行參數(shù)向左傳遞n個(gè)參數(shù)串

ct@ehbio:~$ cat ehbio_testParam.sh
#!/bin/bash

echo 'Each element in $*:'

for i in "$*"; do
    echo -ne "\t";
    echo $i;
done

echo $1
shift

for i in "$*"; do
    echo -ne "\t";
    echo $i;
done
ct@ehbio:~$ bash ehbio_testParam.sh sheng xin bao dian
Each element in $*:
    sheng xin bao dian
sheng
    xin bao dian

Shell函數(shù)

function function_name () { function body}定義函數(shù)困鸥,函數(shù)參數(shù)的獲取同命令行參數(shù)獲取嗅蔬。

ct@ehbio:~$ cat test_func.sh 
function show_ehbio () {
    echo $@
    echo $1
}

show_ehbio "EHBIO great" "SXBD great"
ct@ehbio:~$ bash test_func.sh
EHBIO great SXBD great
EHBIO great

輸入輸出

  1. I/O重定向

管道、標(biāo)準(zhǔn)輸入輸出之前有過詳細(xì)介紹疾就。

<: 輸入重定向

>: 輸出重定向(沒有文件則創(chuàng)建, 有則覆蓋)

>>: 輸出重定向(沒有則創(chuàng)建, 有則追加到文件尾部)

<<: 輸入重定向(here文檔)

command << label  
input…  
label  
說明:  使一個(gè)命令的輸入為一段shell腳本(input…), 直到標(biāo)號(hào)(label)結(jié)束  
ftp: USER=anonymous  
PASS=YC@163.com  
#-i: 非交互模式 -n: 關(guān)閉自動(dòng)登錄  
ftp –i –n << END 
open ftp.163.com  
user $USER $PASS  
cd /pub  
close  
END
#END標(biāo)記輸入結(jié)束 
  1. 字符串I/O操作

字符串輸出: echo

命令選項(xiàng): -e: 啟動(dòng)轉(zhuǎn)義序列 -n: 取消輸出后換行 (前面已經(jīng)用到過)

  1. 字符串輸入: read 可以用于用戶交互輸入, 也可以用來一次處理文本文件中的一行

命令選項(xiàng):

ct@ehbio:~$ read -p "Enter the best tutorial: " tutorial
Enter the best tutorial: Sheng Xin Bao Dian
ct@ehbio:~$ echo $tutorial
Sheng Xin Bao Dian

# 隱藏輸入內(nèi)容
ct@ehbio:~$ read -s -p "Enter your password: " password
Enter your password: 
ct@ehbio:~$ echo $password
haha

命令行處理 命令行處理命令:

getopts 有兩個(gè)參數(shù), 第一個(gè)為字母和冒號(hào)組成的選項(xiàng)列表字符串, 第二個(gè)為一個(gè)變量名

選項(xiàng)列表字符串以冒號(hào)開頭的選項(xiàng)字母排列組成, 如果一選項(xiàng)需要一個(gè)參數(shù)則該選項(xiàng)字母后跟一個(gè)冒號(hào)

getopts分解第一參數(shù), 依次將選項(xiàng)摘取出來賦給第二個(gè)參數(shù)變量

如果某選項(xiàng)有參數(shù), 則讀取參數(shù)到內(nèi)置變量OPTARG中 內(nèi)置變量OPTIND保存著將被處理的命令行參數(shù)(位置參數(shù))的數(shù)值選項(xiàng)列表處理完畢getopts返回1, 否則返回0 如:

在我們推出的一步繪圖腳本里面澜术,就是使用Bash封裝的R腳本,通過修改命令行參數(shù)虐译,完成熱圖瘪板、柱狀圖、線圖漆诽、Venn圖侮攀、火山圖、泡泡圖等圖形的繪制和定制厢拭。

while getopts "hf:m:a:A:b:I:t:x:l:j:J:d:F:G:H:P:L:y:V:D:c:C:B:X:Y:R:w:u:r:o:O:s:S:p:z:Z:v:e:E:i:" OPTION
do
        case $OPTION in
                h)
                        usage
                        exit 1
                        ;;
                f)
                        file=$OPTARG
                        ;;
                m)
                        melted=$OPTARG
                        ;;
                .
                .
                .
                ?)
                        usage
                        exit 1
                        ;;
        esac
done                

進(jìn)程和作業(yè)控制

命令行運(yùn)行監(jiān)測(cè)和軟件安裝文中講述了部分監(jiān)測(cè)命令兰英。

如果一個(gè)命令需要運(yùn)行比較久,一般使用nohup cmmand &來放入后臺(tái)不中斷運(yùn)行供鸠,這樣推出終端也不影響程序畦贸。

command &是把程序放入后臺(tái)。

jobs: 查看后臺(tái)進(jìn)程

bg: 顯示后臺(tái)進(jìn)程, 即用Ctrl+z掛起或‘命令 &’執(zhí)行的進(jìn)程

fg job_id: 將后臺(tái)進(jìn)程轉(zhuǎn)到前臺(tái)執(zhí)行

kill –9 process_id: 強(qiáng)制殺掉某個(gè)進(jìn)程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市薄坏,隨后出現(xiàn)的幾起案子趋厉,更是在濱河造成了極大的恐慌,老刑警劉巖胶坠,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件君账,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沈善,警方通過查閱死者的電腦和手機(jī)乡数,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闻牡,“玉大人净赴,你說我怎么就攤上這事≌秩螅” “怎么了玖翅?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)割以。 經(jīng)常有香客問我烧栋,道長(zhǎng),這世上最難降的妖魔是什么拳球? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮珍特,結(jié)果婚禮上祝峻,老公的妹妹穿的比我還像新娘。我一直安慰自己扎筒,他們只是感情好莱找,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗜桌,像睡著了一般奥溺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骨宠,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天浮定,我揣著相機(jī)與錄音,去河邊找鬼层亿。 笑死桦卒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匿又。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼棍潘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起洞慎,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘿棘,沒想到半個(gè)月后劲腿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔫巩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年谆棱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圆仔。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垃瞧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坪郭,到底是詐尸還是另有隱情个从,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布歪沃,位于F島的核電站嗦锐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沪曙。R本人自食惡果不足惜奕污,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望液走。 院中可真熱鬧碳默,春花似錦、人聲如沸缘眶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巷懈。三九已至该抒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顶燕,已是汗流浹背凑保。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留割岛,地道東北人愉适。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像癣漆,于是被迫代替她去往敵國(guó)和親维咸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • .bat腳本基本命令語(yǔ)法 目錄 批處理的常見命令(未列舉的命令還比較多,請(qǐng)查閱幫助信息) 1癌蓖、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,070評(píng)論 1 19
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,764評(píng)論 0 38
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)瞬哼,也就是一...
    悟名先生閱讀 4,132評(píng)論 0 13
  • 好的美妝產(chǎn)品就象一道色香味俱全的菜肴,細(xì)品滋味租副,也象一本書內(nèi)容豐富讀來受益坐慰。然而本品的魅力在于你一用一試便知一生受...
    姜月萍閱讀 120評(píng)論 0 0