1. 程式人生 > >Linux Shell命令(二) 資料型別 表示式

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上進行了一些擴充套件和補充。