【问题标题】:Parsing ls, not recommended解析ls,不推荐
【发布时间】:2013-11-03 15:42:54
【问题描述】:

我收到了关于不要解析 ls 的建议,如本网站所述:Don't parse ls
我在我的目录中寻找 DAILY 文件,这就是我当时所做的:

for f in *.DA*; do   
    [[ -e $f ]] || continue 
    for file in $f; do  
        echo "The file that you are working on: "$file
        archiveContent=$( sed -n -e 1p $file )
        echo $archiveContent
    done
done  

好的,这很好用,我有两个文件 A.DAILY 和 B.DAILY,通过这两个档案我可以得到其中的内容,但是当我稍微更改循环时,它不会迭代我的目录中所有扩展名为 .DAILY 的文件。

for f in *.DA*; do     
    [[ -e $f ]] || continue     
    for file in $f; do    
        echo "The file that you are working on: "$file    
        archiveContent=$( sed -n -e 1p $file )
        echo $archiveContent  
        COMPRESS $archiveContent;    
    done  
done  

当我在循环中调用函数时,循环只对第一个文件执行,而不是对第二个文件执行。

【问题讨论】:

  • $f 是单个文件名,因此内循环只有一次迭代,其中$file$f 具有相同的值。
  • 你建议做什么?我认为循环遍历文件,因为没有命令 COMPRESS $archiveContent,它向我显示:The file that you are working on: A.DAILY the content of the A.DAILY The file that you are working on: B.DAILY the content of the B.DAILY
  • 删除内循环?它没有任何用途。
  • 如果您的脚本输出The file that you are working on: B.DAILY,那么循环正在执行第二个文件。你期望什么输出,你得到什么输出?
  • 我得到了我想要的输出,如果我评论COMPRESS函数,如果没有,循环只适用于第一个文件。

标签: linux shell scripting ls


【解决方案1】:

由于外部循环依次为每个文件设置f,因此您的内部循环似乎没有任何用途。

for f in *.DA*; do
    [[ -e $f ]] || continue     
    echo "The file that you are working on: $f"    
    archiveContent=$( sed -n -e 1p "$f" )
    echo "$archiveContent"  
    COMPRESS "$archiveContent"
done  

【讨论】:

  • 不起作用,问题可能与函数COMPRESS有关,它接受参数然后搜索一个存档并压缩,完成后,无事可做......所以,在那个循环中,#COMPRESS 评论它就像我发布的另一个一样工作......
  • 如果您认为问题出在COMPRESS,也许您可​​以分享它的作用。
  • 压缩函数是这样做的:COMPRESS() { #this function make the compress of the each image tar -czf ${imageName-$date}.tar.gz ${imageBasename} 2>>$ERRORLOG if [ $? -eq 0 ] then echo "success compress of the file: ${imageBasename}" else echo "Some errors appears in the script, see the log file for more description" fi 抱歉评论代码的样子,我尝试格式化,还剪掉了COMPRESS 函数的一堆行...跨度>
  • 不要在cmets中放那么多代码;编辑您的问题以包含代码。也就是说,我认为您只需要修复语法:tar -czf "${imageName}-$date.tar.gz" "$imageBasename"。如果$imageName 是空字符串,${imageName-$date} 将扩展为$date 的值。您拥有使用默认值参数扩展运算符的无冒号版本。
  • $imageName 永远不会为空@chepner,我很确定。并且修复我的语法根本不起作用,好吧,我尝试了其他方法,我制作了其他脚本,它读取两个档案的内容,扩展名为.DAILY,在这个档案中,我有一个目录,我在其中拿这个目录,我让脚本进入这个目录。在我发出命令之前,例如 cd $dir 其中 dir 是从文件中提取的目录变量,它不会使两个档案的循环,只是一个!所以我认为如果脚本在同一个目录中,它只会做一些事情。
猜你喜欢
  • 2023-03-22
  • 2021-10-04
  • 2015-08-10
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多