菜鳥教程之學習Shell script筆記(中)

菜鳥教程Shell script學習筆記(中)

如下內容是學習菜鳥教程之shell教程,所整理的筆記html

菜鳥教程之shell教程:http://www.runoob.com/linux/linux-shell.htmllinux

Shell基本運算符

注意: 原生bash不支持簡單的數學運算,可是能夠經過其餘命令來實現,例如 awk 和 expr,expr 最經常使用。shell

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

#!/bin/bash
val=`expr 2 + 2`
echo "兩個數之和爲:$val"
運行實例:
兩數之和爲:4

注意:表達式和運算符之間喲要有空格,這與咱們熟悉的大部分編程語言不同

% 取餘 `expr $b % $a`
== 相等,用於比較兩個數字,相同則返回true [$a == $b] 返回false
!= 不相等,用於比較兩個數字,不相同則返回true {$ != $b}返回true

注意:條件表達式要放在方括號之間,而且要有空格。
  • 關係運算符
關係運算符只支持數字,不支持字符串,除非字符串的值是數字。
常見的關係運算符:
設a爲10,b爲20
-eq 檢測兩個數是否相等,相等則返回true [$a -eq  $b]返回false
-ne 檢測兩數是否不相等,不相等則返回true [$a -ne $b]返回true
-gt 檢測左邊的數是否大於右邊,若是是,則返回true [$a -gt $b]返回false
-lt 檢測左邊的數是否小於右邊,若是是,則返回true [$a -lt $b]返回true
-ge 檢測左邊的數是否大於等於右邊,若是是,則返回true [$a -ge $b]返回false
-le 檢測左邊的數是否小於等於右邊,若是是,則返回true [$a -le $b]返回true
  • 布爾運算符
常見的布爾運算符:
假定變量a爲10,變量b爲20
! 非運算,表達式爲true則返回false,不然返回true [!false]返回true
-o 或運算,有一個表達式爲true則返回true [$a -lt 20 -o $b -gt 100]返回true
-a 與運算,兩個表達式都爲true才返回true [$a -lt 20 -a $b -gt 100]返回false
  • 邏輯運算符
shell的邏輯運算符:
假設變量a爲10,變量b爲20
&& 邏輯的and [[$a -lt $b -gt 100]]返回false
|| 邏輯的or ][[$a -lt 100 || $b -gt 100]]返回true
  • 字符串運算符
常見的字符串運算符:
假設變量a爲"abc",變量b爲"efg"
-z 檢測字符串長度是否爲0,爲0返回ture [-z"$a"]返回false
-n 檢測字符串長度是否爲0,不爲0返回true [-n"$"]返回true
str 檢測字符串是否爲空,不爲空返回true [$a]返回true
  • 文件測試運算符
文件測試符用於檢測unix文件的各類屬性
屬性檢測描述以下
-b file 檢測文件是不是塊設備文件,若是是,則返回true [-b $file]返回false
-c file 檢測文件是復活是字符設備文件,若是是,則放回true [-c $file]返回false
-d file 檢測文件是不是目錄,若是是,則返回true [-d $file]返回false
-f file 檢測文件是不是普通文件(即不是目錄,也不是設備文件),若是是,則放回true [-f $file]返回true
-g file 檢測文件是否設置了SGID位,若是是,則返回true [-g $file]返回fasle
-k file 檢測文件是否設置了粘着位(Sticky Bit),若是是,則返回true [-k $file]返回false
-p file 檢測文件是不是有名管道,若是是,則返回true [-p $file]返回false
-u file 檢測文件是否設置了SUID位,若是是,則返回true [-u $file]返回false
-w file 檢測文件是否科協,若是是,則返回true [-w $file]返回true
-x file 檢測文件是否可執行,若是是,則返回true [-x $file]返回true
-s file 檢測文件是否爲空(文件大小是否大於0),不爲空返回true [-s $file]返回true
-e file 檢測文件(包括目錄)是否存在,若是是,則返回true [-e $file]返回true

Shell echo命令

Shell 的 echo 指令與 PHP 的 echo 指令相似,都是用於字符串的輸出。bash

  • 顯示普通字符
    echo "It is a test" #雙引號可省略 效果同樣
  • 顯示轉義字符
    用\轉義,顯示\後面的字符 echo ""It is a test"" 輸出:"It is a test"
  • 顯示變量
read 命令從標準輸入中讀取一行,並把輸入行的每一個字段的值指定給 shell 變量
#!/bin/sh
read name
echo "$name It is a test"
  • 顯示換行
-n 顯示換行 菜鳥上面顯示-e開啓轉義,是錯誤的。
echo -e "ok! \n"
echo  "It is a test"
輸出:
-e ok!

It is a test
  • \c 顯示不換行
  • 顯示結果並寫入文件
    echo "It is a test" > mylife
  • 原樣輸出字符串,不進行轉義或取變量(用單引號)
echo '$name\"'
輸出:
$name\"
  • xxx顯示命令執行結果
    echo date編程語言

    Shell printf命令

    printf 由 POSIX 標準所定義,使用printf的腳本比echo移植性好。printf 使用引用文本或空格分隔的參數,外面能夠在 printf 中使用格式化字符串,還能夠制定字符串的寬度、左右對齊方式等。默認 printf 不會像 echo 自動添加換行符,咱們能夠手動添加 \n。
  • printf命令的語法:
printf format-string [arguments]
format-string:爲格式控制字符串
arguments:爲參數列表
eg:
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
printf "%-10s %-8s %-4.3f\n" 郭芙 女 47.9876
執行腳本 輸出以下
...
%s %c %d %f都是格式替代符
%-10s 指一個寬度爲10個字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個字符寬的字符內,若是不足則自動以空格填充,超過也會將內容所有顯示出來。
%-4.2f 指格式化爲小數,其中.2指保留2位小數。
思考教程上例題:
教程上例題源碼:
#!/bin/bash
printf "%d %s\n" 1 "abc"
printf '%d %s\n' 1 "abc"
printf %s abcdef
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
printf "%s and %d \n"
執行結果:
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0
以上結果我認爲有誤:
爲何 單個printf %s abcdef 輸出的是abcdef 而不是abcdefabcdefabc
  • printf的格式指示符
%b 相應的參數被視爲有要處理的轉義序列的字符串
%c ASCLL字符,顯示相對應參數的第一個字符 
%d,%i 十進制整數 
%e 浮點格式 
%E 浮點格式 
%f 浮點格式 
%g %e或%f轉換,看哪一個比較短,則刪除結尾的零 
%G %E或%f轉換,看哪一個比較短,則刪除結尾的零 
%o 不帶正負號的八進制轉換 
%s 字符串格式 
%u 不帶正負號的十進制值 
%x 不帶正負號的十六進制。使用a至f表示10至15 
%X 不帶正負號的十六進制。使用A至F表示10至15 
%% 字面意義的%
  • printf的轉義序列
\a 警告字符,一般爲ASCII的BEL字符 
\b 後退(一位) 
\c 抑制(不顯示)輸出結果中任何結尾的換行字符(只在%b格式指示符控制下的參數字符串中有效),並且,任何留在參數裏的字符、任何接下來的參數以及任何留在格式字符串中的字符,都被忽略 
\f 換頁(formfeed) 
\n 換行 
\r 回車(Carriage return) 
\t 水平製表符 
\v 垂直製表符 
\ 一個字面上的反斜槓字符 
\ddd 表示1到3位數八進制值的字符,僅在格式字符串中有效 
\0ddd 表示1到3位的八進制的字符,僅在格式字符串中有效
eg:
printf "a string, no processing:<%s>\n" "A\nB"
printf "a string, no processing:<%b>\n" "A\nB"
printf "www.baiduu.com \a"

Shell test命令

Shell中的test命令用於檢查某個條件是否成立,它能夠進行數值、字符和文件三個方面的測試工具

  • 數值測試
-eq 等於則爲真
-ne 不等於則爲真
-gt 大於則爲真
-ge 大於等於則爲真
-lt 小於則爲真
-le 小於等於則爲真
eg:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '兩個數相等!'
else
    echo '兩個數不相等!'
fi

代碼中的[]執行基本的算數運算,如:
#!/bin/bash
a=5
b=6
result=$[a+b] #注意等號兩邊不能有空格
echo "result 爲:$result"
  • 字符串測試
= 等於則爲真
!= 不相等則爲真
-z字符串 字符串的長度爲零則爲真
-n字符串 字符串的長度不爲零則爲真
eg:
num1="test"
num2="test2"
if test $num1 = $num2
then
    echo '兩個字符串相等!'
else
    echo '兩個字符串不相等'
fi
  • 文件測試
-e文件名 若是文件存在則爲真
-r文件名 若是文件存在且可讀則爲真
-w文件名 若是文件存在且可寫則爲真
-x文件名 若是文件存在且可執行則爲真
-s文件名 若是文件存在且至少有一個字符則爲真
-d文件名 若是文件存在且爲目錄則爲真
-f文件名 若是文件存在且爲普通文件則爲真
-c文件名 若是文件存在且爲字符型特殊文件則爲真
-b文件名 若是文件存在且爲塊文件則爲真
eg:
#!/bin/bash
cd /bin
if test -e ./bash
then
    echo '文件已經存在'
else
    echo '文件不存在'
fi
另外,Shell還提供了與( -a )、或( -o )、非( ! )三個邏輯操做符用於將測試條件鏈接起來,其優先級爲:"!"最高,"-a"次之,"-o"最低。例如:
#!/bin/bash
cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一個文件存在!'
else
    echo '兩個都不存在!'
fi
相關文章
相關標籤/搜索