linux下shell編程
⑴ linux下如何實現shell多線程編程以提高應用程序的響應
Linux中多線程編程擁有提高應用程序的響應、使多cpu系統更加有效等優點,下面小編將通過Linux下shell多線程編程的例子給大家講解下多線程編程的過程,一起來了解下吧。
#!/bin/bash
#———————————————————————————–
# 此例子說明了一種用wait、read命令模擬多線程的一種技巧
# 此技巧往往用於多主機檢查,比如ssh登錄、ping等等這種單進程比較慢而不耗費cpu的情況
# 還說明了多線程的控制
#———————————————————————————–
function a_sub
{
# 此處定義一個函數,作為一個線程(子進程)
sleep 3 # 線程的作用是sleep 3s
}
tmp_fifofile=「/tmp/$.fifo」 mkfifo $tmp_fifofile # 新建一個fifo類型的文件
exec 6《》$tmp_fifofile # 將fd6指向fifo類型
rm $tmp_fifofile thread=15 # 此處定義線程數
for
((i=0;i《$thread;i++));do echo
done 》&6 # 事實上就是在fd6中放置了$thread個回車符
for
((i=0;i《50;i++));do # 50次循環,可以理解為50個主機,或其他
read -u6 # 一個read -u6命令執行一次,就從fd6中減去一個回車符,然後向下執行,
# fd6中沒有回車符的時候,就停在這了,從而實現了線程數量控制
{ # 此處子進程開始執行,被放到後台
a_sub &&
{ # 此處可以用來判斷子進程的邏輯
echo 「a_sub is finished」
}
||
{ echo 「sub error」
}
echo 》&6 # 當進程結束以後,再向fd6中加上一個回車符,即補上了read -u6減去的那個
}
& done wait # 等待所有的後檯子進程結束
exec 6》&- # 關閉df6 exit 0
說明:
此程序中的命令
mkfifo tmpfile
和linux中的命令
mknod tmpfile p
效?果相同。區別是mkfifo為POSIX標准,因此推薦使用它。該命令創建了一個先入先出的管道文件,並為其分配文件標志符6。管道文件是進程之間通信的一種方式,注意這一句很重要
exec 6《》$tmp_fifofile # 將fd6指向fifo類型
如果沒有這句,在向文件$tmp_fifofile或者&6寫入數據時,程序會被阻塞,直到有read讀出了管道文件中的數據為止。而執行了上面這一句後就可以在程序運行期間不斷向fifo類型的文件寫入數據而不會阻塞,並且數據會被保存下來以供read程序讀出。
通過運行命令:
time 。/multithread.sh 》/dev/null
最終運算時間: 50/15 = 3組(每組15)+1組(5個《15 組成一個組)= 4組,每組花費時間:3秒,
則 3 * 4 = 12 秒。
傳統非多線程的代碼 運算時間: 50 * 3 = 150 秒。
上面就是Linux下shell多線程編程的實例介紹了,使用多線程編程還能夠改善程序結構,有興趣的朋友不妨試試看吧。
⑵ 如何學好linux中的shell編程
1、首先建立一個內容如下的文件,名字為date,將其存放在目錄下的bin子目錄中。
#Program date
#usageto ::show the date in this way (注釋)
echo 「Mr.$USER,Today is:」
echo date 「+%B%d%A」
echo 「Whish you a lucky day !」
2、編輯完該文件之後它還不能執行,我們需要給它設置可執行許可權。使用如下命令:
chmod +x date
通過以上過程之後,我們就可以像使用ls命令一樣執行這個shell程序.
[beichen@localhost bin]$ date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
為了在任何目錄里都可以執行這個程序,可以將bin的這個目錄添加到路徑中去。
[beichen@localhost bin]$ PATH=$PATH:$HOME/bin
(註:這里的$HOME代替的是/home/beichen,而bin目錄是自己建的一個目錄)
另外一種執行date的方法就是把它作為一個參數傳給shell命令:
[beichen@localhost /]$ bash date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
盡管在前面我們使用chmod +x date將date設置為可執行,其實不設置也沒有關系,但在Linux里執行它,需要先告訴系統它是一個可執行的腳本。
[beichen@localhost /]$ .date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
即在date前面加上一個點」.」,並且用空格與後面的shell腳本的文件名隔開。當然,不推薦這樣做。
二、shell參數
如同ls 命令可以接受目錄等作為它的參數一樣,在shell編程時同樣可以使用參數。Shell有位置參數和內部參數。
1、 位置參數
由系統提供的參數稱為位置參數。位置參數的值可以用$N得到,N是一個數字,如果為1,即$1.類似C語言中的數組,Linux會把輸入的命令字元串分段並給每段進行標號,標號從0開始。第0號為程序名字,從1開始就表示傳遞給程序的參數。如$0表示程序的名字,$1表示傳遞給程序的第一個參數,以此類推。
2、 內部參數
上述過程中的$0是一個內部變數,它是必須的,而$1則可有可無。和$0一樣的內部變數還有以下幾個。
$# ----傳遞給程序的總的參數數目
$? ----上一個代碼或者shell程序在shell中退出的情況,如果正常退出則返回0,反之為非0值。
$* ----傳遞給程序的所有參數組成的字元串。
下面舉例進行說明:
建立一個內容為如下的程序P1:
echo 「Program name is $0」
echo 「There are totally $# parameters passed to this program」
echo 「The last is $?」
echo 「The parameters are $*」
執行後的結果如下:
[beichen@localhost bin]$ P1 this is a test program //傳遞5個參數
Program name is /home/beichen/bin/P1 //給出程序的完整路徑和名字
There are totally 5 parameters passed to this program //參數的總數
The last is 0 //程序執行結果
The parameters are this is a test program //返回有參數組成的字元串
下面我們利用內部變數和位置參數編寫一個名為del的簡單刪除程序:
#name: del
#author: liangnian
#this program to compress a file to the stbin
if test $# -eq 0
then
echo 「Please specify a file!」
else
gzip $1 //先對文件進行壓縮
mv $1.gz $HOME/stbin //移動到回收站
echo 「File $1 is deleted !」
fi
三、變數表達式
在上面我們編寫的小程序中我們用到了一個關鍵字test,其實它是shell程序中的一個表達式?D?D比較(test)。通過和shell提供的if等條件語句(後面我們會介紹)相結合我們可以方便的完判斷。
其用法如下:
test 表達式
表達式所代表的操作符有字元串操作符、數字操作符、邏輯操作符以及文件操作符。其中文件操作符是一種shell獨特的操作符,因為shell里的變數都是字元串,為了達到對文件進行操作的目的,於是才提供了這樣的一種操作符。
1、 字元串比較
作用:測試字元串是否相等、長度是否為零,字元串是否為NULL(註:bash區分零長度字元串和空字元串)
常用的字元穿操作符有:
= 比較兩個字元串是否相同,同則為「是」!= 比較兩個字元串是否相同,不同則為「是」
-n 比較字元串長度是否大於零,如果大於零則為「是」
-z 比較字元串的穿度是否等於零,如果等於則為「是」
2、 數字比較
這里區別於其他編程語言,test語句不使用>?類似的符號來表達大小的比較,而是用整數式來表示這些。
-eq 相等
-ge 大於等於
-le 小於等於
-ne 不等於
-gt 大於
-lt 小於
3、 邏輯操作! 反:與一個邏輯值相反的邏輯值
-a 與(and):兩個邏輯值為「是」返回值才為「是」,反之為「否」
-o 或(or):兩個邏輯值有一個為「是」,返回值就為「是」
4、 文件操作
文件測試表達式通常是為了測試文件的信息,一般由腳本來決定文件是否應該備份、復制或刪除。由於test關於文件的操作符有很多,我們只列舉一些常用的。
-d 對象存在且為目錄返回值為「是」
-f 對象存在且為文件返回值為「是」
-L 對象存在且為符號連接返回值為「是」
-r 對象存在且可讀則返回值為「是」
-s 對象存在且長度非零則返回值為「是」
-w 對象存在且可寫則返回值為「是」
-x 對象存在且可執行則返回值為「是」
file1 ?Cnt(-ot) file2 文件1比文件2新(舊)
四、循環結構語句
shell常見的循環語句有for循環、while循環、until循環
for 循環
語法:for 變數 in 列表
do
操作
done
註:變數是要在循環內部用來指代當前所指代的列表中的那個對象的。
列表是在for 循環的內部要操作的對象,可以是字元串也可以是文件,如果是文件則為文件名。
例:刪除垃圾箱中的所有.gz文件
#delete all file with extension of 「gz」 in the stbin
for I in $HOME/stbin/*.gz
do
rm ?Cf $i
echo 「$i has been deleted!」
done
執行結果如下:
[beichen@localhost bin]$.f_rmgz
/home/beichen/stbin/nessus-4.0.0.2.tar.gz has been deleted!
/home/beichen/stbin/gftp-2.2.1.tar.gz has been deleted!
⑶ linux shell 編程
(1)編寫shell程序fileback:
#!/bin/sh
DIRNAME=`ls /root | grep bak`
if [ -z "$DIRNAME" ] ; then
mkdir /root/bak
cd /root/bak
fi
YY=`date +%y`
MM=`date +%m`
DD=`date +%d`
BACKETC=$YY$MM$DD_etc.tar.gz
tar zcvf $BACKETC /etc
echo "fileback finished!"
(2)編寫任務定時器:
echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron
crontab /root/etcbakcron
或使用crontab -e 命令添加定時任務:
0 1 * * * /bin/sh /usr/bin/fileback
⑷ linux shell腳本編程什麼意思
shell腳本編程,你可以想像成自動化處理,只要你將套路都設定好,他就會自動工作。
比如,你設定了
1、早上8點保存並分析昨天保存的系統有沒有出錯;
2、接著監測系統每隔一個時間段的CPU運行率,若連續幾次都是98%~100%,就發信息到你手機上讓你查看。
就這么簡單···
⑸ Linux shell編程
你看看吧,我寫了一個。第二個多了個$sh後面只有一個$
⑹ linux 怎麼進入shell編程模式
1、連接上相應的linux主機,進入到等待輸入shell指令的linux命令行狀態下。
⑺ linux中的shell編程題
1設計一個shell腳本:將當前工作目錄下的文件名按字母由大到小的順序列出所有文件名。
#!/bin/bash
ls | sort
2設計一個shell腳本:將所有輸入的整數相加
#!/bin/bash
sum=0
while [ 1 ]
do
read -p "input number:" num
if [ -z $num ]
then
break
fi
let sum=$[$sum + $num]
echo sum=$sum
done
⑻ linux中的shell編程是什麼,是在終端運行的嗎
是的,shell編程就是編寫終端命令執行腳本
⑼ linux的shell編程
工作或者讀書等)需要學習linux的人,需要系統的學習一下,最好有一本好的書來學習。linux是世界各地的黑客們寫出來的開源系統,對於熱愛學習計算機技術(演算法、數據結構、編程、操作系統……)的人來說,linux是一個天堂。我個人就是完全因為興趣而搗鼓linux,和工作不沾邊。有幾種不同的學習:a)使用->需要學習linux的一些歷史、各種命令、桌面的操作、shell的知識b)編程->學習linux的介面c)系統管理->學習一些管理員需要掌握的命令d)內核、源碼->先要學好操作系統原理,然後慢慢鑽研。linux是一個很奇怪的東西,因為你知道的越多,你的問題就越多。如果你將來用的上,那麼學習linux自然有用。如果用不上,學習linux的作用在於折騰你的精力、開拓你的思維、視野、提高自學能力。從你付出的機會成本的角度來說,學習linux不合算,因為你應該把有限的時間用來學習對你更重要的東西,而不是不沾邊的linux。除非把linux當作一種愛好。所謂「衣帶漸寬終不悔,為伊消得人憔悴」。自然是另一番感受。當你用shell編寫個自己能用上的腳本你就知道有用拉而且還老有成就感拉比如你需要搜索全盤文件,把大寫名字改為小寫,這樣的程序用幾行shell就能寫,但是無論C還是其它語言都非常麻煩,手工修改就更麻煩。明白shell程序設計的用處嗎,任何一種語言都有他自己的適用領域