天天看點

Linux Shell指令(二) 資料類型 表達式

字元串

字元串是shell程式設計中最常用最有用的資料類型(除了數字和字元串,也沒啥其它類型好用了),字元串可以用單引号,也可以用雙引号,也可以不用引号。單雙引号的差別跟PHP類似。

單引号

str='this is a string'
           

單引号字元串的限制:

  • 單引号裡的任何字元都會原樣輸出,單引号字元串中的變量是無效的;
  • 單引号字串中不能出現單引号(對單引号使用轉義符後也不行)。

雙引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
           

雙引号的優點:

  • 雙引号裡可以有變量
  • 雙引号裡可以出現轉義字元

拼接字元串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
           

擷取字元串長度

string="abcd"
echo ${#string} #輸出 4
           

提取子字元串

string="alibaba is a great company"
echo ${string:1:4} #輸出liba
           

查找子字元串

string="alibaba is a great company"
echo `expr index "$string" is`
           

字元串索引:expr index $var $subvar指令比對的$subvar中的任意一個字元第一次在$var中出現的位置,不像通常我們所用的java,javascript等語言那樣去比對$subvar中的第一個字元在$var中首次出現的位置

echo `expr index "$string" ia`#輸出1
echo `expr index "$string" “”`#輸出8,索引空格必須加雙引号
           

轉義字元

如果表達式中包含特殊字元,Shell 将會進行替換。例如,在雙引号中使用變量就是一種替換,轉義字元也是一種替換。

舉個例子:

#!/bin/bash
a=10
echo -e "Value of a is $a \n"
           

運作結果:

Value of a is 10
 
           

這裡 -e 表示對轉義字元進行替換。如果不使用 -e 選項,将會原樣輸出:

Value of a is 10\n
           

可以使用 echo 指令的 -E 選項禁止轉義,預設也是不轉義的;使用 -n 選項可以禁止插入換行符。

表達式變量替換

變量替換可以根據變量的狀态(是否為空、是否定義等)來改變它的值

請看下面的例子:

#!/bin/bash
 
echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"
 
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
 
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
 
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
 
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"
           

運作結果:

Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set
 
3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix
           

表達式指令替換

指令替換是指Shell可以先執行指令,将輸出結果暫時儲存,在适當的地方輸出。

指令替換的文法:

$(command)
           

或者

`command`
           

注意是反引号,不是單引号,這個鍵位于 Esc 鍵下方。

推薦用$(command)的方式,因為反引号在某些情況下會有問題。

下面的例子中,将指令執行結果儲存在變量中:

#!/bin/bash
DATE=$(date)
echo "Date is $DATE"
USERS=$(who | wc -l)
echo "Logged in user are $USERS"
           

運作結果:

Date is Thu Jul 2 03:59:57 MST 2015
Logged in user are 1
           

數組的定義

Shell在程式設計方面比Windows批處理強大很多,無論是在循環、運算。

bash支援一維數組(不支援多元數組),并且沒有限定數組的大小。類似與C語言,數組元素的下标由0開始編号。擷取數組中的元素要利用下标,下标可以是整數或算術表達式,其值應大于或等于0。

在Shell中,用括号來表示數組,數組元素用“空格”符号分割開。定義數組的一般形式為:

array_name=(value1 ... valuen)
           

例如:

array_name=(value0 value1 value2 value3)
           

或者

array_name=(
value0
value1
value2
value3
)
           

還可以單獨定義數組的各個分量:

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
           

可以不使用連續的下标,而且下标的範圍沒有限制。

數組的讀寫

讀取數組元素值的一般格式是:

${array_name[index]}
           

例如:

valuen=${array_name[2]}
           

舉個例子:

#!/bin/bash
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
           

運作腳本,輸出:

$./test.sh
First Index: Zara
Second Index: Qadir
           

使用@ 或 * 可以擷取數組中的所有元素,例如:

${array_name[*]}
${array_name[@]}
           

shell運算符介紹

Bash 支援很多運算符,包括算數運算符、關系運算符、布爾運算符、字元串運算符和檔案測試運算符。

原生bash不支援簡單的數學運算,但是可以通過其他指令來實作,例如 awk 和 expr,expr 最常用。

expr 是一款表達式計算工具,使用它能完成表達式的求值操作。

例如,兩個數相加:

#!/bin/bash
val=`expr 2 + 2`
echo "Total value : $val"
           

運作腳本輸出:

Total value : 4
           

兩點注意:

  • 表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數程式設計語言不一樣。
  • 完整的表達式要被 `` 包含,注意這個字元不是常用的單引号,在 Esc 鍵下邊。

算數運算符

來看一個使用算術運算符的例子:

#!/bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
           

運作結果:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b
           

注意:

  • 乘号前邊必須加反斜杠()才能實作乘法運算;
  • if...then...fi 是條件語句,後續将會講解。
  • 條件表達式要放在方括号之間,并且要有空格,例如 [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]。

關系運算符

關系運算符隻支援數字,不支援字元串,除非字元串的值是數字。

來看一個關系運算符的例子:

#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a is equal to b"
else
echo "$a -eq $b: a is not equal to b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a is not equal to b"
else
echo "$a -ne $b : a is equal to b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a is greater than b"
else
echo "$a -gt $b: a is not greater than b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a is less than b"
else
echo "$a -lt $b: a is not less than b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a is greater or equal to b"
else
echo "$a -ge $b: a is not greater or equal to b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a is less or equal to b"
else
echo "$a -le $b: a is not less or equal to b"
fi
           

運作結果:

10 -eq 20: a is not equal to b
10 -ne 20: a is not equal to b
10 -gt 20: a is not greater than b
10 -lt 20: a is less than b
10 -ge 20: a is not greater or equal to b
10 -le 20: a is less or equal to b
           

布爾運算符

來看一個布爾運算符的例子:

#!/bin/sh
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a -lt 100 -a $b -gt 15 : returns true"
else
echo "$a -lt 100 -a $b -gt 15 : returns false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi
           

運作結果:

10 != 20 : a is not equal to b
10 -lt 100 -a 20 -gt 15 : returns true
10 -lt 100 -o 20 -gt 100 : returns true
10 -lt 5 -o 20 -gt 100 : returns false
           

字元串運算符

來看一個例子:

#!/bin/sh
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b : a is equal to b"
else
echo "$a = $b: a is not equal to b"
fi
if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi
if [ -z $a ]
then
echo "-z $a : string length is zero"
else
echo "-z $a : string length is not zero"
fi
if [ -n $a ]
then
echo "-n $a : string length is not zero"
else
echo "-n $a : string length is zero"
fi
if [ $a ]
then
echo "$a : string is not empty"
else
echo "$a : string is empty"
fi
           

運作結果:

abc = efg: a is not equal to b
abc != efg : a is not equal to b
-z abc : string length is not zero
-n abc : string length is not zero
abc : string is not empty
           

檔案測試運算符

檔案測試運算符用于檢測 Unix 檔案的各種屬性。

例如,變量 file 表示檔案“/var/www/tutorialspoint/unix/test.sh”,它的大小為100位元組,具有 rwx 權限。下面的代碼,将檢測該檔案的各種屬性:

#!/bin/sh
file="/var/www/tutorialspoint/unix/test.sh"
if [ -r $file ]
then
echo "File has read access"
else
echo "File does not have read access"
fi
if [ -w $file ]
then
echo "File has write permission"
else
echo "File does not have write permission"
fi
if [ -x $file ]
then
echo "File has execute permission"
else
echo "File does not have execute permission"
fi
if [ -f $file ]
then
echo "File is an ordinary file"
else
echo "This is sepcial file"
fi
if [ -d $file ]
then
echo "File is a directory"
else
echo "This is not a directory"
fi
if [ -s $file ]
then
echo "File size is zero"
else
echo "File size is not zero"
fi
if [ -e $file ]
then
echo "File exists"
else
echo "File does not exist"
fi
           

運作結果:

File has read access
File has write permission
File has execute permission
File is an ordinary file
This is not a directory
File size is zero
File exists
           

可以用指令:“ll”來檢視檔案權限,修改file路徑和檔案權限并在次執行。

主要内容來自學習平台:彙智網,筆者在centos7上進行了一些擴充和補充。

繼續閱讀