关于UNIX Shell脚本

问题描述:

当文件夹中没有文件时,以下脚本将进入for循环。不知道我可以修改,以便它不会进入for循环。另外,当目录退出状态内没有文件应该是成功的。包装脚本检查以下脚本关于UNIX Shell脚本

 FILESRAW ="/exp/test1/folder" . 
for fspec in "$FILESRAW"/* ; do 
    echo "$fspec" 
    if [[ -f ${fspec} ]] ; then 
     ..... processing logic 
    else 
    ... processing logic 
    fi 
done 

使用bash

如果退出状态,

可以设置nullglob

shopt-s nullglob

如果您有隐藏文件,

shopt -s dotglob

用KSH,

#!/bin/ksh 
set -o noglob 
for file in /path/* 
do 
    .... 
done 
+0

我使用korn外壳。我也不想要任何隐藏的文件。我是否需要将以上两行放在shell脚本的开头 – Arav 2010-03-30 00:45:40

+0

中,您在脚本之前设置了它们 – ghostdog74 2010-03-30 01:13:57

+0

非常感谢信息 – Arav 2010-03-30 01:20:39

for fspec in `dir $FILESRAW` ; do 
+0

非常感谢信息 – Arav 2010-03-30 01:13:33

+0

@Arav请注意您是否找到有用的答案。 – 2011-07-30 18:59:01

要退出,如果$ FILESRAW为空:

[ $(ls "$FILESRAW" | wc -l) -eq 0 ] && exit 0

如果此测试之前的循环,它会阻止执行到达的循环,如果$ FILESRAW是空的。

当$ FILESRAW是空的, “$ FILESRAW”/ *扩展为 “/ EXP/TEST1 /文件夹/ *”,作为ghostdog74所指出的,你可以通过设置了nullglob与改变这种行为

shopt -s nullglob 

如果你想隐藏的文件,设置dotglob还有:

shopt -s dotglob 

或者,你可以使用,而不是globing LS。这与非常充分的目录工作的优势(用管,你不会达到最大极限参数):

ls "$FILESRAW" | while read file; do 
    echo "$file" 

,如果你想隐藏的文件,这变得混乱,因为你需要排除。并..以模拟globing行为:

ls -a "$FILESRAW" | egrep -v '^(\.|\.\.)$' | while read file; do 
    echo "$file" 
+0

只使用'ls'会省去隐藏的文件。 – ghostdog74 2010-03-30 00:20:04

+0

谢谢,我已经添加了一些关于隐藏文件的讨论。 – 2010-03-30 00:28:36

+0

非常感谢这些信息 – Arav 2010-03-30 01:13:07