1. 程式人生 > >Linux Shell 變數自加

Linux Shell 變數自加

declare -i iv=$svnv
let iv+=1


shell中變數自增的實現方法


Linux Shell中寫迴圈時,常常要用到變數的自增,現在總結一下整型變數自增的方法。
我所知道的,bash中,目前有五種方法:
1. i=`expr $i + 1`;
2. let i+=1;
3. ((i++));
4. i=$[$i+1];
5. i=$(( $i + 1 ))
可以實踐一下,簡單的例項如下:


#!/bin/bash
i=0;
while [ $i -lt 4 ];
do
   echo $i;
   i=`expr $i + 1`;
   # let i+=1;
   # ((i++));
   # i=$[$i+1];
   # i=$(( $i + 1 ))
done


另外,對於固定次數的迴圈,可以通過seq命令來實現,就不需要變數的自增了;例項如下:


#!/bin/bash
for j in $(seq 1 5)
do
  echo $j
done


=================================================================================
Linux Bash Shell學習(十五):變數型別和整型運算


本文也即《Learning the bash Shell》3rd Edition的第六章Command-Line Options and Typed varilables之讀書筆記之二,但我們將不限於此。
  在之前,我們涉及的變數基本上是字串,也有整數,例如便是引數個數的$#。我們可以使用declare來制定變數的屬性。
變數型別定義
declare –a name :表示陣列array。
declare –f name :表示是function的名字。
declare –F name :同上,但只顯示function的名字。這個和上面的具體差異不太明白,但是這兩者都很少使用,先不理會它們。
declare –i name :表示整數
declare –r name :表示只讀。不能使用unset。對於只讀變數,也可以使用readonly name 的方式,相當於declare –r name 。readonly可以帶三個選項:-f表示這是個function的名字,-p表示列印所有的readonly的名字,-a表示這是個只讀的陣列。
declare –x name :同export,即不僅在當前的環境中起作用,也在外部的shell環境中起作用。
整型運算
  我們可以通過declare -i來定義整型變數。在上一次的學習中,使用了$(($OPTIND - 1))來進行計算$((…))是用於進行整型運算的。在$((…))中,我們並不需要對變數加上$來表示它的值,也不需要預先宣告這個變數是個整型。在雙引號下也能進行有效運算。下面是個例子:
#declare -i aa=13 
aa=13 
echo '$((aa-3))'=$((aa-3)) 
echo '$(($aa-3))'=$(($aa-3)) 
#date顯示日期,date +%j表示今天是年度的第幾天,$(command)表示其顯示結果 
echo "Only $(( (365-$(date +%j)) / 7 )) weeks until the New Year"
  前面兩個echo得到的值都是10,我們也不需要預先宣告aa是個整數,因為$((…))已經表明是整型的運算,會自動將字元變為整數。
運算型別和C語言一樣。也支援$((x += 2))的格式,包括下面幾種操作。在下面的例子中我們引用了上面aa=13。
++ :$((aa++))為13,並將aa賦值為14,注意使用$(($aa++))會報錯,無法解析13++的含義,所以為了簡潔並且不產生錯誤,不在運算式中加入$,如果是$((++aa))為14,並將aa賦值為14,這與C語言是一樣的。
-- :$((aa--))為13,並將aa賦值為12,如果是$((--aa))為12,並將aa賦值為12。
+
-
*
/
%:求餘:$((aa%5))=3
**:這個在C語言中是沒有的,表示Exponentiation,即取冪。例如上面例子中$(($aa**3))相當於13*13*13=2197
<<
>>
&
|
~
!
^
  還支援邏輯運算,包括<, >, <=, >=,==,!=,&&,||, 這些也與C語言一樣。例如$((3>1))為1。這和命令執行return 0表示真是不一樣的。一個是邏輯運算的結果,一個是exit status。例如上面$((3>1))為1,邏輯計算結果為1,而執行結果的 exit status為0。這兩個概念需要區分。
  我們在http://blog.csdn.net/flowingflying/archive/2009/12/22/5069646.aspx 中給出同[ … ]進行條件判斷的方式,這裡>,<,=等符號是用於判斷字串的,表示用於比較數字的,在[ … ]中,如果對數字進行比較,需要使用-lt, –gt, –le, –ge, –eq, –ne 。使用[ … ],例如if [ 3 –gt 20 ]; then,條件不成立,但是[ 3 > 20 ],則成立,因為此刻比較的是字串。所以這是很容易引起混淆的。如果需要表達比較複雜,例如[ /( 3 -gt 2 /) || /( 4 -le 1 /) ]是不太好閱讀的。我們需要強調一點:在if [ condition ]; then中,shell對於function或者command是已0來表示成功,因此if也是判斷是否為0,這和$(())的數學邏輯運算是不一樣的。對於上面的例子,可以使用if [ $(((3 > 2) && (4 <= 1))) = 1 ] ,前面(((3 > 2) && (4 <= 1))) 運算結構為1,然後進行[ str1 = str2 ]的比較,判斷是否成立。這樣寫仍然很麻煩,以及使用if  (((3 > 2) && (4 <= 1))) ,即((…)) 的方式表示。
對於數學運算的賦值,使用$((...))有時顯的比較繁複,可以使用let,格式如下:
let intvar =expression
  let表示expression是個數學運算,無須使用$(())來作進一步表明,這樣的賦值方式簡潔很多。 等號前後是沒有空格的,在expression的表示式中也是沒有空格的,如果有空格必須用引號引起來,可以是單引號,也可以是雙引號,let x=1+4;let x='1 + 4';let x="1 + 4",這三個同樣都是給x賦值為5。下面是一個例子,獲取指定目錄的所佔大小空間:
function test1 

    echo "test1 ${*}" 
    for dir in ${*:-.}; do 
        if [ -e $dir ]; then 
            # du - estimate file space usage,返回block數目 
            result=$(du -s $dir | cut -f 1) 
            let total=$result*1024 
            echo -n "Total for $dir = $total bytes" 
            if [ $total -ge 1048576 ]; then 
                echo " ($((total/1048576)) Mb )" 
            elif [ $total -ge 1024 ]; then 
                echo " ($((total/1024)) Kb )" 
            fi 
        fi 
    done 
}
  下面是一個較大的例子,使用這本書一直在用的pushd和popd的例子。進行了一些功能加強。當pushnd +n時,將第N個元素移到最上面,並進入該目錄,如果沒有引數,將最上的兩個元素交換,並進入交換後最top的目錄,否則安原pushd的處理方式進行處理。如果popnd +n,則將第N個元素從stack中刪除,其他的同popd的處理。
#獲取在stack中第N的引數,從0開始計算,並將前N的存放stackfront,後N的存放在stack中 
function getNdirs 

    echo getNdirs
[email protected]
 
    stackfront='' 
    let count=0 
    #通過數學計算和數字判度,可以向C那樣進行次數的控制,由於for是用於列表元素,所以使用while,迴圈之後,stackfront儲存前N個entry,含N,stack則存貯後面的元素。而target存貯第N個元素 
    while [ $count -le $1 ] && [ -n "$stack" ]; do 
        # target為stack中最top level的entry,含後面的空格 
        target=${stack%${stack#* }} 
        # 將最top的entry存放在stackfront的後面    
        stackfront="$stackfront$target" 
        # stack為取出最top entry後的值 
        stack=${stack#$target} 
        let count=count+1 
    done 
    # 將第N個元素重複從stackfont中移出,則stackfont存貯N之前的元素 
    stackfront=${stackfront%$target} 
}




# 當pushnd +n時,將第N個元素移到最上面,並進入該目錄,如果沒有引數,將最上的兩個元素交換,並進入交換後最top的目錄,否則安pushd的處理方式進行處理。 
function pushnd 

    echo 
    echo pushnd
[email protected]
 
    #檢查如果是pushnd +n的情況,需要將地N個元素移到最上方    
    if [ $(echo $1 | grep '^+[0-9][0-9]*$') ]; then 
        # 將引數1,去除+,獲取n 
        let num=${1#+} 
        getNdirs $num 
        stack="$target$stackfront$stack" 
        cd $target 
    elif [ -z "$1" ]; then 
    # case of pushnd without args; swap top two directories 
        firstdir=${stack%% *} 
        stack=${stack#* } 
        seconddir=${stack%% *} 
        stack=${stack#* } 
        stack="$seconddir $firstdir $stack" 
        cd $seconddir 
    else 
    # normal case of pushd dirname 
        dirname=$1 
        # -a等同於 && 
        if [ /( -d $dirname /) -a /( -x $dirname /) ]; then 
            stack="$dirname ${stack:-$PWD" "}" 
            cd $dirname 
        fi 
    fi 
    echo "stack=$stack" 
    echo "directory=$PWD" 



# 如果popnd +n,則將第N個元素從stack中刪除,其他的同popd的處理 
function popnd 

    echo 
    echo popnd
[email protected]
 


    if [ $(echo $1 | grep '^+[0-9][0-9]*$') ]; then 
    # case of popd +n: delete n-th directory from stack 
        let num=${1#+} 
        getNdirs $num 
        stack="$stackfront$stack" 
#      cd ${stack%% *} 
     else 
        if [ -n "$stack" ]; then 
            stack=${stack#* } 
            if [ -n "$stack" ]; then 
                cd ${stack%% *} 
            else 
                echo "stack becomes empty." 
            fi 
        else 
            echo "stack already empty." 
        fi 
    fi 
    echo "stack=$stack" 
    echo "directory=$PWD" 



pushnd /home 
pushnd /etc 
pushnd /home/wei/mywork 
pushnd +3 
pushnd 
pushnd +1 
popnd +3 
popnd 
popnd 
popnd
for的應用
  我們希望for和C或者JAVA那樣使用,這樣在陣列的情況下非常方便,格式為:
for (( initialisation ; ending condition ; update )) 
do 
        statements ... 
done
  如果使用for((;;)) 澤則表示一個無限迴圈,在statements中可以用break來退出迴圈。下面是一個九九乘法表的例子:
for (( i=1; i <= 9 ; i++ )) 
do 
        for (( j=1 ; j <= 9 ; j++ )) 
        do 
                echo -ne "$(( j * i ))/t" 
        done 
        echo 
done

相關推薦

Linux Shell 變數

declare -i iv=$svnv let iv+=1 shell中變數自增的實現方法 Linux Shell中寫迴圈時,常常要用到變數的自增,現在總結一下整型變數自增的方法。 我所知道的,bash中,目前有五種方法: 1. i=`expr $i + 1`; 2. le

shell 變數

[[email protected] onecloud]$ cat test_push.sh #!/bin/bash#to test the connectity to gateway.push.apple.com 2195#test 10 time if > 5 ,critical;if &

linux shell變數

shell簡介 是應用程式,該程式提供了一個介面,使用者通過這個介面訪問作業系統核心服務。 linux的shell分類: Bourne Shell (/usr/bin/sh或、/bin/sh) - Bourne again Shell (/bin/bash)—

linux shell 變數子串

linx變數子串 在本例子中,變數 test=https://www.//cnblogs./com//jjmaokk/p/10135401.html 1,${#parameter} 返回變數$parameter內容的長度(按字元),也適用於特殊變數 例: [[email protected]

Linux---shell變數及指令碼中的函式

一、什麼是變數? shell在定義變數的時候,變數名與變數之間不能存在空格,這個大多數的語言的這個不同還是蠻大的,不過定義的規則就其他的語言定義的規則大致相同了。 1) 區域性變數 區域性變數在指令碼或命令中定義,僅在當前shell例項中有效,其他shel

linux——shell變數及函式

shell變數 1.變數定義:     變數即在程式執行過程中它的值是允許改變的量,變數是用一串固定的字元來標誌不固定的值的一種方法,變數是一種使用方便的佔位符,用於引用計算機記憶體地址,該地址可以儲存scripts執行時可更改的程式資訊。在she

[Linux.Shell] 變數提取

${#string} $string的長度 ${string:position} 在$string中, 從位置$position開始提取子串 ${string:position:length} 在$string中, 從位置$position開始提取長度為$length的

linux shell程式設計之利用環境變數IFS定義分隔符

預設情況下,bash shell將空格符、製表符、換行符看作是欄位分隔符,如果遇到這些字元,bash shell就會認為字元後是一個新的欄位,這就帶來一種困擾:如果我們想處理包含空格、製表符、換行符的字元就會有麻煩了。bash提供了一種自定義分隔符的機制:環境變數IFS定義

shell指令碼中整數型變數增(1)的實現方式

在shell指令碼中,有時為了計數,需要編寫整數型變數,並用自增來顯示。 shell指令碼中的整數型變數,自增有多種實現方式,整體測試指令碼如下: #!/bin/sh #本指令碼測試shell指令碼中整型變數自增 加1的幾種方法 #定義整型變數 a=1 echo $a

shell 整型變數增(1)的幾種方法

#!/bin/sh a=1 a=$(($a+1)) a=$[$a+1] a=`expr $a + 1` let a++ let a+=1 ((a++)) echo $a 輸出 : 6 轉載自:http://blog.csdn.net/junchaox/arti

linux shell 定義函式(定義、返回值、變數作用域)介紹

inux shell 可以使用者定義函式,然後在shell指令碼中可以隨便呼叫。下面說說它的定義方法,以及呼叫需要注意那些事項。 一、定義shell函式(define function) 語法: [ function ] funname [()] {     act

linux shell定義函數(定義、返回值、變量作用域)介紹

shel 自己 lai cell define ber article clas ner linux shell 可以用戶定義函數,然後在shell腳本中可以隨便調用。下面說說它的定義方法,以及調用需要註意那些事項。 一、定義shell函數(define function)

Linux監控(添定義監控項,配置郵件告警)

map alt 服務端 網上 send rep pad ima 觸發 一、添加自定義監控項需求:監控某臺web的80端口連接數,並出圖。步驟:1):zabbix監控中心創建監控項目2):針對該監控項目以圖形展現第一步(需要到客戶端定義腳本)[root@zhuji ~]# v

Linux如何編寫啟動shell腳本

entos wall 枯燥 stop mage cal chmod 方案 clas 1.需求分析 在很多情況下,程序員都做著重復枯燥的工作,雖然這些工作也是必須的,其實這些重復性的工作可以執行腳本替代;今天筆者就如何編寫自啟動shell腳本減少程序員開啟服務器後的環境

Linux Shell命令(一)簡介 變數

shell簡介 Shell本身是一個用C語言編寫的程式,它是使用者使用Unix/Linux的橋樑,使用者的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行使用者輸入的命令;作為程式設計語言,它定義了各種變數和引數,並提供了

Linux Shell Echo多變數輸出時怪異疊寫現象(某些字串變數中含有\r或\n)

今天利用Linux Shell命令從檔案中擷取一部分文字行資訊 `Cat file | grep someKeyword` 到Shell變數中,然後又用shell字串變數擷取的方法,提取文字行內更準確的字元資訊;利用同樣的操作方法,得到多個字串變數資訊,最後再用echo組合多變數輸出所需要的格式資訊

Linux Shell Bash 變數賦值中 的作用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

[轉載] Linux export變數的生命週期和shell的生命週期相同,即shell指令碼執行完畢後,相應的export變數便失效了

說說shell指令碼中的export 和 source,bash 小弟剛剛接觸linux,對linux上的很多東西都比較陌生,所以寫一寫部落格,當做自己工作的總結和技術的積累吧,也是鞭策自己不斷努力的去學習。 今天之所以起這個標題,把export,source ,bash這三個命令放在一起講

Linux Shell基礎 環境變數、位置引數變數、預定義變數

環境變數   環境變數和使用者自定義變數最主要的區別在於,環境變數是全域性變數,而使用者自定義變數是區域性變數。使用者自定義變數只在當前的 Shell 中生效,而環境變數會在當前 Shell 和這個 Shell 的所有子 Shell 中生效。如果把環境變數寫入相應的配

Linux Shell基礎 環境變數配置檔案

source命令:使環境變數配置檔案強制生效 source 命令會強制執行指令碼中的全部命令,而忽略指令碼檔案的許可權。該命令主要用於讓重新配置的環境變數配置檔案強制生效。source 命令格式如下: [[email protected] ~]# source 配置檔案 或 [[ema