我通过在/ etc / drush /
中运行此文件来获取文件input.txt
或网址
ls /etc/drush | grep test | sed s/.alias.drushrc.php//g | sed '/^$/d' > input.txt
我把它喂成这样的循环:
while read a; do
echo "url: $a"
done < input.txt
或者像这样:
cat input.txt | while read a; do
echo "url: $a"
done
我总是在最后得到一个额外的“url:”,并且已经确认没有空行。我确认
cat input.txt
有什么想法导致额外的迭代?
input.txt看起来像这样:
www.first.com
www.something.com
www.something.com
www.last.com
输出看起来像这样
url: www.first.com
url: www.something.com
url: www.something.com
url: www.last.com
url:
答案 0 :(得分:0)
额外的迭代可能是因为您的输入文件末尾有一个空行。您可以查看tail -n 3 input.txt | od -ax
。
我建议检查循环中的空白行:
while read a; do
if [[ -z "$a" ]]; then continue; fi
echo "url: $a"
done < input.txt
如果以下字符串为零长度,则-z
检查返回true。如果是,我们将while循环跳过该迭代。
答案 1 :(得分:0)
我们可以做得比
好很多ls /etc/drush | grep test | sed s/.alias.drushrc.php//g | sed '/^$/d' > input.txt
以下是纯粹的进程 - 在任何地方都没有外部命令 - 因此速度更快,更容易出错:
files=( /etc/drush/*test* ) # glob-expand to generate a list of full paths
files=( "${files[@]##*/}" ) # remove everything up to and including the last '/'
files=( "${files[@]//.alias.drushrc.php/}" ) # remove .alias.drushrc.php from names
for url in "${files[@]}"; do # iterate over names in the array
echo "url: $url"
done
如果.alias.drushrc.php
是扩展名而不是文件名中任何位置可以找到的内容,则可以改为将该行写为:
files=( "${files[@]%.alias.drushrc.php}" )
要了解此处的表达方式,请参阅BashFAQ #73 (on parameter expansion, the technique used here)或BashFAQ #100 (on native string manipulation in bash in general)。
要理解为什么原始版本有错误,您可以从ParsingLs开始,另外请注意新行是POSIX系统上文件名内的有效字符。