歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux下Shell腳本編程

Linux下Shell腳本編程

日期:2017/3/1 9:27:09   编辑:SHELL編程

1、 shell腳本是什麼
它是一種腳本語言,並非編程語言。
可以使用一些邏輯判斷、循環等語法。
可以自定義子函數,是系統命令的集合。
shell腳本可以實現自動化運維,大大增加我們的工作效率。

2、shell腳本結構以及執行方法
開頭行指定bash路徑: #! /bin/bash
以#開頭的行作為解釋說明
#注釋自己的腳本內容,方便自己查閱;utf8字符集,支持中文;
腳本的名字以.sh結尾,用於區分這是一個shell腳本
執行腳本方式有兩種:
chmod a+x 1.sh 添加x執行權限;
./1.sh 可以直接執行,或者寫絕對路徑/root/shell/1.sh
如果沒有執行權限可以 bash 1.sh 或 sh 1.sh
bash -x 1.sh 可以查看腳本執行過程
實驗練習:
1234 [root@localhost shell]# cat 1.sh
#!/bin/bash
#這是我的第一個腳本
echo "hello world"

[root@localhost shell]# ls -l
-rw-r--r-- 1 root root 60 6月 16 19:28 1.sh
[root@localhost shell]# chmod a+x 1.sh
[root@localhost shell]# ls -l
-rwxr-xr-x 1 root root 60 6月 16 19:28 1.sh
[root@localhost shell]# ./1.sh
hello world
[root@localhost shell]# /root/shell/1.sh
hello world
[root@localhost shell]# /bin/sh 1.sh
hello world
[root@localhost shell]# bash -x 1.sh
+ echo 'hello world'
hello world

執行bash和sh是一樣的,sh是bash的軟連接文件;
[root@localhost ~]# ls -l /bin/bash
-rwxr-xr-x. 1 root root 871700 10月 16 2014 /bin/bash
[root@localhost ~]# ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 3月 4 00:59 /bin/sh -> bash

3、學會date命令的用法
date +%Y-%m-%d date +%y-%m-%d 年月日
date +%Y-%m-%d = date +%F 年月日
date +%H:%M:%S = date +%T 時間
date +%s 時間戳
date -d @1434248742 根據時間戳算出當前時間
date -d "+1day" 一天後 date -d "-1day" 一天前
date -d "-1month" 一月前
date -d “-1min” 一分鐘前
date +%w date +%W 星期


實驗練習:
[root@localhost shell]# date +%y
15
[root@localhost shell]# date +%Y
2015
[root@localhost shell]# date +%m
06
[root@localhost shell]# date +%d
16
[root@localhost shell]# date +%H
14
[root@localhost shell]# date +%M
01
[root@localhost shell]# date +%S
54

從1970年 01月01日0點0分開始算起到現在多少秒;
[root@localhost shell]# date +%s
1434434874
[root@localhost shell]# date -d @1434434874
2015年 06月 16日 星期二 14:07:54 CST

CST是中國時間 +8小時
[root@yonglinux shell]# date -d @0
1970年 01月 01日 星期四 08:00:00 CST

[root@localhost shell]# date +%F
2015-06-16
[root@localhost shell]# date +%T
14:04:17
[root@localhost shell]# date +%Y-%m-%d
2015-06-16
[root@localhost shell]# date +"%Y-%m-%d %H:%M:%S"
2015-06-16 14:05:13
[root@localhost shell]# date +"%F %T"
2015-06-16 14:05:38

周二

12 [root@localhost shell]# date +%w
2

今年的第多少周,24周

[root@localhost shell]# date +%W
24

全年有多少周,52周;
[root@localhost shell]# echo "365/7" | bc
52

[root@localhost shell]# date -d "-1 day"
2015年 06月 15日 星期一 14:16:31 CST
[root@localhost shell]# date -d "-1 day" +"%F %T"
2015-06-15 14:19:13
[root@localhost shell]# date -d "+1 day" +"%F %T"
2015-06-17 14:19:22
[root@localhost shell]# date -d "+1 month" +"%F %T"
2015-07-16 14:19:31
[root@localhost shell]# date -d "+1 year" +"%F %T"
2016-06-16 14:19:39
[root@localhost shell]# date -d "+1 week" +"%F %T"
2015-06-23 14:19:45
[root@localhost shell]# date -d "-10 hour" +"%F %T"
2015-06-16 04:19:59
[root@localhost shell]# date -d "-10 min" +"%F %T"
2015-06-16 14:10:15
[root@localhost shell]# date -d "-10 sec" +"%F %T"
2015-06-16 14:20:14

4、shell腳本中的變量
當腳本中使用某個字符串較頻繁並且字符串長度很長時就應該使用變量代替。
使用條件語句時,常常使用變量 if [ $a -gt 1 ]; then ... ; fi
引用某個命令的結果時,用變量替代 n=`wc -l 1.txt`
寫和用戶交互的腳本時,變量也是必不可少的 read -p "Input a number: " n; echo $n
如果沒寫這個n,可以直接使用$REPLY
內置變量 $0, $1, $2,$# $0表示腳本本身,$1 第一個參數,$2 第二個參數,$#表示參數的個數;
數學運算a=1;b=2; c=$(($a+$b)) 或者 c=$[$a+$b]

實驗練習:
引用某個命令的結果,使用變量代替
[root@localhost shell]# file=`which yum`
[root@localhost shell]# echo $file
/usr/bin/yum
[root@localhost shell]# rpm -qf $file
yum-3.2.29-60.el6.CentOS.noarch

變量只在當前shell下生效,子shell不會生效;
要想子shell也生效,使用export file 聲明變量;
用戶交互的變量:
[root@localhost shell]# cat 2.sh
#!/bin/bash
#與用戶交互的變量
read -p "請輸入一個數字:" num
echo $num
[root@localhost shell]# sh 2.sh
請輸入一個數字:333
333

參數的變量:
[root@localhost shell]# cat 3.sh
#!/bin/bash
#關於參數的變量
echo "\$1=$1"
echo "\$2=$2"
echo "\$3=$3"
echo "\$#=$#"
echo "\$0=$0"
[root@localhost shell]# sh 3.sh ABC linux world
$1=ABC
$2=linux
$3=world
$#=3
$0=3.sh

數值變量:
12345678910 [root@localhost shell]# a=1;b=2
[root@localhost shell]# c=$a+$b
[root@localhost shell]# echo $c
1+2
[root@localhost shell]# c=$[$a+$b]
[root@localhost shell]# echo $c
3
[root@localhost shell]# c=$(($a+$b))
[root@localhost shell]# echo $c
3

5、shell中的邏輯判斷
格式1:if 條件 ; then 語句; fi
格式2:if 條件; then 語句; else 語句; fi
格式3:if …; then … ;elif …; then …; else …; fi
邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等;注意到處都是空格。
可以使用 &&並且 || 或者 結合多個條件
大於>gt (greater than)
小於< lt (less than)
大於等於 >= ge
小於等於 <= le
等於 ==eq (equal)
不等於 != ne
實驗練習:
[root@localhost shell]# cat if.sh
#!/bin/bash
#if判斷語句,條件為真,打印true;
if :
then
echo true
fi
[root@localhost shell]# sh if.sh
true

if判斷語句2;
[root@localhost shell]# cat if2.sh
#!/bin/bash
#if判斷語句,條件為真,返回true;
if [ 1 == 1 ]
then
echo "true"
fi
[root@localhost shell]# sh -x if2.sh
+ '[' 1 == 1 ']'
+ echo true
true
[root@localhost shell]# sh if2.sh
true

if判斷語句3;

[root@localhost shell]# cat if3.sh
#!/bin/bash
#if判斷語句,條件為真返回true,條件為假,返回false;
if [ "1" == "2" ]
then
echo "true"
else
echo "false"
fi
[root@localhost shell]# sh if3.sh
false

變量,進行比較
[root@localhost shell]# cat if4.sh
#!/bin/bash
#if判斷語句,變量進行比較;
a=1
if [ "$a" == "2" ]
then
echo "true"
else
echo "false"
fi
[root@localhost shell]# sh -x if4.sh
+ a=1
+ '[' 1 == 2 ']'
+ echo false
false

多個判斷要加elif
[root@localhost shell]# cat if5.sh
#!/bin/bash
#if判斷語句,多個判斷使用elif;
a=1
if [ "$a" == "2" ]
then
echo "true"
elif [ "$a" -lt 10 ]
then
echo "no false"
else
echo "false"
fi
[root@localhost shell]# sh if5.sh
no false

[ $a -lt 3 ] 也可以這樣代替 (($a<3));使用方括號請一定注意空格;
1234 [root@localhost shell]# a=1;if(($a<3)); then echo OK;fi
OK
[root@localhost shell]# a=1;if [ $a -lt 3 ]; then echo OK;fi
OK

&& 並且 前面的執行成功後才執行後面的;
|| 或者 前面的執行不成功執行後面的;
12345 [root@localhost shell]# a=5
[root@localhost shell]# if [ $a -lt 10 ]&&[ $a -gt 2 ];then echo OK;fi
OK
[root@localhost shell]# if [ $a -lt 10 ]||[ $a -gt 2 ];then echo OK;fi
OK

奇數偶數判斷,輸入的數字除以2,余數為0為偶數,非0為奇數;
[root@yonglinux shell]# cat 4.sh
#!/bin/bash
read -p "enter a number:" n
n1=$[$n%2]
if [ $n1 -eq 0 ]
then
echo "你輸入的數字是偶數"
else
echo "你輸入的數字是奇數"
fi
[root@yonglinux shell]# sh 4.sh
enter a number:23
你輸入的數字是奇數
[root@yonglinux shell]# sh 4.sh
enter a number:90
你輸入的數字是偶數

判斷輸入的是否是數字,不是數字的直接退出;數字的話判斷奇數或偶數;
`echo $n|grep -c '[^0-9]'` 匹配輸入的字符為非數字的行數,如果為1說明不是數字。

[root@localhost shell]# cat 5.sh
#!/bin/bash
#判斷輸入的是否是數字,不是數字的直接退出;數字的話判斷是奇數或偶數;
read -p "請輸入一個數字:" n
n2=`echo $n|grep -c '[^0-9]'`
if [ $n2 -eq 1 ]
then
echo "你輸入的不是純數字,請重新輸入"
exit 1
fi
n1=$[$n%2]
if [ $n1 -eq 0 ]
then
echo "你輸入的數字是偶數"
else
echo "你輸入的數字是奇數"
fi

[root@localhost shell]# sh 5.sh
請輸入一個數字:abc
你輸入的不是純數字,請重新輸入
[root@localhost shell]# sh 5.sh
請輸入一個數字:323
你輸入的數字是奇數

6、if 判斷文件、目錄屬性
[ -f file ]判斷是否是普通文件,且存在
[ -d file ] 判斷是否是目錄,且存在
[ -e file ] 判斷文件或目錄是否存在
[ -r file ] 判斷文件是否可讀
[ -w file ] 判斷文件是否可寫
[ -x file ] 判斷文件是否可執行
實驗練習:

1.sh存在的話執行後面的
[root@localhost shell]# [ -f 1.sh ] && echo "1.sh exist"
1.sh exist

21.sh不存在執行後面的。
12 [root@localhost shell]# [ -f 21.sh ] || echo "1.sh not exist"
1.sh not exist

判斷文件是否存在
[root@localhost shell]# cat test.sh
#!/bin/bash
#判斷1.sh是否存在;
if [ -e 1.sh ]
then
echo "1.sh exist"
else
echo "1.sh not exist"
fi
[root@localhost shell]# sh test.sh
1.sh exist

exec的用法,結合date變量實驗
exec命令用於調用並執行指令的命令。exec命令通常用在shell腳本程序中,可以調用其他的命令。如果在當前終端中使用命令,則當指定的命令執行完畢後會立即退出終端。
[root@localhost shell]# cat date.sh
#!/bin/bash
#exec的用法,結合date變量實驗;
d=`date +%F`
exec >/tmp/$d.log 2>&1
echo "Begin at `date`"
ls /tmp/abc
cd /ddd
echo "End at `date`"

[root@localhost shell]# sh date.sh
[root@localhost shell]# cat /tmp/2015-06-16.log
Begin at 2015年 06月 16日 星期二 16:49:54 CST
ls: 無法訪問/tmp/abc: 沒有那個文件或目錄
date.sh: line 7: cd: /ddd: 沒有那個文件或目錄
End at 2015年 06月 16日 星期二 16:49:54 CST

exec >/tmp/$d.log 2>&1 表示執行下面的行,輸出正確或錯誤的信息都寫到/tmp/目錄下 日期.log裡面;

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-07/120405p2.htm

Copyright © Linux教程網 All Rights Reserved