$[ ] 表示形式告訴shell對方括號中的表達式求值
echo $[3+9]
賦值運算符
=,+=,-=,*=,/=,%=,&=,^=、|=,<<=,>>=
let count = $count + $change
let count += $change
cat longfile |more使用分頁
tee 命令把結果輸出到標准輸出,另一個副本輸出到相應文件
該命令一般用於管道之后 (一般看到輸出,並存文件)
合並標准輸出和標准錯誤
grep “standard” standard.txt >grep.out 2>&1
文件狀態測試
格式 test condition 或 [ condition ] 使用方括號時,要注意在條件兩邊加上空格。 |
文件測試狀態 :測試的結果可以用$?(上一個命令的返回值)的值來判斷,0表示成功,其他為失敗 |
-d 目錄 -s 文件長度大於0、非空 -f 正規文件 -w 可寫 -L 符號鏈接 -u 文件有suid位設置 -r 可讀 -x 可執行 -z 字符串為空 |
數值測試
格式 測試兩個數值大小
"number" numberic_operator "number"
或者
[ "number" numberic_operator "number" ]
numberic_operator可為:
-eq 數值相等。
-ne 數值不相等。
-gt 第一個數大於第二個數。
-lt 第一個數小於第二個數。
-le 第一個數小於等於第二個數。
-ge 第一個數大於等於第二個數。
語法1
if 條件
then 命令
fi
注意if語句必須以fi終止
練習:
#if test
if [ "13" -lt "12" ]; then # "13" 前一個空格,“13”后也有一個空格。
...to do
fi
CASE
#!/bin/bash
#case select
echo -n "enter a number from 1 to 3:"
read num
case $num in
1)
echo "you select 1"
;;
2)
echo "you select 2"
;;
3)
echo "you select 3"
;;
y|Y)
echo “you select y”
;;
*)
echo "`basename $0`:this is not between 1 and 3">&2
exit;
;;
esac
for
#!/bin/bash
start=`ipcs | sed -n '/共享內存段/='`
end=`ipcs | sed -n '/信號量數組/='`
for i in `ipcs | sed -n ${start},${end}p | grep slmax | awk '{print $2}'`
do
echo -e $i
done
until
#!/bin/sh
#until_mom 監控分區
Part="/backup"
Look_Out=`df | grep "$Part" | awk '{print $5}' | sed 's/%//g' `
echo $Look_Out;
until [ "$Look_Out" -gt "90" ]
do
echo -e "Filesystem $Part is nearly full " | mail root
Look_Out=`df | grep "$Part" | awk '{printf $5}' | sed 's/%//g' `
sleep 3600
done
while
#!/bin/bash
while echo -n "請輸入一個字符:";read ch
do
echo $ch
done
A\{3\}B AAAB
A\{3,\}B AAAB AAAAB ...
A\{3,5\}B AAAB AAAAB AAAAAB
行首以^匹配
行尾以$匹配
^$ 匹配空行
^.$ 匹配包含一個字符的行
使用\屏蔽一個特殊字符的含義
假定要匹配任意一個數字,可以使用:
[0123456789]
然而,通過使用“-”符號可以簡化操作:
[ 0 - 9 ]
或任意小寫字母
[ a - z ]
要匹配任意字母,則使用:
[ A - Z a - z ]
表明從A - Z、a - z的字母范圍。
如要匹配任意字母或數字,模式如下:
[ A - Z a - z 0 - 9 ]
在字符序列結合使用中,可以用 [ ]指出字符范圍。假定要匹配一單詞,以 s開頭,中間有
任意字母,以t結尾,那么操作如下:
s[a-z A-Z]t
[ou] .*t
匹配以字母o或u開頭,后跟任意一個字符任意次,並以t結尾的任意字母。
注意^符號的使用,當直接用在第一個括號里,意指否定或不匹配括號里內容。
[^a-zA-Z]匹配任一非字母型字符
[ ^ 0 - 9 ]匹配任一非數字
5.8使用\{\}匹配模式結果出現的次數
使用*可匹配所有匹配結果任意次,但如果只要指定次數,就應使用 \ { \ },此模式有三種 形式,即: pattern\{n\} 匹配模式出現n次。 pattern\{n,\} 匹配模式出現最少n次。 pattern\{n,m} 匹配模式出現n到m次之間,n , m為0 - 2 5 5中任意整數。 請看第一個例子,匹配字母A出現兩次,並以B結尾,操作如下: A \ { 2 \ } B ;A出現2次匹配值為A A B A \ { 4 , \ } B;匹配A至少4次 可以得結果A A A A B或A A A A A A A B,但不能為A A A B。 如給出出現次數范圍,例如A出現2次到4次之間: A \ { 2 , 4 \ } B 則結果為A A B、A A A B、A A A A B,而不是A B或A A A A A B等。
|
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}; 匹配IP地址 |
find -name *sh | xargs grep "done" -n 從當前目錄往下查找文件以sh結尾的,並且文件內容里有 "done"字符串,列出來並打印該字符串在第幾行
而grep一般只是篩選出上一次屏幕打印出來的內容
find -name *.sh | xargs grep "done" -n | awk -F":" '{print $1, "\t\t\t", $2}'
sed -n '2,5p' 打印第二到第五行
df | sed -n ${AAA},${BBB}p 有變量情況下的打印
sed -n $
sed -n '/關鍵字/=' 返回關鍵字所在的行數
sed -i 's/old/new/g' 把old替換成new
什么是socket?
socket可以看成是用戶進程與內核網絡協議棧的編程接口。
socket不僅可以用於本機的進程間通信,還可以用於網絡上不同主機的進程間通信。
IPv4套接口地址結構通常也稱為“網際套接字地址結構”,它以“sockaddr_in”命名,定義在頭文件<netinet/in.h>中
網絡字節序
X86平台一般為小端字節序,網絡一般為大端.我們發送數據的時候,一般要將發送的數據轉換為網絡字節序(大端),在接收的時候又要轉換回來.
字節序轉換函數
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
說明:在上述的函數中,h代表host;n代表network s代表short;l代表long
--------------------------------
地址轉換函數
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);