【问题标题】:bash for loop with grave command带有严重命令的bash for循环
【发布时间】:2014-01-20 12:20:11
【问题描述】:

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

【问题讨论】:

  • 只需在 shell 提示符下单独尝试 list=$(curl...) 行,然后使用 echo "$list" 检查 list 的值。一旦你检查它是否正常工作,你可以尝试投入一些更复杂的东西。甚至使用您的第一个脚本并将其扩展一行。一次添加一个东西,并在每一步之后检查它是否有效。
  • 您也可以在脚本中的某处写set -x 以从那里开始调试。
  • " echo "Downloading $line" 的输出是什么?
  • echo $list 返回一些文件,但都在一行中,而当我在 shell 中运行 curl 命令时,它会返回文件列表和新行中的每个文件。
  • echo "Downloading $line 不返回任何内容我只得到“开始下载”行。就是这样。

标签: bash shell curl for-loop awk


【解决方案1】:

我建议使用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

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2019-11-14
    • 1970-01-01
    • 2021-12-01
    • 2015-12-23
    相关资源
    最近更新 更多