天天看點

Linux Bash基礎(一)1 變量2 數學運算3 傳回代碼4 bash腳本5 函數6 跨腳本調用注:

介紹Bash之前首先介紹Shell,shell是一個程式,可以稱之為殼程式,用于使用者與作業系統進行互動。用來差別與核,相當于是一個指令解析器,Shell有很多中,這裡列出其中幾種 :

  • Bourne SHell(sh)
  • Bourne Again SHell(bash)
  • C SHell(csh)
  • KornSHell(ksh)
  • zsh

各個shell的功能都差不太多,在某些文法的下達下面有些差別,Linux預設就是bash。

簡單點說,直接把shell和bash先了解為一個東西好了,就是Linux中的那個終端視窗(Terminal),也就是那個小黑框,下面的例子都是在Linux的終端視窗中運作的。

1 變量

1.1 變量指派

  1. 基本形式為

    變量=變量值

    ,注意等号左右不能有空格,變量均為文本形式,如;

var1=World

  1. 對于有空格的變量值,用單引号或雙引号包圍,如:

var2='abc bcd'

  1. 可以将某個指令輸出的文本直接賦予某個變量,指令需要反引号包圍,如:

var3=`date`

  1. 變量之間可以指派,需要使用

    $

    符号說明是變量,如:

var4=$var1

  1. 可以使用

    read

    關鍵字接收資料至某個變量,如:

read name

1.2 變量引用

變量引用是指将變量翻譯為變量中存儲的文本,基本形式為

$變量

  1. 通過

    echo

    指令顯示變量,如:

echo $var3

2019年 11月 10日 星期日 19:12:55 CST

  1. echo

    顯示時,可以直接與附加文本相連,如:

echo Hello$var1

HelloWorld

  1. 當附加文本尾随變量名造成歧義時,添加大括号,如;

echo ${var4}IsGood

WorldIsGood

  1. 可以在雙引号内使用變量,但在單引号内隻能被當作文本,如:

echo "Hello $var1"

Hello World

echo 'Hello $var1'

Hello $var1

2 數學運算

  1. 在bash中,數字和運算符均被當作文本,數學運算需借助雙大括号

    $(())

result=$((1+2))

echo $result

3

  1. 支援的運算符有:加

    +

    、減

    -

    ,乘

    *

    ,除

    /

    ,求餘

    %

    ,乘方

    **

    ,其中乘方的優先級最高,示例:

echo $((2+5*2**(5-3)/2))

3 傳回代碼

  1. 在Linux中,每個可執行程式運作完後會有一個整數的傳回值,可以使用

    $?

    變量來接收,對于簡單的

    foo.c

    程式:

int main(void)

{

    int a=1;

    return 0;

}

使用gcc編譯器編譯,并執行:

gcc foo.c

./a.out

echo $?

  1. 如果程式運作異常,将傳回非0值,如删除一個不存在的檔案:

rm none_exist.file

rm: cannot remove 'none_exist.file': No such file or directory

1

  1. 在執行多條指令時,可以讓後一個程式的運作參考前一個程式的傳回代碼,如:

首先建立一個檔案并檢視确認:

touch demo.file; ls

成功删除的情況,使用

&&

符号連接配接:

rm demo.file && echo "rm succeed"

rm succeed

不成功删除的情況,使用

||

rm demo.file || echo "rm failed"

rm: cannot remove 'demo.file': No such file or directory

rm failed

4 bash腳本

4.1 腳本示例

使用vim編輯器編輯

test.sh

檔案,内容如下:

#!/bin/bash

echo "Information of xxpcb's computer:" > log

# 顯示CPU相關資訊

echo "------lscpu---------------------" >> log

lscpu >> log

# 顯示Linux系統詳情(unix name)

echo "------uname -a------------------" >> log

uname -a >> log

# 顯示記憶體使用情況

echo "------free -h-------------------" >> log

free -h >> log

該檔案的作用是将一些計算機資訊儲存到所在目錄的

log

檔案中。

使用

sh test.sh

執行bash腳本。

cat log

指令檢視log檔案資訊:

Information of xxpcb's computer:

------lscpu---------------------

Architecture:        x86_64

CPU op-mode(s):      32-bit, 64-bit

Byte Order:          Little Endian

CPU(s):              4

On-line CPU(s) list: 0-3

Thread(s) per core:  1

Core(s) per socket:  4

Socket(s):           1

NUMA node(s):        1

Vendor ID:           GenuineIntel

CPU family:          6

Model:               60

Model name:          Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz

Stepping:            3

CPU MHz:             1512.460

CPU max MHz:         3700.0000

CPU min MHz:         800.0000

BogoMIPS:            6596.30

Virtualization:      VT-x

L1d cache:           32K

L1i cache:           32K

L2 cache:            256K

L3 cache:            6144K

NUMA node0 CPU(s):   0-3

Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts md_clear flush_l1d

------uname -a------------------

Linux deeplearning 5.0.0-29-generic #31~18.04.1-Ubuntu SMP Thu Sep 12 18:29:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

------free -h-------------------

              total        used        free      shared  buff/cache   available

Mem:            15G        939M         12G         29M        2.2G         14G

Swap:           11G          0B         11G

可以看出CPU型号:i5-4590 CPU,Linux版本:Ubuntu18.04,記憶體容量:15G。

4.2 腳本參數

  1. bash腳本在運作時,也可以攜帶參數,在腳本中通過變量的形式接收,如

    test_arg.sh

    内容如下:

echo $0

echo $1

echo $2

其中

$0

是指令的第一部分,

$1

才是第一個參數,如運作:

./test_arg.sh hello world

./test_arg.sh

hello

world

  1. 利用傳入的參數可以令腳本的使用更加靈活,對于上面的

    test.sh

    檔案,可以使用參數指定儲存的檔案:

echo "Information of xxpcb's computer:" > $1

echo "------lscpu---------------------" >> $1

lscpu >> $1

echo "------uname -a------------------" >> $1

uname -a >> $1

echo "------free -h-------------------" >> $1

free -h >> $1

在執行時,可以指定将資訊輸出到

output.file

檔案:

sh test.sh output.file

4.3 腳本的傳回值

與可執行程式類似,腳本也可以有傳回值,按照慣例正常情況傳回0,在腳本末尾使用exit指令設定傳回值,如

hello_world.sh

:

echo Hello

echo World

exit 0

注意,末尾手動添加

exit 0

并不必要,腳本正常運作其實會自動傳回代碼0。執行示例:

sh hello_world.sh

Hello

World

注意,如果在腳本中間出現

exit

,則腳本提前退出,并傳回該exit指令給出的代碼值。

5 函數

腳本中也可以使用類似函數的結構,并且同樣可以使用傳入的參數:

# 定義函數my_info

function my_info()

    lscpu >> $1

    uname -a >> $1

    free -h >> $1

# 函數調用

my_info output.file

注意:函數定義時,關鍵字

function

和大括号

{}

為函數提示,因而可以省略

function

關鍵字。

6 跨腳本調用

source

指令可以實作函數的跨腳本調用。

source

指令的作用是在同一個程序中執行另一個檔案中的bash腳本。

例如有

my_info.sh

(内容如上)和

app.sh

source my_info.sh

運作

app.h

,執行到source指令所在行時,就會執行

my_info.sh

腳本。是以在

app.h

中使用

my_info

函數。

注:

/bin/sh

/bin/bash

的細微差別(參考:

https://www.cnblogs.com/givemelove/p/8477430.html

)

在shell腳本的開頭往往有一句話來定義使用哪種sh解釋器來解釋腳本。目前研發送測的shell腳本中主要有以下兩種方式:

  • #!/bin/sh

  • #!/bin/bash

    值得注意的是:
  • sh一般設成bash的軟鍊
  • 在一般的linux系統當中(如redhat),使用sh調用執行腳本相當于打開了bash的POSIX标準模
  • 也就是說 /bin/sh 相當于 /bin/bash --posix

是以,sh跟bash的差別,實際上就是bash有沒有開啟posix模式的差別