我不能让下面的脚本像这样工作:有一个名为githubrepos.txt的文件,其中包含urls,例如"https://github.com/GDSSecurity/Windows-Exploit-Suggester“。脚本检查该文件夹是否已经存在于给定url的/opt/ last部分中。
脚本在应该检查文件夹是否存在的地方中断。它总是转到else部分,即使它存在。我认为这与if -d $localdir部分有关。可能使用$localdir变量。我花了几个小时在它上面,却不能把它修好。想要一些帮助,这是我写的第一个脚本。
#!/bin/bash
#Start downloading github repos
for repos in $(cat githubrepos.txt)
do
localrepodir="/opt/${repos##*/}"
echo $localrepodir
if [ -d $localrepodir ];
then
echo ${repos##*/}
echo "Already exists, updating tool with git pull";
cd $(echo $localrepodir | tr -d '\r');
git pull
else
echo ${repos##*/}
echo "Tool needs to be cloned";
git clone $repos
fi
done发布于 2018-10-24 20:44:48
这是对你所面临的各种问题的一般回答。我希望它能在你的特定案例中帮助你。
来自@Charles Duffy的建议是有针对性的;有许多bash陷阱对于初学者来说很容易陷入,但也很容易避免,例如,通过阅读链接文章中的建议。你清楚地表明你是一个初学者,而且你似乎非常愿意学习,所以我强烈建议你阅读@Charles Duffy提供的链接,并遵循建议。
对于初学者,切换到为您的输入循环使用 while read LINE; do ... done < FILE structure。它远远优于for LINE in $(COMMAND)。我有25+多年陷入所有的bash陷阱来支持我这一点。
其次,减少你的问题。去掉git命令和目录操作,比如cd和-d测试。你的问题不在于这些东西,而在于你的输入。您需要一个脚本来显示您的输入到底发生了什么。这不仅更接近于作为SO问题基础的MCVE,还可能帮助您自己解决问题。下面是一个例子:
#!/bin/bash
while read LINEIN
do
echo "XXX ${LINEIN} OOO"
done < inputfile请注意,这将立即揭示您的回车问题。例如,我使用以下命令创建了一个输入文件:
echo 'one' > inputfile
echo 'two two' >> inputfile
echo -e 'three three three\r' >> inputfile
echo 'four four four four' >> inputfile使用上面的脚本,它会产生以下结果:
XXX one OOO
XXX two two OOO
OOOthree three three
XXX four four four four OOO这清楚地显示了回车。因此,我可以通过脚本修改:
while read LINEIN
do
LINETRIM=`echo "$LINEIN" | tr -d '\r'`
echo "XXX ${LINETRIM} OOO"
done < inputfile并获取:
XXX one OOO
XXX two two OOO
XXX three three three OOO
XXX four four four four OOO像这样的最小工作脚本也可以作为您正在编写的任何实用程序的基础,因为您可以逐步添加逻辑,在此过程中测试每个更改,直到您返回到查找目录并发出git命令的脚本。
同样,这是编写bash脚本的一般建议,有助于将问题减少到本质,以便进行更精确的故障排除。再说一次,这只是个开始。阅读初学者的BashFAQ和BashPitfalls指南,以及我最喜欢的bash reference Bash Guide for Beginners。
HTH。
https://stackoverflow.com/questions/52951230
复制相似问题