首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当设置"shopt -s nullglob“时,sed失败

当设置"shopt -s nullglob“时,sed失败
EN

Stack Overflow用户
提问于 2015-03-19 19:37:25
回答 1查看 312关注 0票数 1

几天前,我开始编写一个bash脚本,它可以总结文件夹中所有PDF文件的页数和文件大小。它现在运行得很好,但有一件事我还是不明白。

如果设置了shopt -s nullglob,为什么sed总是失败?有人知道为什么会这样吗?

我正在Ubuntu14.04中使用GNU Bash 4.3和sed 4.2.2。

代码语言:javascript
复制
set -u
set -e

folder=$1

overallfilesize=0
overallpages=0
numberoffiles=0

#If glob fails nothing should be returned
shopt -s nullglob

for file in $folder/*.pdf
do

  # Disable empty string if glob fails
  # (Necessary because otherwise sed fails ?:|)
  #shopt -u nullglob

  # This command is allowed to fail
  set +e
  pdfinfo="$(pdfinfo "$file" 2> /dev/null)"
  ret=$? 
  set -e  

  if [[ $ret -eq 0 ]]
  then 
    #Remove every non digit in the result
    sedstring='s/[^0-9]//g'
    filesize=$(echo -e "$pdfinfo" | grep -m 1 "File size:" | sed $sedstring)
    pages=$(echo -e "$pdfinfo" | grep -m 1 "Pages:" | sed $sedstring)

    overallfilesize=$(($overallfilesize + $filesize))  
    overallpages=$(($overallpages+$pages))  
    numberoffiles=$(($numberoffiles+1))  
  fi

done

echo -e "Processed files: $numberoffiles"
echo -e "Pagesum: $overallpages"
echo -e "Filesizesum [Bytes]: $overallfilesize"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-19 19:46:42

这里有一个简单的测试用例来重现您的问题:

代码语言:javascript
复制
#!/bin/bash
shopt -s nullglob
pattern='s/[^0-9]//g'
sed $pattern <<< foo42

预期产出:

代码语言:javascript
复制
42

实际产出:

代码语言:javascript
复制
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
(sed usage follows)

之所以会出现这种情况,是因为s/[^0-9]//g是一个有效的glob (匹配像s/c/g这样的dir结构),并且您要求bash解释它。由于您没有匹配的文件,所以nullglob启动并完全删除模式。

双重引用阻止了分词和单词解释,而这几乎总是你想要的:

代码语言:javascript
复制
#!/bin/bash
shopt -s nullglob
pattern='s/[^0-9]//g'
sed "$pattern" <<< foo42

这将产生预期的输出。

除非您有特定的理由不引用,否则应该始终双引号引用所有变量引用

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29153484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档