2013-05-29 87 views
4

我学习Linux的命令,我练习,尝试写一个基本的shell脚本,列出子文件夹中的所有文件和文件,如ls *,使用递归。递归在shell脚本

#!/bin/bash 

# list-all: one command to list them all!!!! 

listit() { 
     if [ -d "$1" ] 
     then 
       listit "$1" 
     else 
       echo "$1" 
     fi 
} 

ls | while read items; do 
     listit "$items" 
done 

然而,结果表明:

./list-all: line 16: 1101 Done     ls 
     1102 Segmentation fault: 11 | while read items; do 
    listit "$items"; 
done 

是因为外壳不允许递归?请帮忙,谢谢!

+1

+1到你的学习工作。你是否知道'ls -R'或'find。键入-f'? –

+0

@glennjackman,谢谢!我只是意识到你可以使用这些命令。虽然对于第二个,我认为它应该是“找到”。型F' – Yoland

+0

事实上,由于为察觉错字 –

回答

2

外壳当然支持递归。但是你的函数需要参数,并且你传递它的stdin。除此之外,你真的不应该是parsing the output of ls。试想一下:

listit() { 
    while [ "$1" ]; do 
     if [ -d "$1" ]; then 
      listit "$1"/* 
     else 
      printf '%s\n' "$1" 
     fi 
     shift 
    done 
} 

listit * 

如果你真的要标准输入读取,你不得不重写listit做到这一点。这是棘手的,因为你只能得到一个标准输入,并且每次递归调用会试图拥有它。文件名是一个简单的东西,可以通过globbing访问,所以我会坚持这一点。

+0

感谢您对本! – Yoland

+0

+1'listit .'也可以。 –

2

你有无限递归堆栈溢出。考虑拨打listit /

第一if会看到/是一个目录,所以它会调用listit /然后将调用listit / ...

this answer for what happens next

+0

括号对于shell中函数应用程序的语法不正确。 '-bash:语法错误附近的意外令牌'/'' – kojiro

+0

@kojiro正确的你,修复,谢谢。 – msw