Bash 在shell脚本中提取引号中的单词

Bash 在shell脚本中提取引号中的单词,bash,shell,awk,Bash,Shell,Awk,我正在制作一个shell脚本,它将自动化ArchLinux的安装过程。我需要列出软件包的所有依赖项(以检查它们是否已安装),它们在安装脚本中显示如下: depends=('sdl' 'libvorbis' 'openal') 我能想到的最简单的方法(或唯一的想法)是这样的: grep "depends" PKGBUILD | awk -F"'" '{print $2 "\n" $4 "\n" $6;}' 但依赖项计数因包而异。那么,如果字数不同,我如何在引号中输出名称呢 提前感谢, -ska

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

depends=('sdl' 'libvorbis' 'openal')
我能想到的最简单的方法(或唯一的想法)是这样的:

grep "depends" PKGBUILD | awk -F"'" '{print $2 "\n" $4 "\n" $6;}'
但依赖项计数因包而异。那么,如果字数不同,我如何在引号中输出名称呢

提前感谢,


-skazhy

你可以这样做:

grep "depends" PKGBUILD | perl -e "while(<>){print \"\$1\\n\" while m/'.{-}'/g;}"
grep”依赖于“PKGBUILD | perl-e”while(){print\“\$1\\n\”而m/'.{-}'/g;}”
试试这个尺码:

grep "depends" PKGBUILD > /tmp/depends
. /tmp/depends

echo ${depends[@]}
嘿,看,那是一个数组吗?是的

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

注意:在实际脚本中,您可能希望在命名临时文件时更加小心。

如果
依赖的
只是一行,那么您可以尝试在bash中计算该行。。。这将导致一个名为“depends”的数组,该数组保存所有值。看起来很棘手,但不适用于动态语言:

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

awk-F“'”{for(i=2;i您可以通过使用
declare
避免使用
eval
或寻找临时文件的安全问题:

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

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

为什么要在有“eval”的情况下创建临时文件?:)请参阅我的回答。因为eval非常危险。寻源风险较小。对不起,在这种情况下,使用源(“.”),你只是在评估你正在阅读的文件……鼓励使用危险的工具是一种让你的脚被打掉的好方法。@Sorpigal:我认为教别人避免使用工具而不是教他们理解工具是对学生的伤害。+1来自我;这是我在编辑我的一篇文章中为s提出的建议第一步是评估/不评估问题。这是一个更好(也更害羞)的解决方案。