1. path & formated date
cd `dirname $0`
logFile=`pwd`/log/dailyWork_`date +%Y%m%d"_"%H%M%S`.log
2. 美元符 ($)
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示shell使用的当前选项。
$? 显示最后命令的推出状况。0表示没有错误。
$0 Shell本身的带相对路径的文件名
$1-9 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
dirname $0 显示相对路径
basename $0 显示文件名。
3. 压缩命令
* tar
压缩:
tar zcvf fileName.gz fileName
tar cvf fileName.tar fileName
解压:
tar zxvf fileName.gz [fileName]
tar xvf fileName.tar [fileName]
·gzip
* z 用 gzip 压缩
·zip
压缩:
zip fileName.zip fileName
解压:
unzip fileName.zip [fileName]
4. 并行与顺序执行
· 并行 (后台执行, 在后面加&):
iostat 1 100 > /tmp/iostat.txt &
vmstat 1 100 > /tmp/vmstat.txt &
· 顺序执行 (只需要用;隔开):
iostat 1 100 > /tmp/iostat.txt;
vmstat 1 100 > /tmp/vmstat.txt;
5. 批量执行
find . -name "*fileName*" -exec rm -f {} \;
=
find . -name "*fileName*" | xargs rm -f {};
=
find . -name "*fileName*" | xargs rm -f "";
6.bash 使用((...)) 命令和 $[...] 变量语法来进行算术运算
n=`echo "${n}+1" | bc`
或
((n++))
或
$[n++]
或
let n++
n=1; echo $((++n));
=
n=1; ((++n)); echo ${n}
a=5; ((a++)); 可將 $a 重定義為 6
7. ()和{}
A,()只是对一串命令重新开一个子shell进行执行
B,{}对一串命令在当前shell执行
C,()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
D,()最后一个命令可以不用分号
E,{}最后一个命令要用分号
F,{}的第一个命令和左括号之间必须要有一个空格
G,()里的各命令不必和括号有空格
H,()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
8. 命令替換
``
=
$()
``: 1. 容易跟单引号’ 混淆. 2. 可移植性强,几乎适合任何shell.
$(): 2. 直观, 2, 可移植性差, 有些shell不支持.
9. 變量替換: ${ }
echo $AB
=
Echo ${AB} -- Prefer
表达式含义
${var}变量var的值, 与$var相同
${var-DEFAULT}如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT}如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT}如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT}如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER}如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER}如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG}如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG}如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*}匹配之前所有以varprefix开头进行声明的变量
${!varprefix@}匹配之前所有以varprefix开头进行声明的变量
表达式含义
${#string}$string的长度
${string:position}在$string中, 从位置$position开始提取子串
${string:position:length}在$string中, 从位置$position开始提取长度为$length的子串
${string#substring}从变量$string的开头, 删除最短匹配$substring的子串
${string##substring}从变量$string的开头, 删除最长匹配$substring的子串
${string%substring}从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring}从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement}使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement}使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement}如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement}如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
假設我們定義了一個變量為:
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲得不同的值:
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個 . 及其左邊的字串:file.txt
${file##*.}:拿掉最後一個 . 及其左邊的字串:txt
${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
${file%.*}:拿掉最後一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
記憶的方法為:
# 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
% 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。
${file:0:5} :提取最左邊的 5 個字節:/dir1
${file:5:5} :提取第 5 個字節右邊的連續 5 個字節:/dir2
我們也可以對變量值裡的字串作替換:
${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt
利用 ${ } 還可針對不同的變數狀態賦值(沒設定、空值、非空值):
${file-my.file.txt} :假如 $file 沒有設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作處理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作處理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作處理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作處理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (非空值時不作處理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作處理)
${file:?my.file.txt} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)
tips:
以上的理解在於, 你一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態.
一般而言, : 與 null 有關, 若不帶 : 的話, null 不受影響, 若帶 : 則連 null 也受影響.
還有哦,${#var} 可計算出變量值的長度:
${#file} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個字節...
bash 的組數(array)處理方法。
一般而言,A="a b c def" 這樣的變量只是將 $A 替換為一個單一的字串,
但是改為A=(a b c def) ,則是將 $A 定義為組數...
bash 的組數替換方法可參考如下方法:
${A[@]} 或 ${A[*]}
可得到 a b c def (全部組數)
${A[0]}
可得到 a (第一個組數),${A[1]} 則為第二個組數...
${#A[@]} 或 ${#A[*]}
可得到 4 (全部組數數量)
${#A[0]}
可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度)
A[3]=xyz
則是將第四個組數重新定義為 xyz ...
10. 整數運算: $(( ))
在 bash 中,$(( )) 的整數運算符號大致有這些:
+ - * / :分別為 "加、減、乘、除"。
% :餘數運算
& | ^ !:分別為 "AND、OR、XOR、NOT" 運算。
在 $(( )) 中的變量名稱,可於其前面加 $ 符號來替換,也可以不用.
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( $a + $b * $c))
19
11. $@ 與 $*
#FileName: test
my_fun() {
echo "$#"
}
echo 'the number of parameter in "$@" is '$(my_fun "$@")
echo 'the number of parameter in "$*" is '$(my_fun "$*")
然后执行 ./test p1 p2, 输出:
the number of parameter in "$@" is 2
the number of parameter in "$*" is 1
12. Bash: logger
此命令会将message 写到文件 /var/log/message 中。
13. Replace template
msgTempalte=`cat file.template`;
awk -v msgTempalte="${msgTempalte}" -F, '{msg=msgTempalte; sub("{ACCOUNT}",$1,msg); sub("{NAME}",$2,msg); printf msg;}' file.data;
14. ssh 传递 command
ssh user@server "./checkMQM92 | grep QLOCAL | awk '{if(\$3>0){print \$1 " " \$3}}'"
最外面用 ", 里面直接用 ', 碰到 $ 要转义。