當前位置:首頁 > 科技 > 正文

shell中的while循環(shell中for循環語句)

shell中的while循環(shell中for循環語句)

很多朋友對于shell中的while循環和shell中for循環語句不太懂,今天就由小編來為大家分享,希望可以幫助到大家,下面一起來看看吧!求個shell腳本,用戶輸入...

很多朋友對于shell中的while循環和shell中for循環語句不太懂,今天就由小編來為大家分享,希望可以幫助到大家,下面一起來看看吧!

求個shell腳本,用戶輸入一個數字,判斷該數字大于、小于一個數字,如100。等于時退出該循環

[lotto@logging~]$cattest.sh#!/bin/shi=0while[1-gt0]doecho-e"請輸入數字:"readnumif[$num-gt100]thenecho"大于100"elif[$num-lt100]thenecho"小于100"elseecho"等于100,退出程序"breakfii=`expr$i+1`done[lotto@logging~]$./test.sh請輸入數字:4小于100請輸入數字:105大于100請輸入數字:100等于100,退出程序[lotto@logging~]$

Linux中shell腳本中的while read line的取值疑問

while使用重定向機制,ip.txt文件中的信息都已經讀入并重定向給了整個while語句。所以當我們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這里,ssh語句正好回讀取輸入中的所有東西。為了禁止ssh讀所有東西增加一個</dev/null,將ssh的輸入重定向輸入

shell腳本while true怎么中斷

在shell腳本中,使用whiletrue循環可以無限循環執行某段代碼。要中斷這個循環,可以使用break語句。當滿足某個條件時,使用break語句可以立即跳出循環,終止代碼的執行。

例如,可以在循環體內部添加一個條件判斷,當滿足條件時,使用break語句中斷循環。這樣可以有效地控制循環的執行,避免無限循環。

Linux中,shell腳本如何使用信號機制去控制線程的開啟關閉

trap是Linux的內建命令,用于捕捉信號,trap命令可以指定收到某種信號時所執行的命令。trap命令的格式如下:trapcommandsig1sig2...sigN,當接收到sinN中任意一個信號時,執行command命令,command命令完成后繼續接收到信號前的操作,直到腳本結束。利用trap命令捕捉INT信號(即與Ctrl+c綁定的中斷信號)。trap還可以忽略某些信號,將command用空字符串代替即可,如trap""TERMINT,忽略kill%n和Ctrl+c發送的信號(kill發送的是TERM信號)。Linux更強勁的殺死進程的命令:kill-9進程號(或kill-9%n作業號)等價與kill-KILL進程號。

舉個例子

最近小A需要生產2015年全年的KPI數據報表,現在小A已經將生產腳本寫好了,生產腳本一次只能生產指定一天的KPI數據,假設跑一次生產腳本需要5分鐘,那么:

如果是循環順序執行,那么需要時間:5*365=1825分鐘,約等于6天

如果是一次性放到linux后臺并發執行,365個后臺任務,系統可承受不住哦!

既然不能一次性把365個任務放到linux后臺執行,那么,能不能實現自動地每次將N個任務放到后臺并發執行呢?當然是可以的啦。

#!/bin/bash

source/etc/profile;

#-----------------------------

tempfifo=$$.fifo#$$表示當前執行文件的PID

begin_date=$1#開始時間

end_date=$2#結束時間

if[$#-eq2]

then

if["$begin_date"\>"$end_date"]

then

echo"Error!$begin_dateisgreaterthan$end_date"

exit1;

fi

else

echo"Error!Notenoughparams."

echo"Sample:shloop_kpi2015-12-012015-12-07"

exit2;

fi

#-----------------------------

trap"exec1000>&-;exec1000

mkfifo$tempfifo

exec1000$tempfifo

rm-rf$tempfifo

for((i=1;i

do

echo>&1000

done

while[$begin_date!=$end_date]

do

read-u1000

{

echo$begin_date

hive-fkpi_report.sql--hivevardate=$begin_date

echo>&1000

}&

begin_date=`date-d"+1day$begin_date"+"%Y-%m-%d"`

done

wait

echo"done!!!!!!!!!!"

第6~22行:比如:shloop_kpi_report.sh2015-01-012015-12-01:

$1表示腳本入參的第一個參數,等于2015-01-01

$2表示腳本入參的第二個參數,等于2015-12-01

$#表示腳本入參的個數,等于2

第13行用于比較傳入的兩個日期的大小,\>是轉義

第26行:表示在腳本運行過程中,如果接收到Ctrl+C中斷命令,則關閉文件描述符1000的讀寫,并正常退出

exec1000>&-;表示關閉文件描述符1000的寫

exec1000

trap是捕獲中斷命令

第27~29行:

第27行,創建一個管道文件

第28行,將文件描述符1000與FIFO進行綁定,寫的綁定,則標識對文件描述符1000的所有操作等同于對管道文件$tempfifo的操作

第29行,可能會有這樣的疑問:為什么不直接使用管道文件呢?事實上這并非多此一舉,管道的一個重要特性,就是讀寫必須同時存在,缺失某一個操作,另一個操作就是滯留,而第28行的綁定文件描述符(讀、寫綁定)正好解決了這個問題

第31~34行:對文件描述符1000進行寫入操作。通過循環寫入8個空行,這個8就是我們要定義的后臺并發的線程數。為什么是寫空行而不是寫其它字符?因為管道文件的讀取,是以行為單位的

第37~42行:

第37行,read-u1000的作用就是讀取管道中的一行,在這里就是讀取一個空行;每次讀取管道就會減少一個空行

第39~41行,注意到第42行結尾的&嗎?它表示進程放到linux后臺中執行

第41行,執行完后臺任務之后,往文件描述符1000中寫入一個空行。這是關鍵所在了,由于read-u1000每次操作,都會導致管道減少一個空行,當linux后臺放入了8個任務之后,由于文件描述符1000沒有可讀取的空行,將導致read-u1000一直處于等待。

文章到此結束,如果本次分享的shell中的while循環和shell中for循環語句的問題解決了您的問題,那么我們由衷的感到高興!

主站蜘蛛池模板: 亚洲日本欧美产综合在线| 亚洲AV综合色一区二区三区| 亚洲综合国产精品第一页| 亚洲色欲色欲综合网站| 亚洲va欧美va国产综合| 久久婷婷色综合一区二区| 国产成人精品综合久久久| 国产色综合天天综合网| 国产成人综合亚洲亚洲国产第一页| 亚洲综合无码AV一区二区 | 亚洲伊人成无码综合网| 无码国内精品久久综合88| 亚洲综合日韩久久成人AV| 久久综合九色综合欧美狠狠| 91精品国产综合久久精品| 人人狠狠综合久久88成人| 亚洲色婷婷综合开心网| 久久久久一级精品亚洲国产成人综合AV区| 婷婷久久综合九色综合98| 国产91色综合久久免费| 亚洲人成依人成综合网| 欧美日韩国产综合视频一区二区三区 | 色婷婷综合久久久久中文 | 国产香蕉尹人综合在线| 国产成人精品综合久久久久| 国产欧美精品一区二区色综合| 亚洲成a人v欧美综合天堂下载| 欧美国产综合欧美视频| 色婷婷狠狠久久综合五月| 亚洲欧美成人综合在线| 久久综合久久鬼色| 婷婷色中文字幕综合在线| 曰韩人妻无码一区二区三区综合部| 青青热久久综合网伊人| 99久久精品国产综合一区| 激情综合色综合久久综合| 伊人成年综合网| 成人综合久久精品色婷婷| 一本色道久久99一综合| 国产亚洲综合一区柠檬导航| 国产综合久久久久|