shell腳本的基礎

shell腳本的基礎

            shell 基本語法

            變量

 

 

什麼是shell

 

先看一個簡單的shell程序

[root@centos-6-1~]# cat linux.sh      #查看linux.sh文件內容
#!/bin/bash

echo -e "\e[1;31m linuxtouch  \e[0m"   #紅色字體輸出 linuxtouch
[root@centos-6-1 ~]# sh linux.sh
 linuxtouch 
[root@centos-6-1 ~]#

 

shell編程語言

編程語言:

1.         低級語言

 機器語言:二進制語言

 彙編語言:符號語言,使用助記符來代替操作碼,也就是用符號代替機器語言的二進制碼;彙編程序把彙編語言翻譯成機器語言的過程我們稱爲彙編

 它們都是面向機器的語言

 

1.         高級語言

它是比較接近自然語言或者說人類語言的一種編程,用人們能夠容易理解的方式進行編寫程序

 靜態語言:編譯型語言 c c++ java

 

1.         動態語言:解釋型語言 php shellpython perl

 編譯器:(解釋器)將人類理解的語言翻譯成機器理解的語言

簡單來說,最簡單的SHELL就是一個由命令列表構成的可執行的文件。

 

 

命令解釋器

 

BASE SHELL腳本的第一行以 #!
我們通常稱它爲sha-bang,這種表示法在技術上稱爲幻數模式。它表示文件是可執行的shell腳本。後面的路徑名稱是命令解釋器,也就是應用於執行腳本的程序。

 #!/bin/bash** **作用:告訴腳本使用的是哪種命令解釋器。如不指shell,以當前shell作爲執行的shell

 shell中以#開始頭表示整個行就被當作一個註釋。執行時被忽略。

 shell程序一般以.sh結尾,當然主要是看是否爲執行,然後看裏面有沒有#

 不是隻有*.sh的文件就可以執行,普通文件也可以

 

腳本的執行方式:

Shell腳本的執行通常有以下幾種執行方式:

1.         bash script-namesh script-name (可以沒有執行權限)

2.         path/script-name ./script-name(當前路徑下執行腳本要有執行權限)

3.         source script-name (可以沒有執行權限)

4.         sh < script-name catscript-name | sh(同樣適用於bash)

1.第一種執行方式:

[root@centos-6-1~]# bash linux.sh
 linuxtouch 
[root@centos-6-1 ~]# ll -h linux.sh
-rw-r--r--. 1 root root 51 7  20 14:42 linux.sh
[root@centos-6-1 ~]#

2.第二種執行方式:

[root@centos-6-1~]# ./linux.sh
-bash: ./linux.sh: 權限不夠
[root@centos-6-1 ~]# chmod +x linux.sh
[root@centos-6-1 ~]# ./linux.sh
 linuxtouch 
[root@centos-6-1 ~]# ll -h linux.sh
-rwxr-xr-x. 1 root root 51 7  20 14:42 linux.sh
[root@centos-6-1 ~]#

3.第三種執行方式:

[root@centos-6-1~]# source linux.sh
 linuxtouch 
[root@centos-6-1 ~]# ll -h linux.sh
-rw-r--r--. 1 root root 51 7  20 14:42 linux.sh
[root@centos-6-1 ~]#

4.第四種執行方式:

[root@centos-6-1~]# sh linux.sh
 linuxtouch 
You have new mail in /var/spool/mail/root
[root@centos-6-1 ~]# ll -h linux.sh
-rw-r--r--. 1 root root 51 7  20 14:42 linux.sh
[root@centos-6-1 ~]#

 

總結

1腳本的執行順序是從上到下,從左到右執行的

2腳本里內容,可以理解爲:好多單個命令集合,複雜一點腳本就是加上它自己的一些語法

 

創建shell程序的步驟:

第一步:創建一個包含命令和控制結構的shell文件。

第二步:修改這個文件的權限使它可以執行。使用chmod u+x

chmod u+x 就是此文件的主用戶給予執行的權限

第三步:執行

 

shell變量及運用


 

 變量是shell 傳遞數據的一種方法。變量是用來代表每個值的符號名。我們可以把變量當成一個容器,腳本可以在內存中存儲數據,然後通過變量。就可以在腳本執行中進行修改和訪問存儲的數據

注意:

1變量名稱通常是大寫字母,它可以由數字、字母(大小寫)和下劃線_組成。但是大家要注意變量名稱不能以數字開頭

2等號 = 用於爲變量分配值,在使用過程中等號兩邊不能有空格

3變量存儲的數據類型是整數值和字符串值

4在對變量賦於字符串值時,建議大家用引號將其括起來。因爲如果字符串中存在空格隔符號。BASH會把空格字符解釋爲單詞分隔管符

5要對變量進行調用,可以在變量名稱前加美元符號$

 

BASESHELL的擴展功能:我們最常見的就是擴展變量值和命令替換和算術擴展

6spacer.gif{name}的簡化版本,但是在某些情況下,還必須使用花括號引起的方式來消除歧義並避免意外的結果

7命令的替換就是將命令的調用替換爲執行命令後的結果的輸出,它的使用方式:我們將命令括在反引號中舊形式來調用命令結果,(新形式)是使用$()語法

8在命令替換中,使用新語法$(),它允許進行嵌套命令替換

9進行算術擴展時使用$[]進行,同時它也允許算術替換

 

Shell 有兩類變量:局部變量和全局變量。

1)局部變量:是shell 程序內部定義的,其使用範圍僅限於定義它的程序,對其它程序不可見。

 用戶自定義的腳本中的變量,它會隨着腳本的執行結束而結束

 在用戶的配置文件當中定義的環境變量,這個變量是會一直跟着用戶存在,直到這個用戶退出

2)全局變量:是環境變量,其值不隨shell 腳本的執行結束而消失。

 

$PATH

作用:運行某個命令的時候,本地查找不到某個命令或文件,會到這個聲明的目錄中去查找。

[root@centos-6-1~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos-6-1 ~]#

 

3)用戶定義變量

由字母或下劃線打頭,不允許數字開頭,後面由字母、數字或下劃線組成,並且大小寫字母意義不同。變量名長度沒有限制。

 

使用變量值時,要在變量名前加上前綴“$”

[root@centos-6-1~]# a=123
[root@centos-6-1 ~]# echo $a
123
[root@centos-6-1 ~]#

 

輸出linuxtouch.blog.51cto.com必須用三個變量來輸出

[root@centos-6-1~]# a=linuxtouch
[root@centos-6-1 ~]# b=.blog.
[root@centos-6-1 ~]# c=51cto.com
You have new mail in /var/spool/mail/root
[root@centos-6-1 ~]# echo $a$b$c
linuxtouch.blog.51cto.com
[root@centos-6-1 ~]#

 

主要賦值類型

 

1)變量賦值:賦值號“=”兩邊應沒有空格。

“=”對變量賦值

[root@centos-6-1~]# A=123456
[root@centos-6-1 ~]# A = 123456
bash: A: command not found
[root@centos-6-1 ~]#

 

2)將一個命令的執行結果賦給變量

兩種命令替換方式一種是反引號:`` 一種是$() ,其中反引號是不允許嵌套使用。後面的這個可以

 

[root@centos-6-1tmp]# file=`find  /root/ -type f`
[root@centos-6-1 tmp]# tar cvf a.tar $file
tar: 從成員名中刪除開頭的“/”
/root/.tcshrc
/root/.bash_history
/root/install.log.syslog
/root/.bashrc
/root/backup.sh
/root/.cshrc
/root/.viminfo
/root/install.log
/root/linux.sh
/root/.bash_logout
/root/aaa
/root/.mysql_history
/root/shuiguo
/root/.Xauthority
/root/qwer
/root/anaconda-ks.cfg
/root/abc
/root/bbb
/root/.bash_profile
[root@centos-6-1 tmp]# ls
a.tar          yum.log                                  yum_save_tx-2017-07-05-16-47i3c1NX.yumtx
crontab.cCtjgV yum_save_tx-2017-06-28-21-593muryN.yumtx
[root@centos-6-1 tmp]#

 

[root@centos-6-1tmp]# OUTFILE=$(tar -cvf /tmp/a.tar $(find /root -type f))
tar: 從成員名中刪除開頭的“/”
[root@centos-6-1 tmp]# echo $OUTFILE
/root/.tcshrc /root/.bash_history/root/install.log.syslog /root/.bashrc /root/backup.sh /root/.cshrc/root/.viminfo /root/install.log /root/linux.sh /root/.bash_logout /root/aaa/root/.mysql_history /root/shuiguo /root/.Xauthority /root/qwer/root/anaconda-ks.cfg /root/abc /root/bbb /root/.bash_profile
[root@centos-6-1 tmp]# ls /tmp/a.tar
/tmp/a.tar
You have new mail in /var/spool/mail/root
[root@centos-6-1 tmp]#

 

可以利用變量和其它字符組成一個新的字符串

[root@centos-6-1~]# echo "$a"aaa
/linux/touch/aaa
[root@centos-6-1 ~]#

 

 

給變量賦值多個單詞

[root@centos-6-1~]#
[root@centos-6-1 ~]# name=linux
[root@centos-6-1 ~]# echo $name
linux
[root@centos-6-1 ~]# name=touch
[root@centos-6-1 ~]# echo $name
touch
[root@centos-6-1 ~]#

 

 

賦值時“ ” ‘ ’的區別

[root@centos-6-1~]# echo "hehehe  $name"
hehehe  touch
You have new mail in /var/spool/mail/root
[root@centos-6-1 ~]# echo 'hehehe  $name'
hehehe  $name
[root@centos-6-1 ~]#

總結:

            單引號:之間的內容原封不動地指定給了變量。

            雙引號:特殊符號的含義保留。

 

變量與符號的綜合演示

[root@centos-6-1~]# a=aaa
[root@centos-6-1 ~]# echo "a=$a"
a=aaa
[root@centos-6-1 ~]# b='bbb'
[root@centos-6-1 ~]# echo "b=$b"
b=bbb
[root@centos-6-1 ~]# echo 'b=$b'
b=$b
You have new mail in /var/spool/mail/root
[root@centos-6-1 ~]# c="ccc"
[root@centos-6-1 ~]# echo "c=${c}"
c=ccc
[root@centos-6-1 ~]#

 

 

把命令當做變量進行定義

[root@centos-6-1~]# linux=`date +%F`     #利用反引號進行定義
[root@centos-6-1 ~]# echo $linux
2017-07-20
[root@centos-6-1 ~]# linux=$(date)        #利用小括號進行定義,小括號可以進行嵌套
You have new mail in /var/spool/mail/root
[root@centos-6-1 ~]# echo $linux
2017 07 20星期四 16:22:07 CST
[root@centos-6-1 ~]#

 

對變量的管理

 

set命令,例:

[root@centos-6-1~]#
[root@centos-6-1 ~]# name=touch
[root@centos-6-1 ~]# set | grep name
name=touch
[root@centos-6-1 ~]#

 

刪除變量


[root@centos-6-1 ~]# unset name
[root@centos-6-1 ~]# set | grep name
_=name
[root@centos-6-1 ~]# echo $name

You have new mail in /var/spool/mail/root
[root@centos-6-1 ~]#

 

 

位置變量和特殊變量


 

Shell解釋執行用戶的命令時,將命令行的第一個字作爲命令名,而其它字作爲參數。由出現在命令行上的位置確定的參數稱爲位置參數。

使用$N 來表示

$0 獲取當前執行shell腳本的文件文件名,包括腳本路徑

$n 獲取當前腳本的第n個參數n=0,1,2.....n n大於9{n}表示。

 

傳遞參數:

[root@centos-6-1~]# cat 8.sh
#!/bin/bash
# author:touch
echo "----------------------"
echo "Shell 傳遞參數實例!";
echo "執行的文件名:$0";
echo "第一個參數爲:$1";
echo "第二個參數爲:$2";
echo "第三個參數爲:$3";
echo "----------------------"

[root@centos-6-1 ~]# sh 8.sh linux touch  blog
----------------------
Shell 傳遞參數實例!
執行的文件名:8.sh
第一個參數爲:linux
第二個參數爲:touch
第三個參數爲:blog
----------------------
[root@centos-6-1 ~]#

 

 

特殊變量

 有些變量是一開始執行Script腳本時就會設定,且不能被修改,但我們不叫它只讀的系統變量,而叫它特殊變量。這些變量當一執行程序時就有了,以下是一些特殊變量:

 

$*

以一個單字符串顯示所有向腳本傳遞的參數;如“$*” ['']括起來的情況,以1 2 ...n”的形式輸出所有參數

$#

傳遞到腳本的參數個數

$@

$*相同,但是使用時加引號,並在引號中返回每個參數  "$@"用「"」括起來的情況、以"$1"   "$2" … "$n" 的形式輸出所有參數

$$

這個程序的PID

$?

顯示最後命令的退出狀態;0表示沒有錯誤,其他任何值表明有錯誤

$!

上一個後臺進程的ID

 

[root@CentOS6-node1~]# cat a.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo "腳本名字"
echo $0
echo "腳本參數個數"
echo "the number of values is $#"
echo "腳本參數列表"
echo  $*
echo "腳本參數列表"
echo  $@
echo "上一次執行結果的狀態碼"
echo  $? 
echo "這個程序的PID"
echo $$

[root@CentOS6-node1 ~]#


#執行結果

[root@CentOS6-node1 ~]# sh a.sh 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
腳本名字
a.sh
腳本參數個數
the number of values is 9
腳本參數列表
1 2 3 4 5 6 7 8 9
腳本參數列表
1 2 3 4 5 6 7 8 9
上一次執行結果的狀態碼
0
這個程序的PID
3509
[root@CentOS6-node1 ~]#

 

注意:spacer.gif@ 區別

相同點:都是引用所有參數。

不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 123,,則 " * " 等價於 "1 2 3"(傳遞了一個參數),而 "@" 等價於 "1""2" "3"(傳遞了三個參數)

 

[root@CentOS6-node1~]# cat ab.sh
echo $0
dirname $0
basename $0

[root@CentOS6-node1 ~]#

[root@CentOS6-node1 ~]# sh ab.sh
ab.sh         #執行的全路徑
.             #執行的目錄
ab.sh         #執行的文件名
[root@CentOS6-node1 ~]#

 

case"$1" in      ##相當於執行/etc/init.d/vsftpd  $1
  start)
        start
        #當選擇start調用start函數來啓動服務
        ;;

   stop)
        #當選擇stop調用stop函數來停止服務
        stop
        ;;
  status)
        status-p ${pidfile} $httpd
       RETVAL=$?
        ;;
  restart)
        stop
        start
        ;;
        #當選擇restart或者reload先停止服務在啓動服務
 condrestart|try-restart)
        ifstatus -p ${pidfile} $httpd >&/dev/null; then
               stop
               start
        fi
        ;;
 force-reload|reload)
        reload
        ;;
 graceful|help|configtest|fullstatus)
       $apachectl $@
       RETVAL=$?
        ;;
  *)
        echo$"Usage: $prog{start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
        RETVAL=2
esac

 

當輸出的$1不存在時,利用¥0來打印當前的執行腳本的方法

 

變量的數值計算


 

用於執行簡單的整數運算

格式:$((算數運算符))

((表達式1,表達式2…))

 

特點:

1.         在雙括號結構中,所有表達式可以像c語言一樣,如:a++,b--等。a++ 等價於 a=a+1

2.         在雙括號結構中,所有變量可以不加入:“$”符號前綴。

3.         雙括號可以進行邏輯運算,四則運算

4.         雙括號結構擴展了forwhile,if條件測試運算

5.         支持多個表達式運算,各個表達式之間用分開

常用的算數運算符

 

運算符

意義

++ --

遞增及遞減,可前置也可以後置

+ - ! ~

一元運算的正負號邏輯與取反

+ - * / %

加減乘除與餘數

< <= > >=

比較大小符號

== !=

相等不相等

>> <<

向左位移向右位移

& ^ |

位的與位的異或位的或

&& ||

邏輯與邏輯或

:

條件判斷

 

三種簡單的賦值運算

[root@CentOS6-node1touch]# ((a=1+2**3-4%3))
[root@CentOS6-node1 touch]# echo $a
8
[root@CentOS6-node1 touch]#


[root@CentOS6-node1 touch]# b=$((a=1+2**3-4%3))
[root@CentOS6-node1 touch]# echo  $b
8
[root@CentOS6-node1 touch]#

[root@CentOS6-node1 touch]# echo $((a=1+2**3-4%3))
8
[root@CentOS6-node1 touch]#
#省去一個定義變量

 

遞增\遞減的應用

[root@CentOS6-node1touch]# echo $((a+=1))   #每次遞增+1
9
[root@CentOS6-node1 touch]#

[root@CentOS6-node1 touch]# echo $((a++))    #每次遞增+1
10
[root@CentOS6-node1 touch]#

[root@CentOS6-node1 touch]# echo $((a--))  #每次遞減-1
8
[root@CentOS6-node1 touch]#

[root@CentOS6-node1 touch]# echo $a
#a++a--爲先賦值a1a1
7

[root@CentOS6-node1 touch]# echo $((a++))
6
[root@CentOS6-node1 touch]# echo $((a++))
7
[root@CentOS6-node1 touch]# echo $a
8
[root@CentOS6-node1 touch]#




[root@CentOS6-node1 touch]# echo $((--a))
6
[root@CentOS6-node1 touch]# echo $a   
6
#--a++a爲先a1a1 再進行a的賦值

 

比較大小

[root@CentOS6-node1touch]# echo $((1>2))
0
[root@CentOS6-node1 touch]# echo $((1<=2))
1
[root@CentOS6-node1 touch]#

#真爲1 假爲0

 

1100所有整數和

[root@CentOS6-node1touch]# echo $((100*(1+100)/2))
5050
[root@CentOS6-node1 touch]# echo $[100*$[1+100]/2]
5050
[root@CentOS6-node1 touch]#

 

寫一個簡單的四則運算的腳本

[root@CentOS6-node1touch]# cat !$     #此腳本的內容
cat 1.sh
#!/bin/bash


a=6

b=2


echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$(($a*$b))"
echo "a/b=$(($a/$b))"
echo "a**b=$(($a**$b))"
echo "a%b=$(($a%$b))"

[root@CentOS6-node1 touch]#


[root@CentOS6-node1 touch]# sh !$  #腳本執行結果
sh 1.sh
a-b=4
a+b=8
a*b=12
a/b=3
a**b=36
a%b=0
[root@CentOS6-node1 touch]#


#增強後的兩種腳本
#第一種
[root@CentOS6-node1 touch]# sh 1-2.sh 1000  1000
a-b=0
a+b=2000
a*b=1000000
a/b=1
a**b=0
a%b=0
[root@CentOS6-node1 touch]# cat 1-2.sh
#!/bin/bash


a=$1
b=$2
echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$((a*b))"
echo "a/b=$(($a/b))"
echo "a**b=$[$a**$b]"
echo "a%b=$[$a%$b]"

[root@CentOS6-node1 touch]#

#第二種
[root@CentOS6-node1 touch]# sh 1-3.sh
enter a:345
enter b:678
a-b=-333
a+b=1023
a*b=233910
a/b=0
a**b=669693386503194833
a%b=345
[root@CentOS6-node1 touch]#

 

read命令


定義:

Read作用從鍵盤讀入數據,賦給變量

[root@CentOS6-node1touch]#
[root@CentOS6-node1 touch]# read a b c
11  22  33
[root@CentOS6-node1 touch]# echo $a
11
[root@CentOS6-node1 touch]# echo $b
22
[root@CentOS6-node1 touch]# echo $c
33
[root@CentOS6-node1 touch]#

 

shell中使用read命令

[root@CentOS6-node1touch]# sh 2.sh
input first second third :
11  22  33
the first parameter is 11
the second parameter is  22
the third parameter is 33
[root@CentOS6-node1 touch]# cat 2.sh
#!/bin/bash 
echo "input first second third :"
read  firstsecond third
echo "the first parameter is $first"
echo "the second parameter is  $second"
echo "the third parameter is $third"

[root@CentOS6-node1 touch]#

 

參數用法

            read answer 從標準輸入讀取一行並賦值給變量answer

            read first last 從標準輸入讀取一行,直至遇到第一個空白符或換行符。把用戶鍵入的第一個詞存到變量first中,把該行的剩餘部分保存到變量last

            read –s passwd 將你輸入的東西隱藏起來,值賦給passwd

            read –t 2 test 輸入的時間限制

            read –n 2 test 輸入的長度限制

            read –r line 允許輸入包含反斜槓

[root@CentOS6-node1touch]#  read -p "請輸入你的准考證號: " ID
請輸入你的准考證號:308611
[root@CentOS6-node1 touch]# echo $ID
308611
[root@CentOS6-node1 touch]#

 

[root@CentOS6-node1shell]# sh 3.sh
請輸入你的姓名:張長浩
請輸入你的年齡:17
請輸入你的性別:男
你的基本信息如下:
姓名:張長浩
年齡:17
性別:男
[root@CentOS6-node1 shell]#

 

expr命令


 

作用:Shell變量的算術運算

對整數型變量進行算術運算,也可用於字符串

語法: expr 表達式 #注意運算符之間要有空格,特殊符號要轉義

 

[root@CentOS6-node1shell]# expr $qwer1 * $qwer2
expr: 語法錯誤
[root@CentOS6-node1 shell]# expr $qwer1 \* $qwer2
42435
[root@CentOS6-node1 shell]# expr $qwer1 / $qwer2
0
[root@CentOS6-node1 shell]#

 

字符串的處理

 

計算字符的長度

[root@CentOS6-node1shell]#  expr length "ni hao a"
9
[root@CentOS6-node1 shell]#

 

抓取字符串中特定的字串,後面的數字表示從第3個字符開始,截取5個字符出來

[root@CentOS6-node1shell]#  expr substr "this is aman" 3 5
is is
[root@CentOS6-node1 shell]#

 

expr程序的例子

[root@CentOS6-node1touch]# sh 4.sh
The value of value1 is 60
The value of value2 is 1
The value of value3 is 600
The value of value4 is 11
[root@CentOS6-node1 touch]# cat 4.sh
#! /bin/sh 
 a=10
 b=20
 c=30
 value1=`expr $a+ $b + $c`
 echo "Thevalue of value1 is $value1"
 value2=`expr $c/ $b`
 echo "Thevalue of value2 is $value2"
 value3=`expr $c\* $b`
 echo "Thevalue of value3 is $value3"
 value4=`expr $a+ $c / $b`
 echo "Thevalue of value4 is $value4"

[root@CentOS6-node1 touch]#

 

複雜的運算

[root@CentOS6-node1touch]# expr `expr 5 + 11` / $qwer4
2
[root@CentOS6-node1 touch]#

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章