基礎的shell腳本

shell編程必須知道的基本語法:shell

1. 如何使用多個命令express

方法一:在終端上使用「;」來隔開不一樣的命令編程

方法二:建立一個shell 腳本bash

  1. 如何建立一個shell腳本-----shell腳本的基本格式

#!/bin/bash函數

#this is the first shelloop

date學習

whoui

#the endthis

3. 如何運行一個shell腳本程序spa

chmod u+x test

./test

  1. shell腳本中的echo命令------至關於c語言中的printf

·格式以下:

echo This is a test

echo This is a test to see if it will work

echo Rich says scripting is easy .

echo Lets see whos logged into the system:   

echo n 的用法

  1. 使用變量

a) 環境變量

b) 用戶變量

在變量名字前面加上$符號來引用變量的值

如:

days=10

#等於號兩邊不能有空格

guest=Katie

echo $guest will visite us $days days after

  1. 反引號----shell腳本中最重要的特性之一,反引號容許你將shell命令的輸出賦值給一個變量,注意shell中的變量不須要顯式指定類型,系統會自動識別,能夠直接調用

如:

testing=`date`

echo The date and time are:  $testing

一個讓系統自動建立日誌文件日期的方法:

today=`date +%y%m%d`

ls /usr/bin al > log.$today

  1. 重定向輸入和輸出

a) 輸出重定向

command > outputfile

b) 輸入重定向

command < inputfile

c) 內聯輸入重定向

command << marker

sentences

marker

  1. 管道 command | command

rpm qa | more

rpm qa | sort

  1. 如何在shell中進行數學運算

a) expr命令------只能進行整數類型的運算,且須要使用反引號來獲取expr命令的輸出

b) 使用方括號來代替expr命令進行運算

格式:var=$[ 運算表達式 ]

c) 進行浮點運算的解決方法,使用shell內建的bash計算器,小數點位數是由scale變量來控制的

如終端下使用:

bc q#終端輸入

3.44 / 5

0#結果

scale=4#設置scale

3.44 / 5

.6880#結果

quit

shell腳本中使用:

格式:var=`echo options; expression | bc`

如:

#!/bin/bash

var1=`echo scale=4; 3.44 / 5 | bc`

echo The answer is $var1

如何進行多個表達式的運算:

#!/bin/bash

var1=10.46

var2=43.67

var3=33.2

var4=71

var5=`bc << EOF

scale=4

a1 = ($var1 * $var2)

a2 = ($var3 * $var4)

a1 + a2

EOF

`

  1. 命令的退出狀態碼,每一個命令都有一個退出狀態碼,成功執行爲0,不成功非0,用echo $?命令能夠查看退出狀態碼,可是用exit 命令能夠指定退出狀態碼的值

 

結構化命令編程:

  1. 使用if-then語句,格式以下:

if command

then

commands

fi

或者

if command ; then

commands

fi

  1. 使用if  then  else 語句,格式以下:

if command

then

commands

else

commands

fi

  1. 嵌套使用if,格式以下:

if command1

then

commands

elif command2

then

more commands

fi

  1. 前面所講的if-else語句,if只能接受shell命令做爲判斷條件,不能接受普通的任意表達式,使用test能夠克服這個缺點,格式以下:

if test condition

then

commands

fi

或者

if [ commands ]

then

commands

fi

test命令能夠判斷3類條件:

·數值比較

n1 eq n2;檢查n1,n2是否相等

n1 ge n2;檢查n1是否大於等於n2

n1 gt n2;檢查n1是否大於n2

n1 le n2;檢查n1是否小於等於n2

n1 -lt n2;檢查n1是否小於n2

n1 ne n2;檢查n1是否不等於n2

·字符串比較

str1 = str2;檢查str1是否和str2相同

str1 != str2;檢查str1是否和str2不一樣

str1 < str2

str1 > str2

-n str1;檢查str1的長度是否非0

-z str1;檢查str1的長度是否爲0

·文件比較

-d file;檢查file是否存在並是一個目錄

-e file;檢查file是否存在

-f file;檢查file是否存在並是一個文件

-r file;檢查file是否存在並可讀

-s file;檢查file是否存在並不是空

-w file

-x file

-O file;檢查file是否存在並屬當前用戶全部

-G file;檢查file是否存在而且默認組與當前用戶相同

file1 nt file2;檢查file1是否比file2

file1 ot file2;檢查field1是否比file2

  1. 前面咱們所講的if-then語法格式並不符合咱們c語言中的格式,如今咱們來說一下if-then的高級特性

a) 使用雙圓括號(有些地方稱做雙尖括號)容許你將高級數學表達式放入進行比較

如:if (( $var1 ** 2 > 90 ))

 then

commands

fi

雙尖括號裏面能夠識別的命令符號:var++, var--, ++var, --var, !邏輯求反, ~位求反, **冪運算, <<, >>, &, |, &&, ||

有了這些,咱們的shell就和c語言的語法比較接近了。

b) 使用雙方括號[[ expression ]] 針對字符串進行比較的高級特性,對字符串進行模式匹配

如:

#!/bin/bash

if [[ $USR == r* ]]

then

echo Hello $USR

else

echo Sorry, I dont know you

fi

  1. case命令來替換if-then-else語句,對比c語言語法格式來學習

直接來例子進行比較:

例子1

#!/bin/bash

if  [ $USER = Rich ]

then

echo welcome $USER

elif  [ $USER = barbara ]

then

echo welcome $USER

elif [ $USER = testing ]

then

echo welcome $USER

else

echo sorry, you are not allowed here

fi

例子2

case $USER in

Rich | Barbara)

echo Welcome, $USER;;#注意結尾符號

testing)

echo Welcome, $USER, nice your visite;;

*)#至關於default

echo sorry, we are not allowed here;;

esac#結束標識

  1. 更多的結構化命令

a) for命令格式

for var in list

do

commands

done

var讀取list裏面的值進行遍歷輸出

如:

for test in Albame Alaska Arizona California

do

echo The next place is $test

done

 如:

for file in /etc/*

do

if [ -d $file ]

then

echo $file is a directory

elif [ -f $file ]

then

echo $file is a file

fi

done

b) c語言風格的for命令

for (( a = 1; a < 10; a++ ))

do

echo  The number  is $a

done

c) while命令

格式:

while [ command ]

do

commands

done

如:

var1=10

while [ $var1 gt 0 ]

do

echo $var1

var1=$[ $var1  1 ]

done

d) until命令,與while命令工做的方式相反

格式:

until [ commands ]

do

commands

done

e) 嵌套循環

如:

for (( a = 1; a <= 3; a++ ))

do

echo Starting loop $a:

for (( b = 1; b <= 3; b++ ))

do

break 2

echo   Insert loop $b

done

done

循環語句一個比較有實際意義的用法是循環處理文件數據,如你能夠編程實現逐行遍歷/ets/passwd文件並輸出內容,這裏你須要將IFS變量的值改成冒號

f) break 命令和continue 命令

g) 處理循環的輸出,你能夠添加一個命令將循環的輸出不顯示在屏幕上,而是重定向到一個文件夾

只須要在done命令後加上如:done > output.txt

三.前面咱們程序裏面須要的變量都是預先定義賦好值的,不能進行交互式的輸入,這在通常程序設計時是不可能的,如今咱們講一下如何向程序裏面傳遞參數

1.第一種方法是用命令行參數來向程序傳遞參數

如:./test  3  5,這個命令行咱們輸入了三個參數,在程序裏直接對應$0,$1,$2,它們至關於變量的名字,在程序裏能夠直接調用,至關於$1=3, $2=5$#表示傳遞給函數的參數個數。

2.另外一種方法是用read命令,可讓你在程序執行期間進行輸入,如:

echo n Enter your name:

read name

echo Hello $name, nice name.

從文件test中讀取內容的方法:

count=1

cat test | while read line

do

echo Line $count: $line

count=$[ $count + 1 ]

done

echo I have finished read file

 

四.如何定時運行程序和如何讓程序開機時運行

1.at 命令來計劃執行做業

at [ -f  filename ] time

2. at命令只能讓程序在某個時間只執行一次,運用cron時間表可讓咱們實現按期要執行的腳本

cron時間表命令格式以下:

min hour dayofmonth month dayofweek command(腳本全路徑)

  1. 開機時運行腳本,很簡單,只要你將你要運行的腳本放在開機時須要執行的腳本文件夾下就能夠了,固然具體執行的時候還涉及到不少內容,這裏不詳述了。

 

.shell腳本函數

1.基本腳本函數

(1).建立函數兩種方法:

a.function name{

commands

}

b.  name( ) {

commands

}

如:

 

注意:每一個函數名必須惟一,若是從新定義函數那麼新定義將取代函數原先的定義,而這不會引起錯誤消息。

2.函數退出狀態

Bash shell將函數看做小型腳本,並以退出狀態結束,函數退出狀態有三種方式

(1) 使用標準變量$?來肯定函數的退出狀態

(2) 使用return命令

 

(3) 使用函數輸出

 

3.向函數傳遞參數

以下:

 

這裏的函數所使用的參數值爲私有的參數環境變量,因此函數沒法從腳本命令行訪問腳本參數值,即函數所使用的變量$1$2,不一樣於腳本主代碼的變量$1$2,若是函數想使用,必須在調用該函數時手動傳遞這些數據。

4.函數使用的全局變量和局部變量

1)全局變量是在shell腳本內到處有效的變量。默認狀況下,腳本中定義的變量都是全局變量,在函數外部定義的變量,在函數內部仍能正常訪問

2)與全局變量相對,函數內部使用的變量能夠稱爲局部變量,只須要在局部變量前面冠以local關鍵字,關鍵字local確保變量僅在函數內部使用,若是腳本在函數外部有同名變量,那麼shell將能區分開這兩個變量。

相關文章
相關標籤/搜索