本文也即《Learning the bash Shell》3rd Edition的第五章Flow Control之读书笔记之二,但我们将不限于此。flow control是任何编程语言中很常用的部分,也包括了bash。在这里,我们将继续学习他们。

  和C不一样的是,在shell中是匹配list中的元素,因此非常适合用于命令的参数,文件列表。for格式如下:

for name  [in list ]
do
    statements that can use  $name...
done

  我们通过下面的例作进一步学习。一共设置了三个例子

# Test for the bash loop : for method
#
# Test 1: 显示$PATH中各个具体路径的详细信息

function getpath
{
    # 设置分割符号为“:”,缺省为空格

IFS=:

    # for测试,其中ls -ld中的-d表示之显示目录的属性,不显示目录下属的文件。

    for dir in $PATH
    do
        ls -ld $dir
    done


}

# 通常$PATH中包含~/bin目录,一般不存在,在ls的显示中会报告错误,需要挑出进行处理。同时我们增加一个空的元素来进行分析。

function getpath1
{
    path=$PATH::
    echo check : $path
    IFS=:

for dir in $path
    do
        # 如果是空元素,将其转换为当前目录。

if [ -z $dir ] ; then    dir=. ; fi
        if ! [ -e $dir ]; then
            echo "$dir is not exist!"
        elif ! [ -d $dir ]; then
            echo "$dir is not a directory!"
        else
            ls -ld $dir
        fi
    done
}

#echo 'run getpath'
#getpath

echo 'run getpath1'
getpath1

# Test 2 显示指定文件的是否是有效文件名

function finfo
{
    if ! [ -e "$1" ]; then
        echo "$1 is not an availble file."
    else
        echo "$1 is a file."
    fi
}

echo 'run fileinfo'
# 如果命令没带参数,即list为空,则不执行for里面的代码

for filename in $@; do
    echo "in for loop..."
    finfo "$filename"
done

  下面是一个递归的例子,我们希望将目录下的文件也显示出来。根据层次结构,下一级比上一级向后挪一个tab。

# Test 3: 显示目录下的文件,采用递归方式 。showdirfile 表示显示所在目录的所有文件,如果也是目录,递归执行。为了记录方便,将注释加载命令行后面,注意这只是为了阅读方便,而不是shell应有的语法。

function showdirfile

      #step1
:只有是有效目录文件,才search 
 
      if [ -d $1 ] ; then 
        #step2
,比上一级后退tab,记录前面tab的字符

        currenttab+="/t"
        #$(command <command>)

用于给出command的输出结果,作为字符串。
        #step 3
:搜索ls <dir_name>所显示的entry,如果是文件,显示,如果是字符串显示,并在后面加上"/",表明是目录,使用递归,检索该目录下的文件。

        for file in $(command ls $1);
do
            echo -e -n ${currenttab}$file
            #step 4:
文件的含路径名字为$1/$file,由于我们没有采用cd $file,即没有进入该目录进行访问,因此要记录path,如果是目录,用dir记录下这个子目录的名字

if [ -d $1/$file ]; then
                echo "/"
                showdirfile $1/$file
            else
                echo
            fi
        done
        #step2
,执行完推出,恢复上一级的前面的tab字符串,即去掉最后的/t。

        currenttab=${currenttab%"/t"}
    # end of step 1

fi
}
# 之前设置了IFS,会使得ls的输出不是以空格为分割,异常,需要重置它

unset
IFS
echo 'run file architechture'
showdirfile ${1:-"~"}

shell 之for [转]的更多相关文章

  1. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  2. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  3. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  4. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  5. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  6. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  7. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  8. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  9. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  10. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

随机推荐

  1. TCP/IP详解学习笔记(5)-- ICMP:internet 控制报文协议

    1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制 ...

  2. 简单的2d图形变换--仿设变换AffineTransform

    在ios中常常遇到些小的动画效果,比如点击一个按钮后,按钮上的三角形图片就旋转了.这种简单的小动画,常常通过更改view的transform属性来实现.这个transform属性,就是一个仿射变化矩阵 ...

  3. DP:Sumsets(POJ 2229)

     数的集合问题 题目大意:给定你一个整数m,你只能用2的k次幂来组合这个数,问你有多少种组合方式? 这一题一看,天啦太简单了,完全背包?是不是? 不过的确这一题可以用完全背包来想,但是交题绝对是TLE ...

  4. JavaScript、Jquery选择题

    尚学堂Java EE软件工程师认证考试 试题库-选择题     一.    选择题(包括单选和双选) 1.B 在JavaScript中,以下变量命名非法的是(   )(选择一项) A. numb_1 ...

  5. hadoop中常见元素的解释

    secondarynamenode 图: secondarynamenode根据文件的的大小对namenode的编辑日志和镜像日志 进行合并. 光从字面上来理解,很容易让一些初学者先入为主的认为:Se ...

  6. asp.net mvc int[] 和 string[] 自定义数组绑定

    新建类,int[]数组模型绑定 using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

  7. .net学习笔记----Asp.net的生命周期之一应用程序生命周期

    Http请求刚刚到达服务器的时候 当服务器接收到一个 Http请求的时候,IIS (Internet Information Services,互联网信息服务)首先需要决定如何去处理这个请求. 什么是 ...

  8. Linux查看硬件配置信息

    转自:http://blog.163.com/yang_jianli/blog/static/1619900062010391127338/ 一:查看cpu more /proc/cpuinfo | ...

  9. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  10. loj 1063(求割点个数)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26780 思路:判断一个点是否是割点的两个条件:1.如果一个点v是根 ...