shell腳本1

shell腳本基礎

shell腳本:

包含一些命令或聲明,并符合一定格式的文本文件

格式要求:首行shebang機制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

shell腳本的用途有:

自動化常用命令

執行系統管理和故障排除

創建簡單的應用程序

處理文本或文件

創建shell腳本

第一步:使用文本編輯器來創建文本文件

第一行必須包括shell聲明序列:#!

#!/bin/bash

添加注釋

注釋以#開頭

第二步:運行腳本

給予執行權限,在命令行上指定腳本的絕對或相對路徑

直接運行解釋器,將腳本作為解釋器程序的參數運行

 shell腳本1

shell腳本1 

直接執行腳本權限會拒絕,要給腳本加個X權限

腳本規范

腳本代碼開頭約定

1、第一行一般為調用使用的語言

2、程序名,避免更改文件名為無法找到正確的文件

3、版本號

4、更改后的時間

5、作者相關信息

6、該程序的作用,及注意事項

7、最后是各版本的更新簡要說明

示例:

#!/bin/bash

# ——————————————

# Filename: hello.sh

# Revision: 1.1

# Date: 2017/06/01

# Author: wang

# Email: wang@gmail.com

# Website: www.magedu.com

# Description: This is the first script

# ——————————————

# Copyright: 2017 wang

# License: GPL

echo “hello world”

腳本調試

bash -n f1.sh 檢測腳本中語法的錯誤

shell腳本1

設置變量b,故意將$后的小括號打成中文的括號,然后檢測,就會報錯,提示你括號打錯了

bash -x f1.sh  調試執行

shell腳本1

 shell腳本1

每一步都顯示出來

變量

變量:命名的內存空間

     數據存儲方式:

             字符:

              數值:整型,浮點型(有小數)

變量:變量類型

        作用:

               1、數據存儲格式

               2、參與的運算

                3、表示的數據范圍

類型:

         字符

         數值:整型、浮點型

 

強類型:變量不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型轉換。一般定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤

java,c#

 

弱類型:語言的運行時會隱式做數據類型轉換。無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用

如:bash 不支持浮點數,php

 

變量命名法則:

1、不能使程序中的保留字:例如if, for

2、只能使用數字、字母及下劃線,且不能以數字開頭

3、見名知義

4、統一命名規則:駝峰命名法

bash中變量的種類

根據變量的生效范圍等標準:

1.本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效

shell腳本1

設置個本地變量d=444,當前shell是一級(echo $SHLVL查看當前shell是幾級shell,可以引用變量d。進入2shell,再引用變量d,不會顯示吃結果,  說明變量d已經不存在了,進入3shell,還是一樣。當再次返回一級shell,又能引用變量d了,所以本地變量只對當前shell有效,對當前shell的子shell及以下的shell都無效。

變量賦值:name=‘value’

可以使用引用value:

       (1) 可以是直接字串; name=“root”

       (2) 變量引用:name=”$USER”

       (3) 命令引用:name=`COMMAND`(命令用反單引號引起來) name=$(COMMAND)

shell腳本1

變量引用:${name} $name

       “”:弱引用,其中的變量引用會被替換為變量值

       ”:強引用,其中的變量引用不會被替換為變量值,而保持原字符串

shell腳本1

 

顯示已定義的所有變量:set(既可以查本地變量又能查環境變量)

刪除變量:unset name(在腳本中設置了變量,用完了之后最好把變量刪除掉)

shell腳本1

 

2.環境變量:生效范圍為當前shell進程及其子進程

shell腳本1

設置環境變量a,當前是一級shell,能引用環境變量a,進入2級shell,依舊能引用,3級也是如此,所以環境變量對當前shell及其子shell或以下都有效。

變量聲明、賦值:

             export name=VALUE

             declare -x name=VALUE

變量引用:$name, ${name}

顯示所有環境變量:(只顯示環境變量)

       env

       printenv

       export

       declare -x

刪除變量:(在腳本中設置了變量,用完了之后最好把變量刪除掉)

    unset name

bash內建的環境變量:

        PATH

        SHELL

         USER

         UID

         HOME

         PWD

         SHLVL

         LANG

         MAIL

         HOSTNAME

         HISTSIZE

          —

source

shell腳本1

 shell腳本1

寫一個腳本66.sh,內容為設置一個本地變量f=1111,然后把本地變量f顯示出來(腳本中變量f是在2級shell設置的),寫完腳本后,在當前shell也設置一個本地變量f=magedu,然后把腳本66.sh加上權限,用路徑執行腳本,結果為1111,在當前shell顯示變量f結果為magedu,再用source來執行腳本,結果還為1111,但再在當前shell顯示變量f結果為1111,所以可以得出結論:source在當前shell執行腳本后,腳本中設置的變量(在當前shell的子shell中設置的)會覆蓋當前shell相同的變量。用source執行腳本是極為不安全的,因為會破壞掉當前shell的變量。

.也就是source

 

3.局部變量:生效范圍為當前shell進程中某代碼片斷(通常指函數)

4.位置變量:$1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數

   位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數

   $1, $2, …:對應第1、第2等參數,shift [n]換位置

shell腳本1

這的$10$11不是整體,是$10,$11

shell腳本1

 所以$10顯示的是第一個參數和0,$11顯示的是第一個參數和1        

shell腳本1

 1011用大括號括起來,使其變成一個整體 ,這樣就能使${10}顯示第10個參數,${11}顯示第11個參數。       

shell腳本1

          $0: 命令本身

shell腳本1

         $*: 傳遞給腳本的所有參數,全部參數合為一個字符串

shell腳本1

         $@: 傳遞給腳本的所有參數,每個參數為獨立字符串

shell腳本1

          $#: 傳遞給腳本的參數的個數

shell腳本1

          $@ $* 只在被雙引號包起來的時候才會有差異

   set —清空所有位置變量  

5.特殊變量:$?, $0, $*, $@, $#,$$

6.只讀變量: 只能聲明,但不能修改和刪除

   聲明只讀變量:   

        readonly varname

        declare -r varname

   查看所有的只讀變量

        readonly -p

shell腳本1

(只讀變量不能修改和刪除)reboot重啟后只讀變量會自動消失。

 

退出狀態

進程使用退出狀態來報告成功或失敗

0 代表成功,1255代表失敗

$? 變量保存最近的命令退出狀態

例如:

ping-c1-W1 hostdown&>/dev/null

echo $?

shell腳本1

 

退出狀態碼

bash自定義退出狀態碼

exit [n]:自定義退出狀態碼

注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字

shell腳本1

注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼

shell腳本1

 shell腳本1

 shell腳本1

 

轉譯:

\ 完全轉譯

“”部分轉譯 (\ ` ! $ 不能轉譯)

shell腳本1

完全轉譯

 

引用變量時

$varname

“$varname”

${varname}

當變量值當中包含換行符,如果希望引用出的值同樣包含換行符,只能使用“$varname”

shell腳本1

$()${}的區別:當引用一些命令的結果時用$(),當引用的是設置變量的名字時用${},來劃分界限。

 

算術運算

bash中的算術運算:help let

+, -, *, /, %取模(取余), **(乘方)在bc當中乘方是^

實現算術運算:

(1) let var=算術表達式

shell腳本1

 shell腳本1

(2) var=$[算術表達式]

shell腳本1

(3) var=$((算術表達式))

shell腳本1

(4) var=$(expr arg1 arg2 arg3 …)   乘法時要轉譯* ,即\*

shell腳本1

(5) declare –i var = 數值

shell腳本1

(6) echo ‘算術表達式’ | bc(這種算術表達乘方是^)

shell腳本1

 

bash有內建的隨機數生成器:$RANDOM(0-32767)

echo $[$RANDOM%50] 0-49之間隨機數

echo $[$RANDOM%72+1]取個隨機數071再加1(就是172

shell腳本1

賦值

增強型賦值:

+=, -=, *=, /=, %=

let varOPERvalue

例如:let count+=3

自加3后自賦值

自增,自減:

    let var+=1

    let var++

    let var-=1

    let var–

 

原創文章,作者:fuming,如若轉載,請注明出處:http://www.www58058.com/83748

(0)
fumingfuming
上一篇 2017-08-05
下一篇 2017-08-05

相關推薦

  • 第三周練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次: who | cut -d” ” -f1 | uniq 2、取出最后登錄到當前系統的用戶的相關信息 id `last | head -1 | cut -d” ” -f1` 3、列出當前系統上被用戶當作默認shell的最多的那個shell cut -d: -f7 /etc/p…

    Linux干貨 2017-07-16
  • N25期—第四周作業

    1、 復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 cp –rf /etc/skel /home/tuser1 chmod -R go= /home/tuser1 2、 編輯/etc/group文件,添加組hado…

    Linux干貨 2016-12-26
  • 淺談Linux終端類型

    Linux終端類型 作者:任飛鵬            日期:2016-10-13 終端是什么: 終端(Terminal)也稱終端設備,是計算機網絡中處于網絡最外圍的設備,主要用于用戶信息的輸入以及處理結果的輸出等。 早期計算機系統中,由于計算機主機…

    Linux干貨 2016-10-19
  • 源碼編譯安裝dropbear

    tar -jxf dropbear-2013.58.tar.bz2 cd dropbear-2013.58 ./configure make PROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp” make PROGRAMS=”dropbear dbclie…

    Linux干貨 2017-10-21
  • MBR分區結構

    MBR分區結構 一、硬盤主引導記錄MBR由4個部分組成: 1、主引導程序(偏移地址0000H–0088H),它負責從活動分區中裝載,并運行系統引導程序。 2、出錯信息數據區,偏移地址0089H–00E1H為出錯信息,00E2H–01BDH全為0字節。 3、分區表(DPT,Disk Partition Table):含4個分…

    2017-08-20
  • 硬盤的讀寫原理

     硬盤的種類主要是SCSI 、IDE 、以及現在流行的SATA等;任何一種硬盤的生產都要一定的標準;隨著相應的標準的升級,硬盤生產技術也在升級;比如 SCSI標準已經經歷了SCSI-1 、SCSI-2、SCSI-3;其中目前咱們經常在服務器網站看到的 Ultral-160就是基于SCSI-3標準的;IDE 遵循的是ATA標準,而目前流行的SATA,…

    Linux干貨 2015-04-10
欧美性久久久久