Shell腳本入門

Shell script(Shell腳本)的工做方式有兩種: shell

①交互式(Interactive):用戶每輸入一條命令,而後Shell當即執行一次; express

②批處理(Batch):由用戶實現編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。 bash

   

查看系統可用的shell(/etc/shells文件) less

Linux系統默認的命令行終端解釋器爲Bash 測試

   

Shell腳本文件的格式: ui

  1. 第一行(通常必須寫明):指定腳本使用的shell(若不寫明也不影響腳本的執行,系統會自動以sh解析腳本)。"#!/bin/bash"聲明文件內的語法使用bash的語法,當這個程序被執行時,加載bash的相關環境配置文件(通常是non-login shell中的~/.bashrc文件)。
  2. 第二部分的註釋(可寫):程序內容的說明。shell腳本中,井號#用做批註(除第一行的"#!"外),shell不會解釋以#開頭的行(除第一行bash聲明外)。
  3. 主要環境變量的聲明(可寫)
  4. 腳本的程序部分。
  5. 程序執行結束,回傳一個數值給系統告知執行的結果(可寫。默認命令執行成功返回數值0)。

腳本文件test1.sh的執行方式:spa

  1. 以sh(bash)進程來執行腳本文件(用戶沒必要擁有對腳本文件的x權限)(在子進程中執行)

    sh -x:實現shell腳本逐條語句的跟蹤 .net

    sh -n:不執行腳本,僅進行語法的檢查 命令行

    sh -v:執行腳本前,先將腳本的內容輸出到屏幕上 3d

  2. 經過絕對或相對路徑來執行腳本文件(用戶須擁有對腳本文件的x權限)

    (Linux系統中一切都是文件。後綴名.sh僅提示用戶該文件是一個腳本文件,並不表明該文件是能夠被用戶執行的。文件是否能夠被執行在於用戶是否擁有對該文件的x權限)(在子進程中執行)

  3. 將腳本文件所處的目錄添加到PATH環境變量中,經過輸入腳本文件名來直接運行(用戶須擁有對腳本文件的x權限)(在子進程中執行)

  4. 經過source命令或小數點(.)來執行腳本文件(在父進程中執行)

    用方式①//③執行test2.sh腳本,執行完成後回到命令行模式(父進程)輸出腳本中設置的變量,發現變量並不存在

    (經過上述①//③方式(bash(sh)、絕對/相對路徑或者將路徑添加到$PATH中)來運行腳本時,該script會使用一個新的bash環境(子shell、子進程)來執行腳本內的命令。當子進程完成後(腳本執行結束),子進程內的各項變量或操做將會消失而不會傳回給父進程中。)

    若經過source命令或小數點(.)來執行腳本,該script會在父進程中執行。所以,父進程擁有腳本內設置的變量、操做等。

   

bash shell中的數學運算:在方括號內計算數學公式 [ operation ],結果賦值爲result=$[ operation ]。

   

數學運算浮點解決方案:使用bc命令(bash的內建計算器)。

選項

做用

-q

不顯示bc計算器的歡迎信息

輸入quit或組合鍵ctrl+d可退出bc計算器

浮點運算是由內建變量scale(數值範圍)控制的,須將這個值設置爲但願在計算結果中保留的小數位數,默認值爲0。

在腳本中使用bc命令,經過命令替換$(),將輸出結果賦值給一個變量:

基本格式爲 variable=$(echo "options; expression" | bc)

使用內聯輸入重定向<<,在命令行中重定向數據(特別適用於進行大量運算):

基本格式爲 varible=$(bc << EOF

options

statements

expressions

EOF

)

EOF字符串標識了重定向給bc命令的數據的終止。

bash計算器中建立的變量只在bash計算器中有效。

   

Shell中運行的每一個命令都使用退出狀態碼告訴shell它運行完畢。退出狀態碼:0-255的整數值,在命令結束運行時由命令傳給shell。變量$?用於保存上個已執行命令的退出狀態碼。退出狀態碼可配合exit命令使用。

狀態碼

描述

0

命令成功結束

1

通常性未知錯誤

2

不適合的shell命令

126

命令不可執行

127

沒找到命令

128

無效的退出參數

128+x

Linux信號x相關的嚴重錯誤

130

經過ctrl+c終止的命令

255

正常範圍以外的退出狀態碼

   

Shell script的的默認變量(接受用戶參數的變量)

  • $0:當前Shell腳本程序的名稱;
  • $#:參數的個數;
  • $*:全部位置的參數值;
  • $?:上一條命令的執行返回值;
  • $一、$二、$3……:第N個位置的參數值。

   

test(測試):判斷條件表達式是夠成立。格式:test [參數]。單獨執行test命令後不會顯示任何信息。

可經過echo $?輸出上一條命令(test命令)執行後的返回結果,若爲0則表示執行(判斷)成功

或經過&&、||來顯示相關結果

  • 文件測試所用的參數

操做符

做用

-e file1

測試file1文件是否存在(exist

-d file1

測試file1文件是否爲目錄類型,且是否存在(directory

-f file1

測試file1文件是否爲通常文件,且是否存在(file

-r file1

測試當前用戶對file1文件是否有讀取權限(read

-w file1

測試當前用戶對file1文件是否有寫入權限(write

-x file1

測試當前用戶對file1文件是否有執行權限(execute

file1-nt file2

測試file1是否比file2新(newer than)(檢查文件日期)

file1-ot file2

測試file1是否比file2舊(older than

  • 整數測試所用的參數

操做符

做用

n1 -eq n2

檢查n1是否等於n2equal

n2 -ne n2

檢查n1是否不等於n2not equal

n1-gt n2

檢查n1是否大於n2greater than

n1 -lt n2

檢查n1是否小於n2less than

n1 -le n2

檢查n1是否等於或小於n2less equal

n1 -ge n2

檢查n1是否大於或等於n2greater equal

Shell中不該使用"=="和"!="進行整數的比較(會將整數看成字符串來比較)

來自 <http://blog.csdn.net/zbw18297786698/article/details/77460786>

  • 字符串測試所用的參數

操做符

做用

str1 == str2

比較str1str2字符串的內容是否相同

str1 != str2

比較str1str2字符串的內容是否不一樣

-z str1

判斷str1字符串長度是否爲0(或未被定義)

-n str1

判斷str1字符串長度是否爲非0

str1 > str2

判斷str1是否比str2大(逐位比較字符串的每一個字符,按字典順序比較大小)

str1 < str2

判斷str1是否比str2

(使用><(大於號、小於號)進行判斷時必須搭配轉義字符/使用,不然shell會誤認爲是重定向符號,把後字符串誤當成文件名)(比較字符串順序大小的測試中,大寫字母會被認爲是小於小寫字母的(與sort命令偏偏相反,在英語環境下sort命令會認爲大寫字母是大於小寫字母的,即排序結果中小寫字母優先於大寫字母出現))

  • 多重條件判斷

操做符

做用

test1 -a test2

相似於&&,兩個測試條件同時成立時纔回傳true(and)

test1 -o test2

相似於||,任一測試條件成立就回傳true(or)

! test1

反向狀態(取反)

 

[](中括號):判斷符號。bash shell提供的另外一種條件測試方法,做用同等與test命令,經常使用於if…then條件判斷式中。

  • 中括號的兩端、每一個組件間都須要有空格符來分隔。

  • 中括號內的變量、常量,最好都以雙引號或單引號括起來。

[ "$yn" == "Y" -o "$yn" == "y" ] 也可寫成 [ "$yn" == "Y" ] || [ "$yn" == "y" ] (布爾邏輯能將可能的返回值簡化爲TRUE或FALSE類型)

相關文章
相關標籤/搜索