Linux Shell 变量自加
转至:https://blog.csdn.net/dj0379/article/details/50946398/
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 $@ 
    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 $@ 
    #检查如果是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 $@ 
    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 变量自加的更多相关文章
- Linux shell 变量 数学 运算
		
Abstract : 1) Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算: 2)Linux shell 中使用 expr 与 ...
 - python文件读写操作与linux shell变量命令交互执行
		
python对文件的读写还是挺方便的,与linux shell的交互变量需要转换一下才能用,这比较头疼! #coding=utf-8 #!/usr/bin/python import os impor ...
 - Linux shell变量详解
		
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个 ...
 - 《Linux shell变量总结回顾》RHEL6(转)
		
文章版权:http://www.cnblogs.com/linux-super-meng/ 环境变量路径: [root@localhost ~]# set //查看到的是局部变量和全局变量2种 [ ...
 - Linux Shell变量
		
200 ? "200px" : this.width)!important;} --> 介绍 变量是shell脚本中必不可少的组成部分,在脚本中使用变量不需要提前声明.在ba ...
 - linux shell变量$#,$@,$0,$1,$2的含义解释
		
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 ...
 - Linux - Shell变量的配置守则
		
变量的配置守则 变量与变量内容以一个等号『=』来连结,如下所示: 『myname=VBird』 等号两边不能直接接空格符,如下所示为错误: 『myname = VBird』或『myname=VBird ...
 - linux shell 变量子串
		
linx变量子串 在本例子中,变量 test=https://www.//cnblogs./com//jjmaokk/p/10135401.html 1,${#parameter} 返回变量$para ...
 - linux shell变量的截取
		
变量的截断,经常用到的是${},##和%%几个特殊符号.假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt ,可以用${ }分别替换得到不同的值: ${file ...
 
随机推荐
- java输入年份和月份,输出天数
			
import java.util.*; public class Demo { public static void main(String[] args){ int days = 0; Scanne ...
 - Iptables的命令与用法
			
目录 一:iptables的用法 1.iptables简介 二:Iptables链的概念 1.那四个表,有哪些作用? 2.那五条链,运行在那些地方? 3.Iptables流程图 三:iptables的 ...
 - vs2012 error: package 'visual c++ package' failed to load
			
某天打开Visual Studio突然出现了"error: package 'visual c++ package' failed to load",解决方案如下: 1. 依此顺序 ...
 - 浅谈C#可变参数params
			
前言 前几天在群里看到群友写了一个基础框架,其中设计到关于同一个词语可以添加多个近义词的一个场景.当时群友的设计是类似字典的设计,直接添加k-v的操作,本人看到后思考了一下觉得使用c#中的params ...
 - java-swing-事件监听-焦点监听器
			
感谢大佬:https://blog.csdn.net/weixin_44512194/article/details/93377551 开始不知道焦点是啥,其实就是打字的时候,这个一闪一闪的竖线. 与 ...
 - 调试程序Bug-陈棚
			
1.使用NSAssert 主要可以作为自定义bug的返回信息,对调试极为方便知道bug出现在哪 NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式 ...
 - 部署YUM仓库及NFS共享服务
			
部署YUM仓库及NFS共享服务 目录 部署YUM仓库及NFS共享服务 一.YUM仓库服务 1. YUM概述 2. 部署YUM软件仓库 (1)准备安装源 ①YUM仓库的种类 ②RPM软件包的来源 ③构建 ...
 - Docker prefereces
			
https://docs.docker.com/docker-for-mac/#preferences-menu docker 的镜像命令需要抽时间了解
 - 《PHP程序员面试笔试宝典》——在被企业拒绝后是否可以再申请?
			
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 很多企业为了能够在一年一度的招聘季节中,提前将优秀的程序员锁定到自己的麾下,往往会先下手为强.他们通常采取的措施有两种: ...
 - C# 实例解释面向对象编程中的开闭原则
			
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...