Shell related

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}}'"

 

最外面用 ", 里面直接用 ', 碰到 $ 要转义。

你可能感兴趣的:(shell)