當前位置:首頁 » 網頁前端 » shell腳本for和if
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

shell腳本for和if

發布時間: 2022-08-04 09:31:22

① shell 腳本,在調試時,FOR循環那行代碼,總是出現錯誤syntax error near unexpected token '$'\r''

這種情況發生的原因是因為你所處理的文件換行符是dos格式的"\r\n"
可以使用cat -v 文件名 來查看換行符是否是,如果是上述的,則行結尾會是^m
需要轉換成linux/unix格式的"\n"
具體轉換辦法就是轉換換行符
可以用sed命令處理一下文件,命令如下:
sed 's/\r//' 原文件 >轉換後文件

② shell腳本中使用for.do循環語句列出從1到100的數字中能夠被3整除的數求出他們的和並輸出文件命名為sum.sh

#!/bin/bash
sum=0
for i in {1..100}
do
if [ $(( $i % 3 )) -eq 0 ]
then
echo $i
sum=$(( $sum + $i ))
fi
done
echo "sum is: $sum"

保存為sum.sh

③ 闡述shell程序的執行和跟蹤方法

Shell是什麼?任何發明都具有供用戶使用的界面。UNIX供用戶使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要強大的多)。Shell為用戶提供了輸入命令和參數並可得到命令執行結果的環境。為了不同的需要,UNIX提供了不同的Shell。現在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)為例,一步步的領略UNIX Shell的強大功能,佔先其強大魅力,達到更方便靈活的管理、應用UNIX的目的。1.UNIX內核和Shell的交互方法啟動UNIX時,程序UNIX(內核)將被調入計算機內存,並一直保留在內存中直到機器關閉。在引導過程中,程序init將進入後台運行一直到機器關閉。該程序查詢文件/etc/inittab,該文件列出了連接終端的各個埠及其特徵。當發現一個活動的終端時,init程序調用getty程序在終端上顯示login等登陸信息。(username和passwd),在輸入密碼後,getty調用login進程,該進程根據文件/etc/passwd的內容來驗證用戶的身份。若用戶通過身份驗證,login進程把用戶的home目錄設置成當前目錄並把控制交給一系列setup程序。setup程序可以是指定的應用程序,通常setup程序為一個Shell程序,如:/bin/sh 即Bourne Shell(command出來了,呵呵)。得到控制後,Shell程序讀取並執行文件/etc/.profile以及.profile。這兩個文件分別建立了系統范圍內的和該用戶自己的工作環境。最後Shell顯示命令提示符,如$。(這是以bsh為例,若是csh,為.cshrc,ksh為.kshrc,bash為.bashrc等等) 注不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或config.sys文件)當shell退出時,內核把控制交給init程序,該程序重新啟動自動登陸過程。有兩種方法使shell退出,一是用戶執行exit命令,二是內核(例如root用kill命令)發出一個kill命令結束shell進程。shell退出後,內核回收用戶及程序使用的資源。用戶登陸後,用戶命令同計算機交互的關系為:命令進程--->Shell程序--->UNIX內核--->計算機硬體。當用戶輸入一個命令,如$ls,Shell將定位其可執行文件/bin/ls並把其傳遞給內核執行。內核產生一個新的子進程調用並執行/bin/ls。當程序執行完畢後,內核取消該子進程並把控制交給其父進程,即Shell程序。例如執行:$ps該命令將會列出用戶正在執行的進程,即Shell程序(下來詳細說說,別急現在)和ps程序。若執行:$sleep 10 & $ps其中第一條命令將產生一個在後台執行的sleep子進程。ps命令執行時會顯示出該子進程。每當用戶執行一條命令時,就會產生一個子進程。該子進程的執行與其父進程或Shell完全無關,這樣可以使Shell去做其他工作。(Shell只是把用戶的意圖告訴內核,然後該幹嘛幹嘛) 現在windows有個計劃任務(在固定的時間,日期自動執行某任務),其實UNIX很早就有這個功能了,也就是所謂的Shell的自動執行。一些UNIX資源,如cron可以自動執行Shell程序而無需用戶的參與,(這個功能好象在/var/spool/crotab目錄里)。Crontab 程序對於系統管理員來說是非常有用的。Cron服務用於計劃程序在特定時間(月、日、周、時、分)運行。我們以root的crontab 為例。根用戶的crontab 文件放在 /var/spool/crontab/root 中,其格式如下:(1) (2) (3) (4) (5) (6)0 0 * * 3 /usr/bin/updatedb1. 分鍾 (0-60)2. 小時 (0-23)3. 日 (1-31)4. 月 (1-12)5. 星期 (1-7)6. 所要運行的程序2.Shell的功能和特點1>命令行解釋2>使用保留字3>使用Shell元字元(通配符)4>可處理程序命令5>使用輸入輸出重定向和管道6>維護一些變數7>運行環境控制8>支持Shell編程對於"命令行解釋"就不多說了,就是在shell提示符(例如:"$","%","#"等)後輸入一行unix命令,Shell將接收用戶的輸入。"使用保留字":Shell有一些具有特殊意義的字,例如在Shell腳本中,do,done,for等字用來控制循環操作,if,then等控制條件操作。保留字隨Shell環境的不同而不同。"通配符":* 匹配任何位置? 匹配單個字元[] 匹配的字元范圍或列表 例如:$ls [a-c]*將列出以a-c范圍內字元開頭的所有文件$ls [a,m,t]*將列出以e,m或t開頭的所有文件"程序命令" :當用戶輸入命令後,Shell讀取環境變數$path(一般在用戶自己的.profile中設置),該變數包含了命令可執行文件可能存在的目錄列表。shell從這些目錄中尋找命令所對應的可執行文件,然後將該文件送給內核執行。"輸入輸出重定向及管道" :重定向的功能同DOS的重定向功能:">" 重定向輸出"<" 重定向輸入而管道符號,是unix功能強大的一個地方,符號是一條豎線:"|",用法:command 1 | command 2 他的功能是把第一個命令command 1執行的結果作為command 2的輸入傳給command 2,例如:$ls -s|sort -nr|pg該命令列出當前目錄中的所有文件,並把輸出送給sort命令作為輸入,sort命令按數字遞減的順序把ls的輸出排序。然後把排序後的內容傳送給pg命令,pg命令在顯示器上顯示sort命令排序後的內容。"維護變數" :Shell可以維護一些變數。變數中存放一些數據供以後使用。用戶可以用"="給變數賦值,如: $lookup=/usr/mydir該命令建立一個名為lookup的變數並給其賦值/usr/mydir,以後用戶可以在命令行中使用lookup來代替/usr/mydir,例如:$echo $lookup結果顯示:/usr/mydir為了使變數能被子進程使用,可用exprot命令,例如:$lookup=/usr/mydir$export lookup"運行環境控制" :當用戶登陸啟動shell後,shell要為用戶創建一個工作的環境,如下:1>當login程序激活用戶shell後,將為用戶建立環境變數。從/etc/profile和.profile文件中讀出,在這些文件中一般都用$TERM變數設置終端類型,用$PATH變數設置Shell尋找可執行文件的路徑。2>從/etc/passwd文件或命令行啟動shell時,用戶可以給shell程序指定一些參數,例如"-x",可以在命令執行前顯示該命令及其參數。後面詳細介紹這些參數。"shell編程" :本文主要介紹的內容。shell本身也是一種語言(*可以先理解為unix命令的組合,加上類C的條件,循環等程序控制語句,類似dos批處理,但要強大的多),用戶可以通過shell編程(腳本,文本文件),完成特定的工作。SHELL變數下面我們詳細的介紹Bourne Shell的編程:自從貝爾實驗室設計了BourneShell。從那時起許多廠商根據不同的硬體平台設計了許多版本得unix。但在眾多版本的unix中,Bourne Shell一直保持一致。1>Bsh的啟動:用戶在登陸後,系統根據文件/etc/passwd中有關該用戶的信息項啟動Shell。例如某用戶在passwd中的信息項為:ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh則表明,用戶名是ice_walk等信息,在最後一項"/bin/bsh"表明用戶的sh環境類型是bsh,於是系統啟動之。在啟動或執行(包括下面我們要講的shell程序--腳本)過程中可以使用以下一些參數,我們一一說明:-a 將所有變數輸出-c "string"從string中讀取命令-e 使用非互動式模式-f 禁止shell文件名產生-h 定義-i 互動式模式-k 為命令的執行設置選項-n 讀取命令但不執行-r 受限模式-s 命令從標准輸入讀取-t 執行一命令,然後退出shell-u 在替換時,使用未設置的變數將會出錯-v 顯示shell的輸入行-x 跟蹤模式,顯示執行的命令許多模式可以組合起來用,您可以試試了,但-ei好象不行,你說why呢?使用set可以設置或取消shell的選項來改變shell環境。打開選項用"-",關閉選項用"+",多數unix允許打開或關閉a、f、e、h、k、n、uv和x選項。若顯示Shell中已經設置的選項,執行:$echo $-Bsh中每個用戶的home目錄下都有一個.profile文件,可以修改該文件來修改shell環境。為了增加一個可執行文件的路徑(例如/ice_walk/bin),可以把下面代碼加入.profile中PATH=$PATH:/ice_walk/bin;exprot PATH.profile中shell的環境變數意思如下:CDPATH 執行cd命令時使用的搜索路徑HOME 用戶的home目錄IFS 內部的域分割符,一般為空格符、製表符、或換行符MAIL 指定特定文件(信箱)的路徑,有UNIX郵件系統使用PATH 尋找命令的搜索路徑(同dos的config.sys的 path)PS1 主命令提示符,默認是"$"PS2 從命令提示符,默認是">"TERM 使用終端類型2>Bsh里特殊字元及其含義在Bsh中有一組非字母字元。這些字元的用途分為四類:作為特殊變數名、產生文件名、數據或程序控制以及引用和逃逸字元控制。他們可以讓用戶在Shell中使用最少的代碼完成復雜的任務。*> Shell變數名使用的特殊字元$# 傳送給命令Shell的參數序號$- 在Shell啟動或使用set命令時提供選項$? 上一條命令執行後返回的值$$ 當前shell的進程號$! 上一個子進程的進程號$@ 所有的參數,每個都用雙括弧括起$* 所有參數,用雙括弧括起$n 位置參數值,n表示位置$0 當前shell名*>產生文件名的特殊字元包括"*","?","[]",上面講過,不再多說。*>數據或程序控制使用的特殊字元>(file) 輸出重定向到文件中(沒有文件則創建,有則覆蓋)>>(file) 輸出重定向到文件中(沒有則創建,有則追加到文件尾部)<(file) 輸入重定向到文件 ; 命令分割符| 管道符 & 後台運行(例如:sleep 10 &) ` ` 命令替換,重定向一條命令的輸出作為另一命令的參數。*>對於引用或逃逸的特殊字元Bsh用單引號' '和雙引號" "將特殊字元或由空白分隔的字引用起來組成一個?

④ shell腳本if嵌套怎麼老提示有錯誤

因為for循環沒有結束,要在fi後面加done

⑤ 請教關於shell腳本循環的問題

就是死循環唄:
while :
do
函數
done

這樣就可以啊
另外不同的shell支持的for循環的寫法可能不盡相同,還可以這么寫循環:
#!/bin/sh
str="1 2 3 4 5 6"
for i in $str; do
echo ${i}
done
你可以試一下

⑥ 一個簡單的linux shell腳本(for語句 if語句) 哪裡有問題

if和for後面都必須有空格
i改成$i,然後試試,應該可以的

⑦ 用for循環編寫刪除文件的shell腳本

#!/bin/bash
#2.sh
cd #進入加目錄
touch 1 #創建文件1
read -p "請輸入要刪除的文件 1 :" file
if [ "$file" != "1" ];then
echo "請輸入1 不許輸入別的。謝謝!"
fi
for i in $file ;do #用for循環把$file代入$i
rm -rf $i #刪除$i
echo "$i 被刪除了。"
done #結束

⑧ shell腳本if循環問題

剛看到,這么寫可以實現,代碼在linux上測過了:
#!/bin/bash
arr=(10 11 30)
for a in ${arr[*]}
do
ouput_s=$((ouput_s+a))
sum=$((sum+1))
done
echo "$ouput_s"
echo "$sum"

輸出:
51
3

⑨ shell腳本

Shell腳本基本知識
概述:shell其實是內核與用戶之間的一個介面,
shell腳本
如果有一系列經常使用的linux命令,你可以把它們存儲在一個文件腫。shenll可以讀取這個文件,並執行其中的命令。這樣的文件成為腳本文件。
執行shell腳本
要創建一個shell腳本,你要使用任何編輯器比如vi在文本文件中編寫他。
為了使用bashshell賴執行腳本magic,其命令是:bashmagic或者./magic
echo命令:
echo「!」
屏幕上就會回顯「!」
#符號
用於在shell腳本腫可以包含註解入口
echo「hello」
#thisisacommentline.thiswouldnotproceanyoutput!
echo「world!」
第二行是一個註解的例子。它將被shell忽略,而且不產生任何消息
變數:
可以在任何時間通過簡單的賦值來創建。
語法:
<variablename>-<value>
Linux中的所有變數都被當作字元串
引用變數:
$符號用於引用一個變數的內容
variable1=${variable2}
讀入值給變數
在執行shell腳本時,shell還允許用戶直接從鍵盤讀入一個值給變數,還可以使用read命令來作。
$readfname
本地和全局shell變數
局部變數
當引用shell時,只有創建它的shell能夠知道變數的存在
全局變數
稱為子shell
shell中創建的變數局部於創建它的shell,除非使用export命令特別指出是全局的。
環境變數:
通過改變這些變數的值,用戶能夠定製此環境
一些環境變數的例子是HOME,PATH,PS1,PS2,LOGNAME,SHLVL,及SHELL
HOME變數
Linux系統中的每個用戶都有一個相關的稱作HOME的目錄
當一個用戶登錄後,進入相應的HOME的目錄
$echo$HOME
PATH變數
包含一列用冒號定界的目錄的路徑名字,便於可執行程序的搜索。
PS1變數
PS1(PromptString1)變數包含了shell提示符,$符號
$PS1=「HELLO>」
HELLO>
PS2變數
是為第二個提示符設置值的環境變數
LOGNAME變數
包含用戶的注冊名字
$echo「${LOGNAME}」
SHLVL變數
該變數包含當前工作的shelllevel
SHELL變數
環境變數存儲了用戶預設的shell
env命令
可用來查看所有的已移出的環境變數表和它們各自的值!
命令替換
在單個命令行中使用多個命令的另外一種方法(非Pipes)是通過命令替換
echo「thedatais`date`」
expr命令
用於求之算術表達式。該命令的輸出被送到標准輸出
$expr4+5
將在屏幕上顯示9
算術展開:
你可以在$((…))中括一個表達式,用下面的命令來計算它的值;
$((expression))
example1
編寫一個shell腳本用於計算呼叫中心未應答的詢問的數量。該腳本應該接受一天那所報告的詢問的總數和應答的詢問的數量,以便計算未應答的詢問的數量。
所有未應答的詢問總數=所有詢問的總數-應答的詢問的數量
<!--[if!supportLists]-->※<!--[endif]-->※※※※※※※※※※※※※※※※※※※※※※※
條件執行
test和[]
求值表達式,並返回true(0)或false()
數值測試:
-eq等於則為真
-ne不等於則為真
-gt大於則為真
-ge大於等於則為真
-lt小於則為真
-le小於等於則為真
if構造
Linuxshell提供了循環和判定的構造,可以在shell腳本中使用
算術測試
結合if構造,它可以用於測試變數的數字值
串測試
test命令也可以用於字元串
=等於則為真
!=不相等則為真
-z字元串長度為零則為真
-n字元串長度不為零則為真
文件測試
test命令也可以用於檢查文件的狀態
-e文件存在則為真
-r文件存在並且可讀則為真
-w文件存在並且可寫則為真
-x文件存在並且可執行則為真
-s文件存在並且至少有一個字元則為真
-d文件存在並且為目錄則為真
-f文件存在並且為普通文件則為真
-c文件存在並且為字元型文件則為真
-b文件存在並且為塊特殊文件則為真
-a並且-o或者!非
exit命令
用於終止shell腳本的執行並返回到$提示符下
case。。。esac
shell腳本中使用的這個構造依據變數的值而執行一組特定指令
當變數的值和其中的一個值匹配的時候,就執行寫在該值下的一組命令。
example3
迭代
while構造
while<條件>
do
<命令(s)>
done
只有條件為真的時候,才能執行do與done之間的命令
until構造
until循環構造的求值模式於while循環相反
until循環將繼續執行直到求值的條件為真的時候
for構造
forvariable_namein<list_of_values>
do

done
for循環取一列值作為輸入並對循環中每個值執行循環
break和contineu命令
同其他語言中的用法
example4
控制進程的執行
請求後台處理
用於請求後台進程的符號是(&)
$wctempfile&
[1]2082
$vinewfile
檢查後台進程
ps(進程狀態)命令為每個當前的活動的每個進程產生一行入口。
終止後台進程
可用kill,如下所示
kill278
查看完成一個命令所花的時間
你可以使用time命令來查看一個命令從開始到結束所花的時間
timefine/etc–name「passwd」2>/dev/null/dev/null表明忽略錯誤信息。
管道的介紹
垂直條(|)是管道字元
它只是shell:「|」前面命令的輸出作為「|」之後命令的輸入發送
ls–l|more
用管道組合命令,功能強大