1. 程式人生 > >shell script迴圈語法與個別注意事項

shell script迴圈語法與個別注意事項

shell 執行方式的區別:

1 ,直接執行 sh *.sh  ./*.sh  是開一個子程序來執行指令碼,程序完成後,子程序的各項變數和操作會結束,不會傳回到父程序中。

2,sourece *.sh是在父(當前)程序中執行,指令碼內設定的變數,也會繼續有效。

利用 test 和 判斷符號 [] 做判斷

例: test -e /fileOrdir   && echo "exist" || echo "Not exist"    檢視當前檔名是否存在 存在列印 exist  不存在 列印 Not exist

[ -z "$HOME" ]; echo "$?"   注:中括號兩邊必須有空格來分隔      

shell script 的預設變數($0 , $1 ...)

$0 代表指令碼名字   $1 代表指令碼後面的第一個引數  $2 代表指令碼後面的第二個引數

$# : 代表引數個數 包括指令碼名字 $0

[email protected] : 代表全部變數

$* :大體同上

輸入: sh sh07.sh  one two 

例: echo "The script name is  ===> $0"    # 輸出 sh07.sh

echo "total param number is  ===> $#"  #輸出 3

[ "$#" -lt 2 ] && echo "number of parameter is less than 2 stop here " && exit  #判斷引數小於 2個 退出

echo "your whole param is ===> '[email protected]' "   # 列印全部引數  one two three

echo "the 1st param is  ====> $1 "  ##列印打一個引數 one

echo "the 2ed param is ====> $2 " ##列印第二個引數 two

shift 可以造成引數偏移

sh sh08.shone two three four five six

echo "total  param is ====> $#"    # 7

echo "your whole param is ====> '

[email protected]' "   # one two three four five six 

shift  # 進行一次偏移  後面可以帶數字   shift 2  代表偏移兩次 

echo "total  param is ====> $#"   6   偏移兩次 5

echo "your whole param is ====> '[email protected]' "  # two three four five six   偏移兩次  three four five six 

條件判斷式: 

if  ..... then

....

elif .... then

...

fi    #  if 的結束是 if 反過來 

例:

[ "$yn" == "Y" ] || [ "$yn" == "y" ];  等同  [ "$yn" == "Y" -o "$yn" == "y" ] (少箇中擴號)

if [ "$yn" == "Y" ] || [ "$yn" == "y" ];then      # -o 等於 || (or)     -a 等於&& (and)   ! 非

echo "ok "

exit 0    #程式結束  返回 0  相當於return  如果用在函式的返回中需要用return   exit 將會退出程式 而不是退出函式

elif [ "$yn" == "N" -o "$yn" == "n" ]; then

echo "No"

exit 1   

fi

case  esac  (同語言的switch case語法)

case $變數名稱 in 

"第一個選擇項內容")

程式段

;;        兩個;; 相當於 break

"第二個選擇項內容")

程式段

;;        兩個;; 相當於 break

*)相當於 define 其他的所有選項

程式段

;;

esac

輸入: ./xxx.sh one

例:

case $1 in

"hehe")

echo "you input hehe"

;;

"one")

echo "you input one"

;;

*)

echo "you input other $1"

;;

esca

shell script 函式:

function fucName() {

程式段

}

例子函式引數:同一個指令碼

function func()
{
if [ "$1" == "haha" ]; then
echo "$0"    #這裡將列印 func
echo "sb bie haha"
elif [ "$1" == "hehe" ]; then
echo "hehe ni mei"
else
echo "exit"
return 0     #如果這裡用 exit 將會直接退出程式  再不會到下面的while迴圈中
fi
}
while true 
do #do 必須另起一行
read -p "please input" name
func $name        #函式的變數 $0(函式名) $1(函式後面的第一個引數) ... 和 script shell 預設變數 $0(指令碼名)  $1(指令碼後面 輸入的第一個引數)...    可以把shell          # script 想象成 特殊的函式   
   if [ "$?" == "0" ]; then   #如果執行指令碼的返回         值 是 0 則退出程式
       exit 0 
     fi 
done

不同指令碼之前的函式呼叫:

sh12.sh

function func()
{
	case $1 in 
		"one")
			echo "func one"
			;;
		"two")
			echo "func two"
			;;
		"three")
			echo "func three"
			;;
		*)
			echo "func sx"
			;;
	esac
	if [ "$2" == "haha" ]; then
		echo "haha nimei";
	elif [ "$2" == "hehe" ]; then
		echo "hehe doubi"
	elif [ "$2" == "exit" ]; then
		return 0
	elif [ "$2" == "" ]; then
		echo "input sb"
	fi
	return 1
}

sh13.sh  呼叫另一個指令碼函式 先要載入 source  path/*.sh
source ${PWD}/sh12.sh
func $1 $2

if [ "$?" == "0" ]; then
echo "exit sb"
elif [ "$?" == "1" ]; then
echo "other input"
fi

迴圈:

while [條件] #條件成立則執行迴圈

do

程式段

done

until [條件] #條件成立則停止迴圈

do

程式段

done

# ! bin/sh
	if [ "$1" == "" ]; then
		echo "please input a param"
		exit 0
	fi
	s=0
	i=0
	until [ "$i" == "$1" ]          # 如果 i = 輸入的第一個引數  則停止迴圈 
	do
		i=$(($i+1))		# i=$b 表示把變數b 賦值給變數i 注前面不帶  $
		s=$(($s+$i))		# ((..)) 兩個括號 表示取整數 裡面可做運算
	done
	echo "The result of '1+2+...+$1 = $s'"

for var in con1 con2 ...

do

程式段

done

例:

for animal in dog cat elephant

do

echo "$animal" #第一次執行時 animal == dog 第二次為cat 第三次為 elephant

done

users= $(cut -d ":" -f1 /etc/passwd)

for username in $users

do

echo “$username” #會打印出所有的名字

done

for ( (初始值; 限制值; 執行步長) )

do

程式段

done

例:

s = 0

for ( (i=1; i <= $nu; I=i+1 ) )

do

s = $( ($s + $i) )

done

echo "the relust 0f 1+2+3+...+$nu is $s" #累加計算到輸入的值

# !bin/sh
q="q"
w="w"
e="e"
r="r"
t="t"
y="y"
for var in q w e r t y
do
	echo  "$var "
done

if [ "$1" == "" ]; then	
	echo "please input param"
	exit 0
fi
for ((i=1;i<="$#";i=i+1))
do
	echo "the i param = $i"
done

users=$(cut -d ':' -f1 /etc/passwd) #取使用者的第一列 使用者名稱
i=0
for username in $users 
do
	i=$(($i+1))
	echo " $i = $username"
done

shell script 的追蹤及除錯

sh [-nvx] script.sh

-n不執行script,只查詢語法問題 若無語法錯誤 螢幕不會顯示任何資訊

-v 執行script前,先將script的內容輸出到螢幕上

-x將script的執行過程全顯示到螢幕上,使用者可以根據執行此看出執行那一段會出錯,並修改自己的指令碼。非常好的功能

多看,多模仿網上的相當有用的script,並加以修改成自己的script。是最快的學習手段。

學shell得主要目的是更方面的與作業系統打交道,做一些工具,或批處理,貼段與系統相關的操作

# !bin/sh
if [ ! -e "/zky/sh/hehe" ]; then
	echo "11111"
	touch hehe
	exit 0
else 
	if [ -f "/zky/sh/hehe" ]; then
		echo "22222"
		rm /zky/sh/hehe
		mkdir /zky/sh/hehe
		exit 0
	else
		echo "33333"
		rm -r /zky/sh/hehe
		touch /zky/sh/hehe
		exit 0
	fi
fi


相關推薦

shell script迴圈語法個別注意事項

shell 執行方式的區別: 1 ,直接執行 sh *.sh  ./*.sh  是開一個子程序來執行指令碼,程序完成後,子程序的各項變數和操作會結束,不會傳回到父程序中。 2,sourece *.sh是在父(當前)程序中執行,指令碼內設定的變數,也會繼續有效。 利用 te

Linux shell指令碼使用while迴圈執行ssh的注意事項

如果要使用ssh批量登入到其它系統上操作時,我們會採用迴圈的方式去處理,那麼這裡存在一個巨大坑,你必須要小心了。 一、場景還原: 我現在是想用一個指令碼獲取一定列表伺服器的執行時間,首先我建立一個名字為ip.txt的IP列表(一個IP一行),再建好金鑰實現不用密碼直接登入。然後寫指令碼如下: [co

鳥哥的Linux私房菜讀書筆記--shell script的追蹤debug

關於sh命令     [[email protected] ~]$ sh [-nvx] scripts.sh         選項與引數:     &nbs

學大偉業:2019年化學競賽國初備考考試注意事項

各位家長的孩子應該學習競賽兩年甚至更長的時間,最後一週沒必要玩命的去學習,但是不能鬆懈,作息飲食一切照舊,注意別生病,每天能運動一下最好,但是不要強迫,不要劇烈運動。 一、學大偉業建議規劃如下: 1、每天做一套題目,按照國初的要求來,早上9點到12點,嚴格要求自己。題目的難度不宜過大

QT使用訊號注意事項

QT使用訊號與槽注意事項 如需轉載請標明出處:http://blog.csdn.net/itas109 QQ技術交流群:129518033 目錄 文章目錄 QT使用訊號與槽注意事項 @[toc] 前言

Linux Shell程式設計 迴圈語法

for迴圈 for 迴圈是固定迴圈,也就是在迴圈時已經知道需要進行幾次迴圈。有時也把 for 迴圈稱為計數迴圈。語法: for 變數 in 值1 值2 值3… do 程式 done 在這種語法中,for 迴圈的次數取決於 in 後面值的個數(以空格分隔),有幾個值就迴圈幾次,並且每次迴圈

awk執行的三種方式,以及awk以shell指令碼檔案形式執行的注意事項

awk執行有三種形式: 1.直接以命令列來執行,如圖: 2.以awk指令碼檔案來執行 需要加-f選項。 3.以shell指令碼的形式來執行         以shell指令碼形式執行時,行首的#!/bin/bash 需變換為#!/bin/awk(awk所在的路徑

學習shell指令碼時發現的一些注意事項

1.算術運算子一定要緊挨運算元; 2.賦值操作時,let 後面的整個要用引號包起來; 3.shift可以實現引數位置變數下移一位,具體就是$1=$2 ,$2=$3...  $#遞減 ; 4.$*作為for迴圈列表時,加引號,即 “[email protected]”只迴圈一次並一次性

win10下VS2017中opencv3.1.0及contrib模組的安裝配置注意事項

一、平臺與軟體下載 1.win10+vs2017+cmake3.10.2+opencv3.1.0+3.1.0contrib 注:opencv上官網下載,contirb模組與opencv版本相同 二、參考部落格 1.opencv 3.1.0與contrib下載好了之後,

CStdioFile之ReadString()WriteString()注意事項

簡介: CStdioFile  └CFile     └CStdioFile 文字方式提供對硬回車—換行符對的特殊處理: 當你將一個換行符(0x0A)寫入一個文字方式的CStdioFile物件時,位元組對(0x0A,0x0D)被髮送給該檔案,即自動將"\n"擴充套件為了"\

體檢報告分析飲食起居注意事項

學校體檢報告中,出現幾項異常的指標,由於醫學常識匱乏,很多指標異常的說明並不太明白,故整理如下,加強自己對身體異常指標的認知。身體是革命的本錢,健康最為重要。 1.體檢報告總結及建議簡圖 下面一一介紹一下可疑指標的解釋與飲食起居和防禦治療的注意事項。

Asp.net MVC——httpposthttpget注意事項

View與Controller相互互動時,View向controller預設為get請求。 假如我使用了httppost與httpget特性,並且只使用了post,並沒有get,會報一個404找不到頁面的錯誤。 所以特性限定get與post請求時,應該將get特性用上,哪

mysql中case when用法注意事項

CASE 計算條件列表並返回多個可能結果表示式之一。 CASE 具有兩種格式: 簡單 CASE 函式將某個表示式與一組簡單表示式進行比較以確定結果。 CASE 搜尋函式計算一組布林表示式以確定結果。  兩種格式都支援可選的 ELSE 引數。 語法簡單 CASE 函式:

如何在spring boot 專案中加入freemarker,以及使用yaml語法時的注意事項

最近在做一個用郵件傳送報表的專案,要求在郵件正文中將excel表格顯示出來。我考慮到通過字串拼接表格太麻煩,而且不利於維護,所以使用freemarker做郵件模板來做展示。 專案環境:spring boot    構建工具:maven 步驟如下: 1.引入pom依賴

再談Java資料結構—分析底層實現應用注意事項

在回顧js資料結構,寫《再談js物件資料結構底層實現原理-object array map set》系列的時候,在來整理下java

AWS雲建立EC2使用注意事項-踩坑記錄

目錄 AWS 一 建立 EC2(雲伺服器) 二、AWS 注意事項 AWS 文章 GitHub 地址: 點我 AWS雲伺服器價格計算器 AWS WEB 價格計算器網址 https

Django框架簡介使用注意事項

一、Django框架簡介 MVC框架和MTV框架 MVC框架 MVC,全名是Model View Controller,是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控制器(Controller),具有耦合性低、重用性高、生命週期成本低等優點。 Djan

Shell中條件判斷語法判斷條件

expression 表達式 字符串 linux 影響 一,簡介Shell各種判斷結構和運算符的用法是shell編程的基礎,了解shell的判斷、運算符和一些退出狀態對後面的學習有很重要的影響。shell有一個內部命令test經常用於對判斷語句進行測試一種或幾種狀態的條件是否成立二. 判斷

NOIP複賽複習(二)競賽環境注意事項

一、比賽不提供紙質試題,只提供電子版試題檔案。 該檔案壓縮包儲存在計算機桌面上。監考人公佈密碼後,選手自行解密試題。 試題解壓密碼會影響一個人的心情,一定要一次輸對,注意大小寫,不要邊輸入邊檢查,要對自己有自信。 二、江蘇複賽選手上機可自選windows或linux作業系統。

在Vue中迴圈生成多選框CheckBox時的注意事項

多選框是一種非常常見的功能,有時候我們會根據後臺返回的資料進行多選框渲染,之前做專案時遇到迴圈生成多選框時,v-model繫結的值會隨著選中與取消改變,但頁面卻不會變化 的情況,後來測試了一下,發現多選框的資料類似只能在頁面上渲染一次.先看一下我專案中遇到的情況: &n