【linux】shell總結+查看系統版本+rsync+getopt+netstat

set -e表示一旦腳本中有命令的返回值爲非0,則腳本當即退出,後續命令再也不執行; php

set -o pipefail表示在管道鏈接的命令序列中,只要有任何一個命令返回非0值,則整個管道返回非0值,即便最後一個命令返回0. linux

bashrc和bash_profile

/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc很容易混淆,他們之間有什麼區別?它們的做用究竟是什麼? git

/etc/profile: 用來設置系統環境參數,好比$PATH. 這裏面的環境變量是對系統內全部用戶生效的。 正則表達式

/etc/bashrc:  這個文件設置系統bash shell相關的東西,對系統內全部用戶生效。只要用戶運行bash命令,那麼這裏面的東西就在起做用。 算法

~/.bash_profile: 用來設置一些環境變量,功能和/etc/profile 相似,可是這個是針對用戶來設定的,也就是說,你在/home/user1/.bash_profile 中設定了環境變量,那麼這個環境變量只針對 user1 這個用戶生效. shell

~/.bashrc: 做用相似於/etc/bashrc, 只是針對用戶本身而言,不對其餘用戶生效。 ubuntu

另外/etc/profile中設定的變量(全局)的能夠做用於任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承/etc/profile中的變量,他們是"父子"關係. 數組

~/.bash_profile 是交互式、login 方式進入 bash 運行的,意思是隻有用戶登陸時纔會生效。 bash

~/.bashrc 是交互式 non-login 方式進入 bash 運行的,用戶不必定登陸,只要以該用戶身份運行命令行就會讀取該文件。 服務器


shell 特殊字符

變量 含義
$0 當前腳本的文件名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的全部參數。
$@ 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。
$? 上個命令的退出狀態或函數的返回值。通常狀況下,大部分命令執行成功會返回 0,失敗返回 1。
$$

當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。

$!        Last program's PID.

$* 和 $@ 都表示傳遞給函數或腳本的全部參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出全部參數。可是當它們被雙引號(" ")包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出全部參數。

echo -e "Value of a is $a \n"#表示對轉義字符進行替換 
shell變量替換
形式 說明
${var} 變量原本的值
${var:-word} 若是變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值。
${var:=word} 若是變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word。
${var:?message} 若是變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標準錯誤輸出,能夠用來檢測變量 var 是否能夠被正常賦值。
若此替換出如今Shell腳本中,那麼腳本將中止運行。
${var:+word} 若是變量 var 被定義,那麼返回 word,但不改變 var 的值。

shell運算

Bash 支持不少運算符,包括算數運算符、關係運算符、布爾運算符、字符串運算符和文件測試運算符。

原生bash不支持簡單的數學運算,可是能夠經過其餘命令來實現,例如 awk 和 expr,

expr 只用於整數最經常使用。

awk 可用於小數運算


awk 'BEGIN{printf("%f\n",9.8/5.4)}'   ##1.8148153

awk 'BEGIN{printf("%0.4f\n",9.8/5.4)}'  ##1.8148

awk 'BEGIN{printf("%0.f\n",9.8/5.4)}'  ##2  四捨五入

awk 'BEGIN{printf("%f\n",9.8/4.4)}'  ##2.227273

awk 'BEGIN{printf("%0.f\n",9.8/4.4)}' ##2 四捨五入



算術運算符列表

運算符 說明 舉例
+ 加法 `expr $a + $b` 結果爲 30。
- 減法 `expr $a - $b` 結果爲 10。
* 乘法 `expr $a \* $b` 結果爲  200。
/ 除法 `expr $b / $a` 結果爲 2。
% 取餘 `expr $b % $a` 結果爲 0。
= 賦值 a=$b 將把變量 b 的值賦給 a。
== 相等。用於比較兩個數字,相同則返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用於比較兩個數字,不相同則返回 true。 [ $a != $b ] 返回 true。

【test】

關係運算符列表

運算符 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-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。

布爾運算符列表

運算符 說明 舉例
! 非運算,表達式爲 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。
字符串運算符列表
運算符 說明 舉例
= 檢測兩個字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測字符串長度是否爲0,爲0返回 true。 [ -z $a ] 返回 false。
-n 檢測字符串長度是否爲0,不爲0返回 true。 [ -z $a ] 返回 true。
str 檢測字符串是否爲空,不爲空返回 true。 [ $a ] 返回 true。

類名及等價的正則表達式   


[:alpha:] 匹配字母字符。[a-zA-Z] [[:alpha:]!]ab$匹配cab、dab和!ab。
[:alnum:] 匹配字母和數字字符。[0-9] [[:alnum:]]ab$匹配1ab、aab。
[:blank:] 匹配空格(space)和Tab字符。 [[:alnum:]]ab$匹配1ab、aab。
[:cntrl:] 匹配控制字符。  
[:digit:] 匹配數字字符。  
[:graph:] 匹配非空格字符。  
[:lower:] 匹配小寫字母字符。  
[:upper:] 匹配大寫字母字符。  
[:punct:] 匹配標點字符。  
[:space:] 匹配空白(whitespace)字符。  
[:xdigit:] 匹配十六進制數字。

文件測試運算符列表

操做符 說明 舉例
-b file 檢測文件是不是塊設備文件,若是是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是不是字符設備文件,若是是,則返回 true。 [ -b $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。


shell 字符串


  • 單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
  • 單引號字串中不能出現單引號(對單引號使用轉義符後也不行)。
  • 雙引號裏能夠有變量
  • 雙引號裏能夠出現轉義字符


##拼接字符串 
your_name="qinjx" 
greeting="hello, "$your_name" !" 
greeting_1="hello, ${your_name} !" 
echo $greeting $greeting_1


##輸出字符串長度 
string="abcd" 
echo ${#string} #輸出 4



##提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #輸出liba

shell數組

bash支持一維數組(不支持多維數組),而且沒有限定數組的大小。用括號來表示數組,數組元素用「空格」符號分割開。定義數組的通常形式爲:
    array_name=(value1 ... valuen)

或 單獨定義數組的各個份量array_name[0]=value1

讀取數組元素值的通常格式是:
    ${array_name[index]}

字符串轉數組:


a="one,two,three,four"
OLD_IFS="$IFS" 
IFS="," 
arr=($a) 
IFS="$OLD_IFS" 
for s in ${arr[@]} 
do 
    echo "$s" 
done

arr=($a)用於將字符串$a分割到數組$arr ${arr[0]} ${arr[1]} ... 分別存儲分割後的數組第1 2 ... 項 ,${arr[@]}存儲整個數組。變量$IFS存儲着分隔符,這裏咱們將其設爲逗號 "," OLD_IFS用於備份默認的分隔符,使用完後將之恢復默認


shell函數

Shell 函數的定義格式以下:
function_name () {
    list of commands
    [ return value ]
}
若是你願意,也能夠在函數名前加上關鍵字 function:
function function_name () {
    list of commands
    [ return value ]
}
函數返回值,能夠顯式增長return語句;若是不加,會將最後一條命令運行結果做爲返回值。


shell重定向

通常狀況下,每一個 Unix/Linux 命令運行時都會打開三個文件:
  • 標準輸入文件(stdin):stdin的文件描述符爲0,Unix程序默認從stdin讀取數據。
  • 標準輸出文件(stdout):stdout 的文件描述符爲1,Unix程序默認向stdout輸出數據。
  • 標準錯誤文件(stderr):stderr的文件描述符爲2,Unix程序會向stderr流中寫入錯誤信息。

##若是但願將 stdout 和 stderr 合併後重定向到 file,能夠這樣寫: $command > file 2>&1

Here Document

將兩個 delimiter 之間的內容(document) 做爲輸入傳遞給 command。

command << delimiter
    document
delimiter
  • 結尾的delimiter 必定要頂格寫,前面不能有任何字符,後面也不能有任何字符,包括空格和 tab 縮進。
  • 開始的delimiter先後的空格會被忽略掉。
$wc -l << EOF
    This is a simple lookup program
    for good (and bad) restaurants
    in Cape Town.
EOF

/dev/null

若是但願執行某個命令,但又不但願在屏幕上顯示輸出結果,那麼能夠將輸出重定向到 /dev/null:

【awk】

把文件逐行讀入,以空格爲默認分隔符將每行切片,切開部分再進行各類分析處理。

【du 和 df】

當磁盤大小超過標準時會有報警提示,這時若是掌握df和du命令是很是明智的選擇。

du: disc usage顯示每一個文件目錄的磁盤使用空間du是面向文件的命令,只計算被文件佔用的空間。不計算文件系統metadata 佔用的空間。

df則是基於文件系統整體來計算,經過文件系統中未分配空間來肯定系統中已經分配空間的大小。df命令能夠獲取硬盤佔用了多少空間,還剩下多少空間,它也能夠顯示全部文件系統對i節點和磁盤塊的使用狀況。

二者配合使用,很是有效。好比用df查看哪一個一級目錄過大,而後用du查看文件夾或文件的大小,如此即可迅速肯定癥結。

df命令能夠顯示目前全部文件系統的可用空間及使用情形

[yayug@yayu ~]$ df -h
Filesystem   Size  Used Avail Use% Mounted on
/dev/sda1    3.9G  300M  3.4G   8% /
/dev/sda7    100G  188M   95G   1% /data0
/dev/sdb1    133G   80G   47G  64% /data1
/dev/sda6    7.8G  218M  7.2G   3% /var
/dev/sda5    7.8G  166M  7.2G   3% /tmp
/dev/sda3    9.7G  2.5G  6.8G  27% /usr
tmpfs        2.0G     0  2.0G   0% /dev/shm

參數 -h 表示使用「Human-readable」的輸出,也就是在檔案系統大小使用 GB、MB 等易讀的格式。

第一個字段(Filesystem)及最後一個字段(Mounted on)分別是檔案系統及其掛入點。咱們能夠看到 /dev/sda1 這個分割區被掛在根目錄下。接下來的四個字段 Size、Used、Avail、及 Use% 分別是該分割區的容量、已使用的大小、剩下的大小、及使用的百分比。

du:查詢文件或文件夾的磁盤使用空間

若是當前目錄下文件和文件夾不少,使用不帶參數du的命令,能夠循環列出全部文件和文件夾所使用的空間。這對查看到底是那個地方過大是不利的,因此得指定深刻目錄的層數,參數:--max-depth=,這是個極爲有用的參數!以下,注意使用「*」,能夠獲得文件的使用空間大小.

[root@bsso yayu]# du -h --max-depth=1 work/testing
27M     work/testing/logs
35M     work/testing

[root@bsso yayu]# du -h --max-depth=1 work/testing/*
8.0K    work/testing/func.php
27M     work/testing/logs
8.1M    work/testing/nohup.out
8.0K    work/testing/testing_c.php
12K     work/testing/testing_func_reg.php
8.0K    work/testing/testing_get.php
8.0K    work/testing/testing_g.php
8.0K    work/testing/var.php

[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/
27M     work/testing/logs/

[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/*
24K     work/testing/logs/errdate.log_show.log
8.0K    work/testing/logs/pertime_show.log
27M     work/testing/logs/show.log

若是有一個進程在打開一個大文件的時候,這個大文件直接被rm 或者mv掉,則du會更新統計數值,df不會更新統計數值,仍是認爲空間沒有釋放。直到這個打開大文件的進程被Kill掉。

查看linux文件目錄的大小和文件夾包含的文件數

du [選項][文件]
-a或-all  顯示目錄中個別文件的大小。   
-b或-bytes  顯示目錄或文件大小時,以byte爲單位。   
-c或--total  除了顯示個別目錄或文件的大小外,同時也顯示全部目錄或文件的總和。 
-k或--kilobytes  以KB(1024bytes)爲單位輸出。
-m或--megabytes  以MB爲單位輸出。   
-s或--summarize  僅顯示總計,只列出最後加總的值。
-h或--human-readable  以K,M,G爲單位,提升信息的可讀性。
-x或--one-file-xystem  以一開始處理時的文件系統爲準,若趕上其它不一樣的文件系統目錄則略過。 
-L<符號連接>或--dereference<符號連接> 顯示選項中所指定符號連接的源文件大小。   
-S或--separate-dirs   顯示個別目錄的大小時,並不含其子目錄的大小。 
-X<文件>或--exclude-from=<文件>  在<文件>指定目錄或文件。   
--exclude=<目錄或文件>         略過指定的目錄或文件。    
-D或--dereference-args   顯示指定符號連接的源文件大小。   
-H或--si  與-h參數相同,可是K,M,G是以1000爲換算單位。   
-l或--count-links   重複計算硬件連接的文件。
du -sh xmldb/           //統計總數大小
du -sm * | sort -n      //統計當前目錄大小 並安大小排序
du -sk * | sort -n
du -sk * | grep guojf   //看一我的的大小
du -m | cut -d "/" -f 2 //看第二個/ 字符前的文字
du xmldb/               //查看此文件夾有多少文件
du xmldb/*/*/* |wc -l   //查看此文件夾/*/*/* 有多少文件
解釋:wc [-lmw]
 -l :多少行
 -m:多少字符
 -w:多少字
【grep】

默認的grep會搜索全部文件,包括隱藏文件夾下的文件。

grep的「--exclude-dir=參數」是爲了排除某個目錄的,因此能夠利用此參數去掉.repo/git的隱藏目錄。

若是每次都輸入--exclude-dir=參數,是否是很慢還容易出錯,下降效率呢?能夠把--exclude-dir=參數經過加入配置文件 ~/.bashrc (這是bash的當前用戶配置文件) 的方法來簡化操做,提升效率。在~/.bashrc文件的末尾添加如下命令:

export GREP_OPTIONS="--exclude-dir=\.svn"
而後保存,執行source ~/.bashrc或者. ~/.bashrc,使修改起做用。

而後搜索時,執行如下命令便可:

grep -nr MediaButton *

這樣默認就會加載GREP_OPTIONS選項,不搜索.svn目錄。

須要注意的是,GREP_OPTIONS這個關鍵詞不能修改成其餘的,不然系統就不會認爲是grep的一個選項參數了。

【查看系統版本】

$cat /proc/version
Linux version 3.11.0-15-generic (buildd@allspice) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014

$uname -a
Linux mtkswgap17 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$cat  /etc/issue
Ubuntu 12.04.4 LTS \n \l

$cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"

$sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:        12.04
Codename:       precise

僅僅查看內核版本
$uname -r
3.11.0-15-generic

# uname -a # 查看內核/操做系統/CPU信息 
# head -n 1 /etc/issue # 查看操做系統版本 
# cat /proc/cpuinfo # 查看CPU信息 
# hostname # 查看計算機名 
# lspci -tv # 列出全部PCI設備 
# lsusb -tv # 列出全部USB設備 
# lsmod # 列出加載的內核模塊 
# env # 查看環境變量資源 
# free -m # 查看內存使用量和交換區使用量 
# df -h # 查看各分區使用狀況 
# du -sh <目錄名> # 查看指定目錄的大小 
# grep MemTotal /proc/meminfo # 查看內存總量 
# grep MemFree /proc/meminfo # 查看空閒內存量 
# uptime # 查看系統運行時間、用戶數、負載 
# cat /proc/loadavg # 查看系統負載磁盤和分區 
# mount | column -t # 查看掛接的分區狀態 
# fdisk -l # 查看全部分區 
# swapon -s # 查看全部交換分區 
# hdparm -i /dev/hda # 查看磁盤參數(僅適用於IDE設備) 
# dmesg | grep IDE # 查看啓動時IDE設備檢測情況網絡 
# ifconfig # 查看全部網絡接口的屬性 
# iptables -L # 查看防火牆設置 
# route -n # 查看路由表 
# netstat -lntp # 查看全部監聽端口 
# netstat -antp # 查看全部已經創建的鏈接 
# netstat -s # 查看網絡統計信息進程 
# ps -ef # 查看全部進程 
# top # 實時顯示進程狀態用戶 
# w # 查看活動用戶 
# id <用戶名> # 查看指定用戶信息 
# last # 查看用戶登陸日誌 
# cut -d: -f1 /etc/passwd # 查看系統全部用戶 
# cut -d: -f1 /etc/group # 查看系統全部組 
# crontab -l # 查看當前用戶的計劃任務服務 
# chkconfig –list # 列出全部系統服務 
# chkconfig –list | grep on # 列出全部啓動的系統服務程序 
# rpm -qa # 查看全部安裝的軟件包

【linux .bash_profile】

若是一些程序沒有安裝在系統默認的路徑(ie /bin/, /usr/bin, /usr/local/bin/ )裏面,這個時候普通用戶想要調用這些命令,必須設定路徑。方法很簡單:以普通用戶登陸,而後在終端編輯.bash_profile,只要在export PATH前面加入本身的路徑便可,例如:

[yyc@localhost bin]$ vi ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:/usr/local/programs/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux-gnu/bin/
export PATH

【rsync】

rsync,remote synchronize

rsync參數的具體解釋以下

-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rlptgoD
-r, --recursive 對子目錄以遞歸模式處理
-R, --relative 使用相對路徑信息
-b, --backup 建立備份,也就是對於目的已經存在有一樣的文件名時,將老的文件從新命名爲~filename。可使用--suffix選項來指定不一樣的備份文件前綴。
--backup-dir 將備份文件(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份文件前綴
-u, --update 僅僅進行更新,也就是跳過全部已經存在於DST,而且文件時間晚於要備份的文件。(不覆蓋更新的文件)
-l, --links 保留軟鏈結
-L, --copy-links 想對待常規文件同樣處理軟鏈結
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹之外的鏈結
--safe-links 忽略指向SRC路徑目錄樹之外的鏈結
-H, --hard-links 保留硬鏈結
-p, --perms 保持文件權限
-o, --owner 保持文件屬主信息
-g, --group 保持文件屬組信息
-D, --devices 保持設備文件信息
-t, --times 保持文件時間信息
-S, --sparse 對稀疏文件進行特殊處理以節省DST的空間
-n, --dry-run現實哪些文件將被傳輸
-W, --whole-file 拷貝文件,不進行增量檢測
-x, --one-file-system 不要跨越文件系統邊界
-B, --block-size=SIZE 檢驗算法使用的塊尺寸,默認是700字節
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行數據同步
--rsync-path=PATH 指定遠程服務器上的rsync命令所在路徑信息
-C, --cvs-exclude 使用和CVS同樣的方法自動忽略文件,用來排除那些不但願傳輸的文件
--existing 僅僅更新那些已經存在於DST的文件,而不備份那些新建立的文件
--delete 刪除那些DST中SRC沒有的文件
--delete-excluded 一樣刪除接收端那些被該選項指定排除的文件
--delete-after 傳輸結束之後再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個文件
--partial 保留那些因故沒有徹底傳輸的文件,以是加快隨後的再次傳輸
--force 強制刪除目錄,即便不爲空
--numeric-ids 不將數字的用戶和組ID匹配爲用戶名和組名
--timeout=TIME IP超時時間,單位爲秒
-I, --ignore-times 不跳過那些有一樣的時間和長度的文件
--size-only 當決定是否要備份文件時,僅僅察看文件大小而不考慮文件時間
--modify-window=NUM 決定文件是否時間相同時使用的時間戳窗口,默認爲0
-T --temp-dir=DIR 在DIR中建立臨時文件
--compare-dest=DIR 一樣比較DIR中的文件來決定是否須要備份
-P 等同於 --partial
--progress 顯示備份過程
-z, --compress 對備份的文件在傳輸時進行壓縮處理
--exclude=PATTERN 指定排除不須要傳輸的文件模式
--include=PATTERN 指定不排除而須要傳輸的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 綁定到特定的地址
--config=FILE 指定其餘的配置文件,不使用默認的rsyncd.conf文件
--port=PORT 指定其餘的rsync服務端口
--blocking-io 對遠程shell使用阻塞IO
-stats 給出某些文件的傳輸狀態
--progress 在傳輸時現實傳輸過程
--log-format=formAT 指定日誌文件格式
--password-file=FILE 從FILE中獲得密碼
--bwlimit=KBPS 限制I/O帶寬,KBytes per second
-h, --help 顯示幫助信息
rsync -a -l -t -r --delete --force src dest
rsync -vazu -progress terry@192.168.100.21:/terry/ /home

【getopts】


#!/bin/sh
#說明
show_usage="args: [-i , -p , -u , -w , -a , -s , -d , -v ]\
                  [--ip=, --port=, --user=, --pwd=, --path=, --script=, --debug=, --version=]"
#參數
opt_ip=""
opt_port=""
opt_user=""
opt_pwd=""
opt_path=""
opt_script=""
opt_debug=""
opt_version=""
GETOPT_ARGS=`getopt -o i:p:u:w:a:s:d:v: -al ip:,port:,user:,pwd:,path:,script:,debug:,version: -- "$@"`
eval set -- "$GETOPT_ARGS"
#獲取參數
while [ -n "$1" ]
do
    case "$1" in
        -i|--ip) opt_ip=$2; shift 2;;
        -p|--port) opt_port=$2; shift 2;;
        -u|--user) opt_user=$2; shift 2;;
        -w|--pwd) opt_pwd=$2; shift 2;;
        -a|--path) opt_path=$2; shift 2;;
        -s|--script) opt_script=$2; shift 2;;
        -d|--debug) opt_debug=$2; shift 2;;
        -v|--version) opt_version=$2; shift 2;;
        --) break ;;
        *) echo $1,$2,$show_usage; break ;;
    esac
done
 
if [[ -z $opt_ip || -z $opt_port || -z $opt_user || -z $opt_pwd || -z $opt_path || -z $opt_script || -z $opt_debug || -z $opt_version ]]; then
    echo $show_usage
    echo "opt_ip:"$opt_ip",opt_port:"$opt_port",opt_user:"$opt_user",opt_pwd:"$opt_pwd",opt_path:"$opt_path",opt_script:"$opt_script",opt_debug:"$opt_debug",opt_version:"$opt_version
    exit 0
fi
 
#開始處理
#ip port user pwd 鏈接服務器
#script path debug version 做爲參數執行



有幾個關鍵會被忽略致使失敗的地方:

eval set -- "$GETOPT_ARGS" eval關鍵字是必須的,網上好多例子沒有,坑爹

GETOPT_ARGS=`getopt -o i:p:u:w:a:s:d:v: -al ip:,port:,user:,pwd:,path:,script:,debug:,version: -- "$@"`

最後的--也是必須的,網上好多例子也沒有,坑爹

或者下面這種方式
while getopts "c:h:p:u:d:o:m:s:rk" arg
do
    case $arg in
        c) cmd="${OPTARG}";;
        h) host="${OPTARG}";;
        p) port="${OPTARG}";;
        u) user="${OPTARG}";;
        d) dbname="${OPTARG}";;
        o) outfile="${OPTARG}";;
        m) monitor="${OPTARG}";;
        r) rebuild="true";;
    esac
done



OPTIND:getopts使用OPTIND做爲索引,來處理下一個須要處理的參數,記錄當前的狀態。

OPTARG:在上面的循環中,a,b兩個參數後面各有一個冒號,冒號表示該輸入的參數後面還有一個參數值,當getopts發現冒號後,會處理用戶輸入的參數值,這個參數值被保存在OPTARG中。
OPTSTRING:也就是上例中的 :a:b:cdefg,getopts須要處理的參數。注意,最前面的冒號「:」用於指定getopts工做於silent mode,在silent模式下,當用戶輸入的參數不知足OPTSTRING時,不會講illegal option這樣的錯誤信息打印出來,使代碼看起來更加專業。若是想要工做在verbose模式下,能夠去掉最前面的冒號

【netstat】

netstat -tnlp |grep 80


-a (all)顯示全部選項,默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的所有轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態

-p 顯示創建相關連接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。

提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到

相關文章
相關標籤/搜索