getopt設計shell腳本選項

寫shell腳本的時候,通過while、case、shift來設計腳本的命令行選項是一件比較麻煩的事,因為Unix命令行的選項和參數自由度很高,支持短選項和長選項,參數可能是可選的,選項順序可能是無所謂的,等等。

bash下的getopt命令可以解析命令行的選項和參數,將散亂、自由的命令行選項和參數進行改造,得到一個完整的、規范化的參數列表,這樣再使用while、case和shift進行處理就簡單的太多了

getopt有不同的版本,本文介紹的是它的增強版(enhanced),相比傳統的getopt(也稱為兼容版本的getopt),它提供了引號保護的能力。另外,除了不同版本的getopt,bash還有一個內置命令getopts(注意,有個尾隨的字符s),也用來解析命令行選項,但只能解析短選項。

要驗證安裝的getopt是增強版的還是傳統版的,使用getopt -T判斷即可。如果它什么都不輸出,則是增強版,此時它的退出狀態碼為4。如果輸出"--",則是傳統版的getopt,此時它的退出狀態碼為0。如果想在腳本中進行版本檢查,可以參考如下代碼:

getopt -T &>/dev/null;[ $? -ne 4 ] && { echo "not enhanced version";exit 1; }

1.命令行選項的那些事

在學習getopt如何使用之前,必須先知道命令行的一些常識。這些,都可以通過getopt來實現,但有些實現起來可能會比較復雜。

1.區分option、parameter、argument、option argument和non-option parameter

parameter和argument都表示參數,前者通常表示獨立性的參數,后者通常表示依賴于其它實體的參數。parameter的含義更廣,argument可以看作parameter的一種。

例如,定義函數時function foo(x,y){CODE},函數的參數x和y稱為parameter。調用函數并傳遞參數時,foo(arg1,arg2)中的arg1和arg2都是依賴于函數的,稱為argument更合適,當然也可以稱為更廣泛的parameter。

再例如,一個命令行:

tar -zcf a.tar.gz /etc/pki

粗分的話,-z-c-fa.tar.gz/etc/pki都可以稱為parameter。細分的話:

  • "-z -c -f"稱為選項,即option
  • a.tar.gz是選項"-f"的選項參數(傳遞給選項的參數),依賴于選項,稱為argument更合適,更嚴格的稱呼是option argument
  • /etc/pki既不屬于選項,也不屬于某個選項的參數,它稱為非選項類型的參數,對應的名稱為non-option parameter

本文要介紹的是getopt,所以只考慮命令行參數的情況。

2.短選項和長選項以及它們的"潛規則"

Linux中絕大多數命令都提供了短選項和長選項。一般來說,短選項是只使用一個"-"開頭,選項部分只使用一個字符,長選項是使用兩個短橫線(即"--")開頭的。

例如"-a"是短選項,"--append"是長選項。

一般來說,選項的順序是無所謂的,但并非絕對如此,有時候某些選項必須放在前面,必須放在某些選項的前面、后面。

一般來說,短選項:

  • 可以通過一個短橫線"-"將多個短選項連接在一起,但如果連在一起的短選項有參數的話,則必須作為串聯的最后一個字符。

    例如"-avz"其實會被解析為"-a -v -z",tar -zcf a.tar.gz串聯了多個短選項,但"-f"選項有參數a.tar.gz,所以它必須作為串聯選項的最后一個字符。

  • 短選項的參數可以和選項名稱連在一起,也可以是用空白分隔。例如-n 3-n3是等價的,數值3都是"-n"選項的參數值。

  • 如果某個短選項的參數是可選的,那么它的參數必須緊跟在選項名后面,不能使用空格分開。至于為什么,見下面的第3項。

一般來說,長選項:

  • 可以使用等號或空白連接兩種方式提供選項參數。例如--file=FILE--file FILE
  • 如果某個長選項的參數是可選的,那么它的參數必須使用"="連接。至于為什么,見下面的第3項。
  • 長選項一般可以縮寫,只要不產生歧義即可。

例如,ls命令,以"a"開頭的長選項有3個。

1
2
3
4
$ ls --help | grep -- '--a' -a, --all                  do not ignore entries starting with .-A, --almost-all           do not list implied . and ..--author               with -l, print the author of each file

如果想要指定--almost-all,可以縮寫為--alm;如果想要指定--author,可以縮寫為--au。如果只縮寫為"--a",bash將給出錯誤提示,長選項出現歧義:

1
2
3
$ ls --a
ls: option '--a' is ambiguous; possibilities: '--all' '--author' '--almost-all'
Try 'ls --help' for more information.

3.不帶參數的選項、可選參數的選項和帶參數的選項

有不同類型的命令行選項,這些選項可能不需要參數,也可能參數是可選的,也可能是強制要求參數的。

前面說了,如果某個選項的參數是可選的,那么它的參數必須不能使用空格將參數和選項分開。如果使用空格分隔,則無法判斷它的下一個元素是該選項的參數還是非選項類型的參數。

例如,-c--config選項的參數是可選的,要向這兩個選項提供參數,必須寫成-cFILE--config=FILE,如果寫成-c FILE--config FILE,那么命令行將無法判斷這個FILE是提供給選項的參數,還是非選項類型的參數。

一般來說,使用可選參數的情況非常少,至少我目前回憶不起來這樣的命令(mysql -p選項是一個)。

4.使用"--"將選項(及它們的選項參數)與非選項類型參數進行分隔

unix的命令行中,總是可以在非選項類型的參數之前加上"--",表示選項和選項參數到此為止,后面的都是非選項類型的參數。

例如:

1
2
seq -w -- 3
seq -w -- 1 3

分別表示3和"1 3"是seq的非選項類型參數,而"--"前面的一定是選項或選項參數。

5.命令行參數中的短橫線開頭的并不一定總是短選項,也可能是負數參數

例如seq命令:

seq -w -5 -1 5

其中-5和-1都是負數非選項類型的參數。

6.選項的依賴性和互斥性

有些命令的選項是有依賴性和互斥性的。比如某個選項要和另一個選項一起使用,某個選項不能和另一個選項一起使用。

例如--manage --remove,只有在使用了--manage的前提下才能使用--remove,否則就應該報錯。

7.模式化(模塊化)類型的選項

很多unix命令都將選項進行模塊化設計。例如ip命令,address模式、route模式、link模式等等。

1
2
3
4
ip addr OPTIONS
ip route OPTIONS
ip link OPTIONS 
ip neigh OPTIONS

8.其他特性的選項

有些命令還有比較個性化的選項。

比如head命令,-n NUM選項,即可以指定為-3,也可以指定為-n 3-n3

再比如有的命令支持邏輯運算,例如find命令的-a、-o選項。

2.getopt解析選項的工作機制

bash的getopt命令經常用在shell腳本內部或函數內部,用來解析腳本執行或函數執行時傳遞的選項、參數。

下面都以命令行為例解釋getopt是如何解析參數的,但用來解析函數參數是一樣的。

2.1 getopt選項

下面這個是最常用的getopt解析方式(有這個命令就夠了)。如果要了解getopt更完整的語法,見man getopt。

getopt -o SHORT_OPTIONS -l LONG_OPTIONS -n "$0" -- "$@"

其中:
-o SHORT_OPTIONS
--options SHORT_OPTIONS
getopt通過"-o"選項收集命令行傳遞的短選項和它們對應的參數。關于SHORT_OPTIONS的格式見下一小節。

-l LONG_OPTIONS
--longoptions LONG_OPTIONS
getopt通過"-l"選項收集命令行傳遞的長選項和它們對應的參數。可能從別人的腳本中經常看到"--long",是等價的,前文已經解釋過,長選項只要不產生歧義,是可以進行縮寫的。關于LONG_OPTIONS的格式見下一小節。

-n NAME
getopt在解析命令行時,如果解析出錯(例如要求給參數的選項沒帶參數,使用了無法解析的選項等)將會報告錯誤信息,getopt將使用該NAME作為報錯的腳本名稱。

-- "$@"
其中--表示getopt命令自身的選項到此結束,后面的元素都是要被getopt解析的命令行參數。這里使用"$@",表示所有的命令行參數。注意,不能省略雙引號。

2.2 getopt如何解析選項和參數

getopt使用"-o"或"-l"解析短、長選項和參數時,將會對每個解析到的選項、參數進行輸出,然后不斷放進一個字符串中。這個字符串的內容就是完整的、規范化的選項和參數。

getopt使用"-o"選項解析短選項時:

  • 多個短選項可以連在一起
  • 如果某個要解析的選項需要一個參數,則在選項名后面跟一個冒號
  • 如果某個要解析的選項的參數可選,則在選項名后面跟兩個冒號
  • 例如,getopt -o ab:c::中,將解析為-a -b arg_b -c [arg_c],arg_b是-b選項必須的,arg_c是-c選項可選的參數,"-a"選項無需參數

getopt使用"-l"選項解析長選項時:

  • 可以一次性指定多個選項名稱,需要使用逗號分隔它們
  • 可以多次使用-l選項,多次解析長選項
  • 如果某個要解析的選項需要一個參數,則在選項名后面跟一個冒號
  • 如果某個要解析的選項的參數可選,則在選項名后面跟兩個冒號
  • 例如,getopt -l add:,remove::,show中,將解析為--add arg_add --remove [arg_rem] --show,其中arg_add是--add選項必須的,--remove選項的參數arg_rem是可選的,--show無需參數

如果解析的是帶參數的選項,則getopt生成的字符串中,會將選項的參數值作為該選項的下一個參數。如果解析的是可選參數的選項,如果為該選項設置了參數,則會將這個參數放在選項的下一個參數位置,如果沒有為該選項設置參數,則會生成一個用引號包圍的空字符串作為選項的下一個參數。

getopt解析完選項和選項的參數后,將解析非選項類型的參數(non-option parameter)。getopt為了讓非選項類型的參數和選項、選項參數區分開,將在解析第一個非選項類型參數時加上一個"--"到字符串中,表示選項和選項參數到此結束,然后將所有的非選項類型參數放在這個"--"參數之后。

默認情況下,該加強版本的getopt會將所有參數值(包括選項參數、非選項類型的參數)使用引號進行包圍,以便保護空白字符和特殊字符。如果是兼容版本的getopt,則不會用引號保護,所以會破壞參數解析。

看后面的示例就很容易理解了。

2.3 示例分析getopt的解析方式

例如在腳本test.sh中,下面的getopt的結果保存到變量parameters中,然后輸出getopt解析完成后得到的完整參數列表。

1
2
3
4
#!/usr/bin/env bashparameters=`getopt -o ab:c:: --long add:,remove::,show -n "$0" -- "$@"`
echo "$parameters"

如果還不知道這里的-o--long解析了什么東西,請回頭仔細再看一遍。

執行這個腳本,并給這個腳本傳遞一些選項和參數,這些腳本參數將被收集到$@,然后被getopt解析。

1
2
$ ./test.sh -a non-op_arg1 -b b_short_arg non-op_arg2 --rem --add /path --show -c non-op_arg3-a -b 'b_short_arg' --remove '' --add '/path' --show -c '' -- 'non-op_arg1' 'non-op_arg2' 'non-op_arg3'

首先可以看出,傳遞給腳本的參數都是無序的:

  • 長選項有:
    • --rem:是--remove的縮寫形式,它的參數是可選的,但沒有為它傳遞參數
    • --add:并設置了該選項的參數/path
    • --show:沒有任何參數
  • 短選項有:
    • -a:它是無需參數的選項,所以它后面的non-op_arg1是一個非選項類型的參數
    • -b:它是必須帶參數的選項,所以b_short_arg是它的參數
    • -c:它的參數是可選的,這里沒有給它提供參數(前面解釋過,要給參數可選的選項提供參數,短選項時,參數和選項名稱必須連在一起)。
  • 非選項類型的參數有:
    • non-op_arg1
    • non-op_arg2
    • non-op_arg3

從getopt的輸出結果中,可以看出:

  • 先解析選項和選項參數
  • 選項和選項參數是按照從左向右的方式進行解析的
  • 參數都使用引號包圍
  • 那些參數可選的選項,當沒有為它們提供參數時,將生成一個引號包圍的空字符串參數
  • 解析完所有的選項和選項參數后,開始解析非選項類型的參數
  • 非選項類型的參數前面,會生成一個"--"字符串,它將選項(以及選項參數)與非選項類型的參數隔開了

3.處理getopt解析的結果

getopt解析得到了完整、規范化的結果,當然要拿來應用。例如直接傳遞個函數,或者根據while、case、shift將選項、參數進行分割單獨保存。

如果要進行分割,由于getopt的解析結果通常保存在一個變量中,要解析這個結果字符串,需要使用eval函數將變量的內容進行還原,一般來說會將其設置為一個位置參數(因為shift只能操作位置變量)。

一般來說,整個處理流程是這樣的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
parameters=$(getopt -o SHORT_OPTIONS -l LONG_OPTIONS -n "$0" -- "$@")
[ $? != 0 ] && exit 1
eval set -- "$parameters"   # 將$parameters設置為位置參數
while true ; do             # 循環解析位置參數case "$1" in-a|--longa) ...;shift ;;    # 不帶參數的選項-a或--longa-b|--longb) ...;shift 2;;   # 帶參數的選項-b或--longb-c|--longc)                 # 參數可選的選項-c或--longccase "$2" in "")...;shift 2;;  # 沒有給可選參數*) ...;shift 2;;  # 給了可選參數esac;;--) ...; break ;;       # 開始解析非選項類型的參數,break后,它們都保留在$@中*) echo "wrong";exit 1;;esac
done

需要注意,getopt解析既可以放在腳本中解析命令行參數,也可以放在某個函數中解析函數參數。

4.getopt的兩種掃描模式

getopt提供了兩種掃描模式,只要在getopt的短選項前加上加號或負號,就能指定兩種掃描模式,即getopt -o [+-]SHORT_OPTS

  • +掃描模式:只要解析完選項、選項參數,解析到第一個非選項類型的參數后,就會停止解析,它會將所有沒有解析的內容都當作非選項類型參數。所以這種情況下,非選項類型的參數都必須放在尾部,而不能放在某個待解析選項的前面。這種模式在區別負數和短選項時,非常有用。
  • -掃描模式:會按照原始位置參數解析,并保留原始位置。這種模式一般用不上,因為破壞了getopt的優勢:讓選項完整、規范化。

例如,對于命令行參數-w -s -5 3 -2,要將-5識別為-s的參數,3和-2為非選項類型的參數,則:

1
2
3
$ set -- -w -s -5 3 -2  # 設置位置參數
$ getopt -o +s:w -n "$0" -- "$@"-w -s '-5' -- '3' '-2'      # 解析結果

注意,上面的-5是被解析成了-s的參數,而不是選項或非選項類型的參數,因為-s選項必須要指定一個參數。

上面的3必須不能是負數,因為getopt必須先掃描到一個正常的非選項型參數,才能將它后面的所有負數都當作非選項型參數。至于如何將-w -s -5 -3 -2中的-3和-2都解析為非選項型參數,目前我也不知道。

使用-掃描模式:

1
2
3
$ set -- 3 -w 4 -s -5 a 3
$ getopt -o -s:w -n "$0" -- "$@"'3' -w '4' -s '-5' 'a' '3' --    # 解析結果

可以看到,上面的所有參數位置都是保持原樣的,且將分隔符號"--"補在了最尾部。

5.如何實現命令行選項的各種個性功能

在前面命令行選項的那些事中介紹了幾種有"個性"的選項功能,包括:

  • 選項依賴:例如"-a"或"--add"要依賴于"-m"或"--manage"選項
  • 選項互斥:例如"-a"或"--add"與"-r"或"--remove"是互斥的
  • 識別負數參數:例如-w -5 -3 5,其中-5和-3不是短選項,而是負數參數
  • 模式化選項:例如script_name MODE OPTIONS的MODE部分,可以是manage模式(--manage,-m),也可以使用add模式(--add,-a)
  • 選項參數替代選項:例如head -n 3可以替換為head -3

這里介紹下用getopt解析參數后實現它們的思路。

在getopt解析完成后,假設返回結果保存到了$parameters變量中。

1.選項依賴性

這個其實很好實現,只需使用grep對$parameters變量進行篩選一下即可。

例如實現依賴性,只需:

1
2
{ echo "$parameters" | grep -E '\-\-add|\-a ' | grep -E '\-\-manage|\-m '; } &>/dev/null
[ $? -ne 0 ] && exit

2.選項互斥性

要實現互斥性,只需:

1
2
or_op=`echo "$parameters" | grep -Eo '\-\-add|\-a | \-\-remove|\-r ' | wc -l`
[ "$or_op" = "2" ] && exit

3.識別負數參數

前面解釋過,getopt提供了兩種掃描模式,只要使用+掃描模式,就能輕松區別負數參數和短選項。

4.模式化選項

一般來說,模式化選項都是命令行的第一個參數。所以,只需將$parameter中"--"后面的第一個非選項類型的參數提取出來,就是所謂的模式了。當然,還得對這個參數進行一些判斷,避免它不是模式參數。

例如,要提供addr、show、route三種模式,那么其它的非選項類型參數值都不應該是模式參數。

1
2
3
4
5
6
7
8
9
10
11
12
eval set -- "$parameters"
while true ; docase "$1" in...--) shift[ "$x" = "addr" -o "$x" = "route" -o "$x" = "show" ] && MODE=$1shiftbreak ;;*) echo "wrong";exit 1;;esac
done

5.選項參數替代選項

就以-n3-3為例,它的通用格式是-n NUM-NUM。這個并不好實現,我能想到的方法是將這個-NUM先從$@中篩選出來,然后賦值。

1
2
3
NUM=`echo "$@" | grep -Eo "\-[0-9]+"`
ARGS=`echo "$@" | sed -nr 's!(.*)-[0-9]+(.*)!\1\2!'p`
eval set -- "$ARGS"

6.使用getopt設計shell腳本選項示例

這里提供一個和seq命令功能相同的腳本seq.sh,然后設計這個腳本的選項。

先看一下seq命令的各個選項說明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
seq [OPTION]... LAST                  # 語法1
seq [OPTION]... FIRST LAST            # 語法2
seq [OPTION]... FIRST INCREMENT LAST  # 語法3選項:
-s, --separator=STRING
使用指定的STRING分隔各數值,默認值為"\n"u-w, --equal-width
使用0填充在前綴使所有數值長度相同--help
顯示幫助信息并退出--version
輸出版本信息并退出

以下是腳本內容:和seq相比,只有兩個問題:第一個起點數值FIRST不能為負數;不支持小數功能。其它功能完全相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/env bash
###########################################################
#  author     : 駿馬金龍                                   #
#  blog       : http://www.cnblogs.com/f-ck-need-u/       #
###########################################################usage(){
cat <<'EOF'
Usage: $0 [OPTION]... LASTor:  $0 [OPTION]... FIRST LASTor:  $0 [OPTION]... FIRST INCREMENT LAST
EOF
}# getopt的版本是增強版嗎
getopt -T &>/dev/null;[ $? -ne 4 ] && { echo "not enhanced version";exit 1; }# 參數解析
parameters=`getopt -o +s:w --long separator:,equal-width,help,version -n "$0" -- "$@"`
[ $? -ne 0 ] && { echo "Try '$0 --help' for more information."; exit 1; }eval set -- "$parameters"while true;docase "$1" in-w|--equal-width) ZERO_PAD="true"; shift ;;-s|--separator) SEPARATOR=$2; shift 2 ;;--version) echo "$0 version V1.0"; exit ;;--help) usage;exit ;;--)shiftFIRST=$1INCREMENT=$2LAST=$3break ;;*) usage;exit 1;;esac
done# 用于生成序列數
function seq_func(){# 是否要使用printf填充0位?[ "x$1" = "xtrue" ] && zero_pad="true" && shift# 設置first、step、lastif [ $# -eq 1 ];thenfirst=1step=1last=$1elif [ $# -eq 2 ];thenfirst=$1step=1last=$2elif [ $# -eq 3 ]; thenfirst=$1step=$2last=$3elseecho "$FUNCNAME: ARGS wrong..."exit 1fi# 最后一個要輸出的元素及其長度,決定要填充多少個0last_output=$[ last - ( last-first ) % step ]zero_pad_len=`[ ${#last_output} -gt ${#first} ] && echo ${#last_output} || echo ${#first}`# 生成序列數if [ "x$zero_pad" = "xtrue" ];then# 填充0if [ $step -gt 0 ];then# 遞增,填充0for((i=$first;i<=$last;i+=$step)){[ $last_output -eq $i ] && { printf "%0${zero_pad_len}i\n" "$i";return; }printf "%0${zero_pad_len}i " $i}else# 遞減,填充0for((i=$first;i>=$last;i+=$step)){[ $last_output -eq $i ] && { printf "%0${zero_pad_len}i\n" "$i";return; }printf "%0${zero_pad_len}i " $i}fielse# 不填充0if [ $step -gt 0 ];then# 遞增,不填充0for((i=$first;i<=$last;i+=$step)){[ $last_output -eq $i ] && { printf "%i\n" "$i";return; }printf "%i " $i}else# 遞減,不填充0for((i=$first;i>=$last;i+=$step)){[ $last_output -eq $i ] && { printf "%i\n" "$i";return; }printf "%i " $i}fifi
}# 指定輸出分隔符
: ${SEPARATOR="\n"}# 輸出結果
seq_func $ZERO_PAD $FIRST $INCREMENT $LAST | tr " " "$SEPARATOR"

上面解析選項的腳本缺陷在于無法解析FIRST為負數的情況,例如./seq.sh -w -5 3將報錯。但可以寫為標準的./seq.sh -w -- -5 -3語法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535317.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

percona-toolkit---pt-heartbeat

對于MySQL數據庫主從復制延遲的監控&#xff0c;可以借助percona的有力武器pt-heartbeat來實現。 pt-heartbeat的工作原理通過使用時間戳方式在主庫上更新特定表&#xff0c;然后在從庫上讀取被更新的時間戳然后與本地系統時間對比來得出其延遲。具體流程&#xff1a; 1&…

定時刪除腳本

#!/bin/sh backup_dir/data/xtrabackup DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d PATH/usr/local/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATHbinog保留7天 binlog/data/binlogserver binlog_Rtime7#備…

percona-toolkit--pt-table-checksum

pt-table-checksum 是 Percona-Toolkit的組件之一&#xff0c;用于檢測MySQL主、從庫的數據是否一致。其原理是在主庫執行基于statement的sql語句來生成主庫數據塊的checksum&#xff0c;把相同的sql語句傳遞到從庫執行&#xff0c;并在從庫上計算相同數據塊的checksum&#xf…

Docker容器間網絡通信

自從Docker容器出現以來&#xff0c;容器網絡通信就一直是被關注的焦點&#xff0c;也是生產環境的迫切需求。容器網絡通信又分為兩大方面&#xff1a;單主機容器上的相互通信&#xff0c;和跨主機的容器相互通信。 一、Docker單主機容器通信 基于對net namespace的控制&#…

Docker容器的重啟策略

1. Docker容器的重啟策略 Docker容器的重啟策略是面向生產環境的一個啟動策略&#xff0c;在開發過程中可以忽略該策略。 Docker容器的重啟都是由Docker守護進程完成的&#xff0c;因此與守護進程息息相關。 Docker容器的重啟策略如下&#xff1a; no&#xff0c;默認策略&…

innobackupex實現導出和導入單張表

默認情況下&#xff0c;InnoDB表不能通過直接復制表文件的方式在mysql服務器之間進行移植&#xff0c;即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能&#xff0c;不過只能"導出"具有.ibd文件的表&#xff0c;也就是說導出表的mysql服務…

xtrabackup工具

(1).備份過程 和innobackupex備份過程不同的是&#xff0c;xtrabackup的備份路徑是由"--target-dir"選項嚴格指定的&#xff0c;如果指定的目錄不存在&#xff0c;它備份的時候不會在target-dir目錄中再創建時間戳子目錄。 [rootxuexi data]# xtrabackup --backup …

mysql數據庫參數

注意&#xff1a;在配置binlog相關變量的時候&#xff0c;相關變量名總是搞混&#xff0c;因為有的是binlog&#xff0c;有的是log_bin&#xff0c;當他們分開的時候&#xff0c;log在前&#xff0c;當它們一起的時候&#xff0c;bin在前。在配置文件中也同樣如此。 log_bin …

oracle命令行安裝

cd /home/oracle/databases/runInstaller -silent -force -showprogress -responseFile /home/oracle/database/db_install.rsp -ignoreSysPrereqs -ignorePrereqdbca -silent -responseFile pwd/dbca.rspnetca -silent -responseFile /home/oracle/databases/netca.rsp

定期刪除數據腳本

#!/bin/sh backup_dir/data/xtrabackup DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d PATH/usr/local/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH#binog保留7天 binlog/data/binlogserver binlog_Rtime7#備…

定期備份數據庫腳本

#!/bin/bash MasterIp* USERroot PORT3306 PASSWD000000 DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d OLDDATEdate %Y-%m-%d -d "30 days ago"  #全表備份 BACKUPDIR/data/mysql_backup/fulltable #單表tb_trcevt備份 datapath/data/mysq…

日志清理腳本

#!/bin/bash#定義日志所在分區當前空間所占比例數(去掉%)。grep -w表示精準匹配&#xff0c;只匹配"/"這個分區 LOG_PARTITION$(which df -h|awk {print $5,$6}|grep -w "/"|cut -d" " -f1|awk -F"%" {print $1}) #定義一周前的日期&a…

k8s二進制安裝

1. 前言 之前文章安裝 kubernetes 集群&#xff0c;都是使用 kubeadm 安裝&#xff0c;然鵝很多公司也采用二進制方式搭建集群。這篇文章主要講解&#xff0c;如何采用二進制包來搭建完整的高可用集群。相比使用 kubeadm 搭建&#xff0c;二進制搭建要繁瑣很多&#xff0c;需要…

Logstash mutate 插件

mutate 插件可以在字段上執行變換&#xff0c;包括重命名、刪除、替換和修改。這個插件相當常用。 比如&#xff1a; 你已經根據 Grok 表達式將 Tomcat 日志的內容放到各個字段中&#xff0c;想把狀態碼、字節大小或是響應時間&#xff0c;轉換成整型&#xff1b;你已經根據正則…

nginx日志分析腳本

#!/usr/bin/env bashecho "" echo " " echo " \ Nginx日志安全分析腳本 V1.0 / " echo " " echo " # 支持Nginx日志分析&#xff0c;攻擊告警分析等 " echo " # auth…

ELK學習筆記之Logstash詳解

0x00 Logstash概述 官方介紹&#xff1a;Logstash is an open source data collection engine with real-time pipelining capabilities。簡單來說logstash就是一根具備實時數據傳輸能力的管道&#xff0c;負責將數據信息從管道的輸入端傳輸到管道的輸出端&#xff1b;與此同時…

nginx-zabbix監控腳本

nginx_status_fun (){#函數內容NGINX_PORT$1#端口&#xff0c;函數的第一個參數是腳本的第二個參數&#xff0c;即腳本的第二個參數是段端口號NGINX_COMMAND$2#命令&#xff0c;函數的第二個參數是腳本的第三個參數&#xff0c;即腳本的第三個參數是命令nginx_active(){ #獲…

percona-xtrabackup備份

#!/bin/bash # 需要安裝 percona-xtrabackup # xtrabackup: https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/ # xtrabackup 版本&#xff1a;2.4.24 (RPM安裝) # MySQL 版本: 5.7.36 (RPM安裝) # version: 22.01.17# 備份服務器 ip DB_BACKUP_SERVER"…

k8---proxy

kube-proxy 通過 Informer知道了Service、endpoints對象的創建&#xff0c;然后把service身上的CLUSTER-IP 和端口已經端點信息拿出來&#xff0c;創建iptable NAT規則做轉發或通過ipvs模塊創建VS服務器&#xff0c;這樣經過CLUSTER-IP的流量都被轉發到后端pod。 iptables模式 …

k8s--configmap

當卷中使用的ConfigMap被更新時&#xff0c;所投射的鍵最終也會被更新。kubelet組件會在每次周期性同步時檢查所掛載的ConfigMap是否為最新。 不過,kubelet使用的是其本地的高速緩存來獲得ConfigMap的當前值。 ConfigMap既可以通過watch操作實現內容傳播&#xff08;默認形式&…