【问题标题】:Extracting words in quotes in shell script在shell脚本中提取引号中的单词
【发布时间】:2010-10-29 11:19:01
【问题描述】:

我正在制作一个 shell 脚本,它将自动执行 Arch Linux AUR packages 的安装过程。我需要列出包的所有依赖项(以检查它们是否已安装),它们在安装脚本中如下所示:

depends=('sdl' 'libvorbis' 'openal')

我能想到的最简单的方法(或唯一的想法)是这样的:

grep "depends" PKGBUILD | awk -F"'" '{print $2 "\n" $4 "\n" $6;}'

但依赖项计数因包而异。那么,如果字数不同,我如何输出引号中的名称?

提前致谢,

-skazy

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

    如果depends 只是一行,您可以尝试的一件事是在 bash 本身中评估该行...这将导致一个名为“depends”的数组包含所有值。看起来很棘手,但不是动态语言:

    depend_line=`grep depends $PKGBUILD`
    eval "${depend_line}"
    echo ${depend[0]} # Will print sdl in your example
    

    【讨论】:

      【解决方案2】:

      您可以避免使用eval 或使用declare 获取临时文件的安全问题:

      declare -a "$(grep "depends" PKGBUILD)"
      

      这将根据示例数据创建一个名为“depends”的数组,其中包含“sdl”、“libvorbis”和“openal”。

      【讨论】:

      • +1 来自我;这就是我要在我的编辑中提出的建议,只是为了回避 eval/no eval 问题。一个更好(也更笨拙)的解决方案。
      【解决方案3】:

      试穿一下尺寸:

      grep "depends" PKGBUILD > /tmp/depends
      . /tmp/depends
      
      echo ${depends[@]}
      

      你看,那是一个数组吗?是的。

      for d in "${depends[@]}" ; do
          printf '"%s"' "$d"
      done
      

      注意:在实际脚本中,您需要更加小心地命名临时文件。

      【讨论】:

      • 为什么要创建一个有“eval”的临时文件? :) 查看我的回复。
      • 因为 eval 很危险。采购风险较小。
      • 对不起,但在这种情况下,使用源 ("."),您只是在 评估您正在阅读的文件...
      • 鼓励使用危险的工具是结束你的脚的好方法。
      • @Sorpigal:我认为教某人避免使用工具而不是教他们理解它对学生有害。
      【解决方案4】:

      你可以这样做:

      grep "depends" PKGBUILD | perl -e "while(<>){print \"\$1\\n\" while m/'.{-}'/g;}"
      

      【讨论】:

        【解决方案5】:

        awk -F"'" '{for(i=2;i&lt;=NF;i+=2) print($i)}'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 1970-01-01
          • 1970-01-01
          • 2022-12-18
          • 1970-01-01
          • 2011-04-25
          相关资源
          最近更新 更多