1.什么是shell腳本
首先它是一個腳本,并不能作為正式的編程語言。因為是跑在linux的shell中,所以叫shell腳本。確切的說shell腳本就是一些命令的集合。
2.寫腳本前的一些細節及建議
Shell腳本通常都是以.sh 為后綴名的,這個并不是說不帶.sh這個腳本就不能執行,只是大家的一個習慣而已。所以,以后你發現了.sh為后綴的文件那么它可能是一個shell腳本了。test.sh中第一行要以 “#! /bin/bash” 開頭,它代表的意思是,該文件使用的是bash語法。如果不設置該行,雖然你的shell腳本也可以執行,但是這不符合規范。 # 表示注釋。后面跟一些該腳本的相關注釋內容以及作者和創建日期或者版本等等。當然這些注釋并非必須的,如果你懶的很,可以省略掉,但是我們不建議省略。因為隨著工作時間的逐漸過渡,你寫的shell腳本也會越來越多,如果有一天你回頭查看自己寫過的某個腳本時,很有可能忘記該腳本是用來干什么的以及什么時候寫的。所以寫上注釋是有必要的。另外系統管理員并非只有你一個,如果是其他管理員查看你的腳本,他看不懂豈不是很郁悶。
3.shell腳本編程基礎
3.1 基本數學運算
[root@localhost sbin]# vim first.sh
[root@localhost sbin]# bash first.sh 5 6
11
[root@localhost sbin]# cat first.sh
#! /bin/bash
##This is my first shell script
##Writen by zhangliang 2016-08-10
echo $[ $1+$2 ]
[root@localhost sbin]#
其中腳本中的$1和$2為shell腳本的預設變量,沒有限制的。$0代表腳本本身的名字。
[root@localhost sbin]# sh first.sh 1 2
1 2 first.sh
[root@localhost sbin]# cat first.sh
#! /bin/bash
##This is my first shell script
##Writen by zhangliang 2016-08-10
echo "$1 $2 $0"
上部中的“sh first.sh 1 2”命令其實一般需要有執行權限x 如沒有則可用# chmod + first.sh來添加。
3.2命令date
實例 一.Y表示四位數字格式打印年份 y表示兩位數字格式打印年份 其他的則為英文單詞開頭字母大寫
[root@localhost sbin]# date +"%Y-%m-%d %H:%M:%S"
2016-08-11 19:07:24
二. 表示前一天的日期:
[root@localhost sbin]# date -d "-1 day" +%d
10
3.3參數前移
[root@localhost sbin]# vim shift.sh
[root@localhost sbin]# sh -x shift.sh 由此可知shift命令每執行一次,變量的個數($#)
+ '[' 0 -eq 0 ']'
[root@localhost sbin]# sh -x shift.sh 1 2 3 4 減一, 變量值提前一位。
+ '[' 4 -eq 0 ']'
+ echo
+ shift
+ '[' 3 -eq 0 ']' + echo
+ shift
+ '[' 2 -eq 0 ']'
+ echo
+ shift
+ '[' 1 -eq 0 ']'
+ echo
+ shift
+ '[' 0 -eq 0 ']'
[root@localhost sbin]# vim shift.sh
[root@localhost sbin]# cat shift.sh
3.4如何計在shell腳本中錨定計數空格行
[root@localhost sbin]#
[root@localhost sbin]# vim konghang.sh
[root@localhost sbin]# bash konghang.sh /etc/fstab /etc/issue
Total blank lines: 2
shift命令還有另外一個重要用途,Bsh定義了9個位置變量,從$1到$9,這并不意味著用戶在命令行只能使用9個 參數,借助shift命令可以訪問多于9個的參數。
4實戰演練
4.1計算1+2+3+…+100的值
4.2寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個 數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不 小于1,則顯示第一個參數所指向的文件中的空白行數
#! /bin/bash
## writer:zhangliang 2016-8-13
[[ $# -lt 1 ]] && echo "less input one num" || (grep '^$' | wc -l)
[root@localhost sbin]# bash argsnum.sh /etc/rc.d/init.d/function
105
[root@localhost sbin]# bash argsnum.sh
less input one num
4.3編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值
#! /bin/bash
##wrtrer hangliang 2016-8-13
max='df' |tr -s '' '%'|cut -d '%' -f5|sort -n|tial -1'
echo "list the maxdisk liyonglu: $max"
[root@localhost sbin]# ./disk.sh
list the disk liyonglu: 52
4.4.使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添 加之;顯示添加的用戶的id號等信息
#! /bin/bash
##writerzhangliang:2016-08-12 11:09:20
read -p "please input a username: " USERNAME
#`id $USERNAM` &> /dev/null
if id $USERNAME &> /dev/null ; then
echo "the user exist"
exit 100
else
useradd $USERNAME &> /dev/null
echo "the user add sucessfully and its info is:`id $USERNAME`"
exit 99
fi
unset USERNAME
5小結
由前面例題及小題,深有體會前面學的正則表達式grep,sed工具的重要性
grep語法: grep [-cinvABC] 'word' filename
-c :打印符合要求的行數
-i :忽略大小寫 -n :在輸出符合要求的行的同時連同行號一起輸出
-v :打印不符合要求的行
. 正則表達式中, “^” 表示行的開始, “$” 表示行的結尾,那么空行則可以用 “^$” 表示
. 如果是數字的話就用[0-9]這樣的形式,當然有時候也可以用這樣的形式[15]即 只含有1或者5,注意,它不會認為是15。如果要過濾出數字以及大小寫字母則 要這樣寫[0-9a-zA-Z]。另外[ ]還有一種形式,就是[^字符] 表示除[ ]內的字 符之外的字符
. 表示任意一個字符,上例中,就是把符合r與o之間有兩個任意字符的行過濾出 來, *
表示零個或多個前面的字符。 ‘.*’ 表示零個或多個任意字符,空行也包 含在內.
. 用( )表示一個整體,例如(oo)+就表示1個 ‘oo’ 或者多個 ‘oo’
sed與grep有些相通 ,sed -e可以實現多個行為;‘d’ 這個字符就是刪除的動 作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字符的 行,另外還可以刪除從某一行一直到文檔末行; ‘s’ 就是替換的命令, ‘g’ 為本 行中全局替換,如果不加 ‘g’ 只換該行中出現的第一個。除了可以使用 ‘/’ 作為 分隔符外,還可以使用其他特殊字符例如 ‘#’ 或者 ‘@’ 都沒有問題。[0-9]表 示任意的數字。這里你也可以寫成[a-zA-Z]甚至[0-9a-zA-Z]; () 可以把替換 的字符括起來成為一個整體。
原創文章,作者:Zzuimeng,如若轉載,請注明出處:http://www.www58058.com/34596