我无法使以下脚本像这样工作: 有一个名为githubrepos.txt的文件,其URL为“ https://github.com/GDSSecurity/Windows-Exploit-Suggester”。脚本检查文件夹是否在给定网址的/ opt /最后一部分中已经存在。
脚本在应该检查文件夹是否存在的部分中断。即使存在,它也总是转到其他部分。我认为这与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
答案 0 :(得分:1)
这是对您面临的各种问题的一般回答。我希望它能对您的具体情况有所帮助。
@Charles Duffy的建议已达到目标;有很多bash陷阱让初学者很容易陷入,但也很容易避免,例如通过阅读链接文章中的建议。您非常清楚地表明自己是个初学者,并且似乎很愿意学习,因此我强烈建议您阅读@Charles Duffy提供的链接,并遵循建议。
对于初学者来说,切换到使用while read LINE; do ... done < FILE
结构作为输入循环。它远远优于for LINE in $(COMMAND)
。我有25年以上的经历陷入了所有的打击陷阱,以支持我。
第二,减少问题。取出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
像这样的最小工作脚本也可以成为您正在编写的任何实用程序的基础,随着您逐步添加逻辑,测试过程中的每个更改,直到回到脚本中查找目录并发出{{1 }}命令。
同样,这是编写git
脚本并将问题简化为基本要求的一般建议,以便进行更精确的故障排除。再说一次,这仅仅是开始。阅读BashFAQ和BashPitfalls入门指南,以及我最喜欢的bash
参考文献Bash Guide for Beginners。
HTH。