bash for grave命令循环

时间:2014-01-02 22:44:04

标签: bash shell curl for-loop awk

Web服务器包含几个日志文件,我尝试使用curl和awk编写一些shell脚本,根据某些模式查找文件,然后下载。 可能有更聪明的方法来做所有这些事情(也是awk部分 - 我是初学者)但我决定在for循环中进行下载部分,当我直接在shell中运行它时它确实下载了文件。

# for line in `curl -X GET -k  --user $user:$pass $link 2>/dev/null | awk -v pat="$pat2" '$0~ "/"pat".log"'| awk -v val=$host1 -F '"' '{print val $2}'`; 
do 
echo "Downloading $line"; 
curl -O -X GET -k  --user $user:$pass $line 2> /dev/null; 
done  

现在我正在努力将这个for循环集成在脚本中。这是我目前的尝试,但它不知何故不执行我刻后的命令并将其放入列表var。因此,任何有关如何完成该部分或展示更清洁方法的建议都将受到高度赞赏。

test_pass=`curl -X GET -k  --user $user:$pass $link 2>/dev/null | grep '401 - Authorization Required' | cut -d '>' -f2 | cut -d ' ' -f1 -`
failed="401"
list=$(curl -X GET -k  --user $user:$pass $link 2>/dev/null | awk -v pat="$pat2" '$0~ "/"pat".log"'| awk -v val=$host1 -F '"' '{print val $2}')

if  [[ "$test_pass" = "$failed" ]]; then
 echo "Wrong Password."
 exit 1
else
 echo "Starting Download"
for line in $list; do
 echo "Downloading $line"
 curl -O -X GET -k --user $user:$pass $line 2> /dev/null
done
fi

1 个答案:

答案 0 :(得分:0)

我建议使用bash arrays

表单var=($(cmd))的分配将$var设置为一个数组,其中包含cmd返回的每个结果的一个条目

然后

${var[@]}将扩展到数组中的所有条目,用空格分隔

请注意,如果您尝试获取的文件名中有空格(或更糟糕的情况,例如换行符),则需要更多工作

这是您的代码,稍加修改以使$list成为数组:

test_pass=`curl -X GET -k  --user $user:$pass $link 2>/dev/null | grep '401 - Authorization Required' | cut -d '>' -f2 | cut -d ' ' -f1 -`
failed="401"
list=($(curl -X GET -k  --user $user:$pass $link 2>/dev/null | awk -v pat="$pat2" '$0~ "/"pat".log"'| awk -v val=$host1 -F '"' '{print val $2}'))

if  [[ "$test_pass" = "$failed" ]]; then
 echo "Wrong Password."
 exit 1
else
 echo "Starting Download"
for line in "${list[@]}"; do
 echo "Downloading $line"
 curl -O -X GET -k --user $user:$pass "$line" 2> /dev/null
done
fi