set -e表示一旦腳本中有命令的返回值爲非0,則腳本當即退出,後續命令再也不執行; php
set -o pipefail表示在管道鏈接的命令序列中,只要有任何一個命令返回非0值,則整個管道返回非0值,即便最後一個命令返回0. linux
/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 運行的,用戶不必定登陸,只要以該用戶身份運行命令行就會讀取該文件。 服務器
變量 | 含義 |
---|---|
$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 的值。 |
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。 |
##拼接字符串 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
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用於備份默認的分隔符,使用完後將之恢復默認
function_name () { list of commands [ return value ] }若是你願意,也能夠在函數名前加上關鍵字 function:
function function_name () { list of commands [ return value ] }函數返回值,能夠顯式增長return語句;若是不加,會將最後一條命令運行結果做爲返回值。
##若是但願將 stdout 和 stderr 合併後重定向到 file,能夠這樣寫: $command > file 2>&1
將兩個 delimiter 之間的內容(document) 做爲輸入傳遞給 command。
command << delimiter document delimiter
$wc -l << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF
若是但願執行某個命令,但又不但願在屏幕上顯示輸出結果,那麼能夠將輸出重定向到 /dev/null:
把文件逐行讀入,以空格爲默認分隔符將每行切片,切開部分再進行各類分析處理。
當磁盤大小超過標準時會有報警提示,這時若是掌握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
#!/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做爲索引,來處理下一個須要處理的參數,記錄當前的狀態。
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才能看到