我正在制作一个shell脚本,它将自动化Arch Linux AUR packages的安装过程。我需要列出软件包的所有依赖项(以检查它们是否已安装),它们在安装脚本中显示如下:
depends=('sdl' 'libvorbis' 'openal')
我能想出的最简单的方法(或唯一的想法)是这样的:
grep "depends" PKGBUILD | awk -F"'" '{print $2 "\n" $4 "\n" $6;}'
但依赖计数因包而异。那么,如果字数变化,我如何输出引号中的名字?
提前致谢,
-skazhy
答案 0 :(得分:4)
如果depends
只是一行,你可以尝试的一件事是评估bash本身的行...这将导致一个名为“depends”的数组,它包含所有的值。看起来很棘手,但不是动态语言:
depend_line=`grep depends $PKGBUILD`
eval "${depend_line}"
echo ${depend[0]} # Will print sdl in your example
答案 1 :(得分:3)
您可以使用eval
来避免使用declare
或获取临时文件的安全问题:
declare -a "$(grep "depends" PKGBUILD)"
这将创建一个名为“depends”的数组,其中包含基于示例数据的“sdl”,“libvorbis”和“openal”。
答案 2 :(得分:1)
尝试使用此尺寸:
grep "depends" PKGBUILD > /tmp/depends
. /tmp/depends
echo ${depends[@]}
嘿,看,那是一个阵列?是的。
for d in "${depends[@]}" ; do
printf '"%s"' "$d"
done
注意:在实际脚本中,您需要更加谨慎地命名临时文件。
答案 3 :(得分:0)
您可以执行以下操作:
grep "depends" PKGBUILD | perl -e "while(<>){print \"\$1\\n\" while m/'.{-}'/g;}"
答案 4 :(得分:0)
awk -F"'" '{for(i=2;i<=NF;i+=2) print($i)}'