Bash Shell 小試牛刀,bashshell小試牛刀

來源:互聯網
上載者:User

Bash Shell 小試牛刀,bashshell小試牛刀
一、終端列印

[root@cai ~]# echo welcome to bash!

welcome to bash!

 

[cairui@cai ~]$ echo 'welcome to bash!'

welcome to bash!

 

[cairui@cai ~]$ echo "welcome to bash\!"

welcome to bash\!

(注意,雙引號內不能直接用特殊符號,需要用轉義符\)

 

[cairui@cai ~]$ printf "hello world"

hello world

 

#!/bin/bash

#filename:printf.sh

 

printf  "%-5s %-10s %-4s\n" no name mark

printf  "%-5s %-10s %-4.2f\n" 1 sarath 80.3456

printf  "%-5s %-10s %-4.2f\n" 2 james 90.9989

printf  "%-5s %-10s %-4.2f\n" 3 jeff 77.564

得到如下結果

[cairui@cai shell]$ sh printf.sh

no    name       mark

1     sarath     80.35

2     james      91.00

3     jeff       77.56

 

1.工作原理

  %s ,%c,%d和%f都是格式替換符,其所對應的參數可以置於帶引號的格式字串之後。

  %-5s指明格式為靠左對齊且寬度為5的字串替換,不夠的用空格補上。

  對於%-4.2f,其中.2指定保留2個小數位。

2.補充內容

(1)在echo中轉義分行符號

[cairui@cai shell]$ echo -e "1\t2\t3"

1 2 3

(2)列印彩色輸出

重設=0,黑色=30,紅色=31,綠色=32,黃色=33,藍色=34,洋紅=35,青色=36,白色=37

列印彩色文本

 

[cairui@cai shell]$ echo -e "\e[1;31m this is red text \e[0m"

 this is red text

 

設定彩色背景,重設=0,黑色=40,紅色=41,綠色=42,黃色=43,藍色=44,洋紅=45,青色=46,白色=47

 

 

二、 玩轉變數和環境變數

  在bash中,每一個變數的值都是字串。無論你給變數賦值時有沒有引號,值都是以字串形式存在。有一些特殊的變數會被shell環境和作業系統環境用來儲存一些特別的值,這類變數就稱為環境變數。

Cat /proc/$PID/environ(查看運行時的環境變數)

例子:

[cairui@cai shell]$ pgrep mysql

11029

11313

[cairui@cai shell]$ sudo cat /proc/11313/environ

TERM=xtermOLDPWD=/application/mysqlPATH=/sbin:/usr/sbin:/bin:/usr/bin:/application/mysql/binPWD=/application/mysqlSHLVL=3MYSQL_HOME=/application/mysql_=/usr/bin/nohup

[cairui@cai shell]$ sudo cat /proc/11313/environ |tr '\0' '\n'

TERM=xterm

OLDPWD=/application/mysql

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/application/mysql/bin

PWD=/application/mysql

SHLVL=3

MYSQL_HOME=/application/mysql

_=/usr/bin/nohup

 

1.實戰演練

 

[cairui@cai shell]$ var=value

[cairui@cai shell]$ echo $var

value

 

Variable.sh代碼如下:

#!/bin/bash

fruit=apple

count=5

echo "we have $count $fruit(s)"

[cairui@cai shell]$ sh variable.sh

we have 5 apple(s)

 

Export命令就是用來設定環境變數:

[cairui@cai shell]$ echo $PATH

/application/mysql/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/application/xtrabackup/bin:/home/cairui/bin

[cairui@cai shell]$ export PATH="$PATH:/home/cairui"

[cairui@cai shell]$ echo $PATH

/application/mysql/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/application/xtrabackup/bin:/home/cairui/bin:/home/cairui

 

2.補充內容

length=${#var}

例如:

[cairui@cai shell]$ vai=1234567890

[cairui@cai shell]$ echo ${#vai}

10

 

三、 使用函數添加環境變數

  PATH=/usr/bin;/bin

這意味著只要shell需要執行二進位可執行檔時,它會首先尋找/usr/bin,然後是/bin

 

四、 使用shell進行數學運算

  在bash shell環境中,可以利用let,[],(())執行基本的算術操作。而在進行進階操作時,expr和bc這兩個工具也會非常有用。

1.執行個體

#!/bin/bash

#filename:jia.sh

no1=4;

no2=5;

let result=no1+no2

echo $result

[cairui@cai shell]$ sh jia.sh

9

自加操作

let no1++

自減操作

let no1--

簡寫形式

let no+=6

let no-=6

它們分別等於let no=no+6和let no=no-6

(2)bc是一個數學進階工具,這個精密計算機包含了大量的選項。

 

[root@cai ~]# echo "4*8"|bc

32

 

no=54

result=’echo “$no*1.5”|bc’

echo $result

81.0

l 設定小數精度。下面,參數scale=2將小數位個數設定為2.

[cairui@cai shell]$ echo "scale=2;3/8"|bc

.37

進位轉換。用bc可以將一種進位系統轉換為另一種。(10進位轉換2進位)

#!/bin/bash

#用途:數字轉換

 

no=100

echo "obase=2;$no" |bc

 

no=1100100

echo "obase=10;ibase=2;$no" |bc

[cairui@cai shell]$ sh shuzizhuanhuan.sh

1100100

100

l 計算平方及平方根

[cairui@cai shell]$ echo "sqrt(100)"|bc

10

 

[cairui@cai shell]$ echo "10^10"|bc

10000000000

 

五、 玩轉檔案描述符及重新導向

  檔案描述符是與檔案輸入、輸出相關聯的整數。它們用來跟蹤已開啟的檔案。最常見的檔案描述符是stdin(標準輸入)、stdout(標準輸出)和stderr(標準錯誤)。

0-----stdin

1-----stdout

2-----stderr

1.執行個體

[cairui@cai shell]$ echo "this is a sample text " >temp.txt

[cairui@cai shell]$ cat temp.txt

this is a sample text

[cairui@cai shell]$ echo "this is a sample text " >>temp.txt

[cairui@cai shell]$ cat temp.txt

this is a sample text

this is a sample text

當命令出現錯誤時,錯誤資訊就會被列印出來

 

[cairui@cai shell]$ ls +

ls: cannot access +: No such file or directory(錯誤資訊)

 

2.工作原理

>等同於1>;對於>>也是等同於1>>

(1)將檔案重新導向到命令

cmd < file

(2)將指令碼內部的文字區塊進行重新導向

#!/bin/bash

cat<<EOF>log.txt

LOG FILE HEADER

this is a test log

function:system statistics

EOF

 

[cairui@cai shell]$ sh log-txt.sh

[cairui@cai shell]$ cat log.txt

LOG FILE HEADER

this is a test log

function:system statistics

 

六、 數組和關聯陣列

array_var=(1  2  3  4  5  6)#這些值將會儲存在以0為起始索引的連續位置上

另外還可以將數組定義為一組“索引-值”

array_var[0]=”test1”

array_var[1]=”test2”

......

......

......

......

array_var[5]=”test6”

 

echo $array_var[0]

test1

 

echo $array_var[*]

test1 test2 test3 test4 test5 test6

 

列印數組長度

echo ${#array_var[*]}

6

 

七、 使用別名

(1)可以用以下方式建立一個別名

alias new_command=’command sequence’

(2)上述別名只是暫時的。為了使別名永久生效,可以將它放在~/.bashrc檔案中

echo ‘alias cmd=”commadn seq”’ >> ~/.bashrc

(3)刪除別名,只需要從~/.bashrc中刪除就可以了

 

八、 擷取終端資訊

  tput和stty是兩款終端處理工具。

1.執行個體

l 擷取終端的行數和列數:

tput cols

tput lines

l 列印當前終端名:

tput longname

l 將游標移動到座標(100,100)處:

tput cup 100 100

l 設定終端背景色:

tputsetb n

其中,n可以在0到7之間取值

l 設定文本樣式為粗體

tput bold

l 設定底線的起止:

tput smu1

tput rmu1

l 刪除從當前游標位置到行尾的所有內容:

tputed

l 在輸入密碼時,不應該顯示輸入內容:

#!/bin/bash

#filename:password.sh

echo -e “enter password:”

stty -echo

read password

stty echo

echo

echo password read

 

九、擷取、設定日期和延遲

   很多程式要以不同的格式列印日期、設定日期和時間、根據日期和時間執行操作。延時通常用於在程式執行過程中提供一段等待時間(比如1秒)。例如需要在指令碼中對某項任務每隔5秒監視一次,就需要知道如何在程式中加入延時。

1.執行個體

(1)[cairui@cai support-files]$ date

Tue Jun  6 15:27:22 CST 2017

(2)列印紀元時:

[cairui@cai support-files]$ date +%s

1496734094

 

[cairui@cai support-files]$ date --date "jan 20 2011" +%A

Thursday

(3)用格式串結合+作為date命令的參數:

[cairui@cai support-files]$ date "+%d %b %y"

06 Jun 17

(4)設定時間和日期:

date -s “格式化的日期文字”

例子:

date -s “21 june 2009 11:01:22”

(5)有時,我們需要檢查一組命令所花費的時間,以下代碼:

#!/bin/bash

#filename:time_take.sh

start=$(date +%s)

commands;

statements;

 

end=$(date +%s)

difference=$((end - start))

echo time taken to execute commands is $difference seconds

2.工作原理

日期內容

格式

星期

%a(A)

%b(B)

%d

固定格式日期(mm、dd、yy)

%D

%y(Y)

小時

%I或%H

分鐘

%M

%S

納秒

%N

Unix紀元時(以秒為單位)

%s

 

 

3.補充內容

 在指令碼中延遲執行一段時間,可以用sleep;$sleep no_of_seconds.例如,下面的指令碼就使用tput和sleep從0開始計數到40:

#!/bin/bash

#filename:sleep.sh

echo -n Count:   (echo -n不換行輸出)

tput sc

 

count=0;

while true;

do

  if [ $count -lt 40 ];

  then

      let count++;

      sleep 1;

      tput rc

      tput ed

      echo -n $count;

  else exit 0;

  fi

done

  在上面的例子中,變數count初始化為0,隨後每迴圈一次便加1.echo語句列印出count的值。用tput sc儲存游標的位置。在每次迴圈中,通過恢複之前儲存的游標的位置,在終端中列印出新的count的值。恢複游標的命令是tput rc。tput ed清除從當前游標位置到行尾之間的所有內容,使得舊的count值可以被清除並寫入新值。迴圈內的1秒鐘延遲是通過sleep命令來實現。

 

十、 調試指令碼

(1)bash -x script.sh or sh -x script.sh

(2)使用set -x和set +x對指令碼進行部分調試。例如:

#!/bin/bash

#filename:debug.sh

for i in {1..6};

do

    set -x

    echo $i

    set +x

done

echo "script executed"

[cairui@cai shell]$ sh debug.sh

+ echo 1

1

+ set +x

+ echo 2

2

+ set +x

+ echo 3

3

+ set +x

+ echo 4

4

+ set +x

+ echo 5

5

+ set +x

+ echo 6

6

+ set +x

script executed

在上面的指令碼中,只會列印出 echo $i的調試資訊。因為使用了-x和+x對調試地區進行了限制。

(3)前面兩種調試都是內建的。他們通常以固定的格式產生調試資訊。但是在很多情況下,我們需要以自訂格式顯示調試資訊。可以通過傳遞_DEBUG環境變數來建立這類調試風格。

#!/bin/bash

function DEBUG()

{

  [ "$_DEBUG" == "on" ]  && $@ || :

 

}

for i in {1..10}

do

  DEBUG echo $i

done

~          

[root@cai shell]# _DEBUG=on ./DEBUG.sh

1

2

3

4

5

6

7

8

9

10

我們在每一個需要列印調試資訊的語句前加上DEBUG。如果沒有把_DEBUG=on傳遞給指令碼,那麼調試資訊就不會被列印出來。在bash中,命令“:”告訴shell不要進行任何操作。

 

十一、 函數和參數

1.執行個體

我們可以建立執行特定任務的函數,也可以建立能夠接受參數的函數。

(1)定義函數:

function fname()

{

  statements;

}

或者

fname()

{

  statements;

}

(2)只需要使用函數名就可以調用某個函數:

$fname  #執行函數

(3)參數可以傳遞給函數,並由指令碼進行訪問:

fname arg1 arg2;#傳遞函數

以下是函數fname 的定義。在函數fname中,包含了各種訪問函數參數的方法。

fname()

{

echo $1,$2;訪問參數1和參數2

echo “$@”;以列表的方式一次性列印所有參數

echo “$*”;類似於¥@,但是參數被作為單個實體

return 0;傳回值

}

l $1是第一個參數

l $2是第二個參數

l $n是第n個參數

l “$@”被擴充成”$1” “$2” “$3”等

l “$*”被擴充成”$1c$2c$3”,其中c是IFS的第一個字元

l “$@”要比$*用的多。

2.補充內容

(1)遞迴函式

f() {echo $1;f hello;sleep 1;}

(2)匯出函數

export -f fname

 

十二、 不適用斷行符號鍵來讀取n個字元

  read是一個重要的bash命令,它用於從鍵盤或標準輸入中讀取文本。我們可以使用read以互動的形式讀取來自使用者的輸入,不過read能做的可遠遠不止於此。任何程式設計語言的輸入庫大多都是從鍵盤讀取輸入;但只有當斷行符號鍵按下的時候,才標誌著輸入完畢。而有些遊戲裡只需要按q就能釋放技能。

(1)下面的語句從輸入中讀取n個字元並存入變數variable_name;

read -n number_of_chars variable_name

例如:

read -n 2 var

echo $var

(2)用無回顯的方式讀取密碼:

read -s var

(3)顯示提示資訊:

read -p “enter input:” var

(4)在特定時限內讀取輸入:

read -t timeout var

 

read -t 2 var  #在2秒內將鍵入的字串讀入變數var

(5)用特定的定界符作為輸入行的結束:

read -d delim_char var

 

read -d “:” var

hello:#var 被設定為hello

 

十三、 運行命令直至執行成功

  在日常工作中使用shell時,有時候命令只有滿足某些條件或是某種外來事件(例如檔案可以被下載)操作才能成功執行。這種情況下,你可能希望重複執行命令,直到成功為止。

1.執行個體:

按照以下方式定義函數:

repeat()

{

 while true

 do

$@ && return

done

}

或者把它放入shell的rc檔案,更便於使用:

repeat() {while true;do $@ && return;done}

2.工作原理

  我們建立了函數repeat,它包含了一個無限while迴圈,該迴圈執行以參數形式(通過$@訪問)傳入函數的命令。如果命令執行成功,則返回,進而無限迴圈。

3.補充內容

(1)一種更快的做法

repeat() {while :; do $@ && return; done } 比第一種方法快

(2)增加延時

repeat wget -c ........

repeat() {while :; do $@ && return; sleep 30; done}這使得命令每30秒運行一次。

十四、 迴圈

(1)for迴圈

for var in list;

do

commands;

done

(2)while迴圈

while condition

do

   commands;

done

(3)until迴圈

它會一直迴圈,直到給定的條件為真。

x=0;

until [ $x -eq 9 ];

do

 let x++; echo $x;

done

 

十五、 比較與測試

1.實戰

(1)if條件

if condition;

then

  commands;

fi

(2)else if和else

if condition;

then

  commands;

else if condition; then

  commands;

else

  commands;

fi

(3)算數比較

l 對變數或值進行算數條件判斷:

[ $var -eq 0 ] #當$var等於0時,返回真

[ $var -ne 0 ] #當。。。為非0時,返回真

l -gt:大於

l -lt:小於

l -ge:大於或等於

l -le:小於或等於

(4)字串比較

使用字串比較時,最好用雙中括弧,因為有時候採用單個中括弧會產生錯誤,所以最好避開它們。

l [[$str1=$str2]],相等返回真

l [[$str1==$str2]]檢查字串是否相等的另一種寫法

l [[$str1 !=$str2]]如果str1和str2不相同,則返回真

l [[$str1 > $str2]]

l [[$str1 < $str2]]

l [[-z $str1]],如果包含的是Null 字元串,返回真

l [[-n $str]],如果包含的是非Null 字元串,則返回真

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.