我有以下生成的股票列表,它被放置在名为
awk_1
的文件中
dfs
fsd
dsf
sdf
然后我运行以下一个生成正确 ULR 链接的班轮
while read i ; do
echo $(http://uk.finance.yahoo.com/echartss=$i#symbol=$i\;range=my\;compare=\;indicator=volume\;charttype\=area\;crosshair\=on\;ohlcvalues\=0\;logscale\=off\;source\=undefined\;) tee stock_urls;
done < awk_1
但是没有将输出放在名为
stock_urls
的文件中?
它还在屏幕上生成奇怪的输出,下面是我得到的标准输出的一小部分输出。它把
./large_cap_stocks.sh: 51: ./large_cap_stocks.sh:
放在前面,not found
放在最后;为什么会这样?
我一直在上下搜索为什么这不起作用 - 任何帮助将不胜感激。
你可能打算这样写:
while read i; do
echo "http://uk.finance.yahoo.com/echarts?s=$i#symbol=$i\;range=my\;compare=\;indicator=volume\;charttype\=area\;crosshair\=on\;ohlcvalues\=0\;logscale\=off\;source\=undefined\;"
done < awk_1 | tee stock_urls
即:
echo
命令中,使用 "..."
来引用您的文本,而不是 $(...)
,这是别的东西|
将输出传递给 tee
,您可以通过这种方式对整个循环进行管道传输,无需为单独的 echo
行执行操作。至于哪里出了问题,你这里有几个基本的语法错误。
echo $(http://something)
尝试将 http://something
作为命令运行,然后将其输出作为字符串传递给 echo
。当然,在您的情况下,http://something
不是有效命令,因此这就是您收到 not found
错误消息的原因。
echo
。echo $(http://something) tee file
将三个参数传递给echo
;其中两个是tee
和file
,所以它实际上根本不会运行tee
。tee
将覆盖每次迭代中的输出文件,最终只得到文件中最后一次循环迭代的输出。echo
论证中的迷信反斜杠是多余的。等号根本不是 shell 元字符,双引号字符串中的分号仅表示文字分号字符本身。最小的修复看起来像
while read i ; do
echo "http://uk.finance.yahoo.com/echartss=$i#symbol=$i;range=my;compare=;indicator=volume;charttype=area;crosshair=on;ohlcvalues=0;logscale=off;source=undefined;" |
tee -a stock_urls
done < awk_1
但更好的解决方法是避免从循环内部重定向;
while read i ; do
echo "http://uk.finance.yahoo.com/echartss=$i#symbol=$i;range=my;compare=;indicator=volume;charttype=area;crosshair=on;ohlcvalues=0;logscale=off;source=undefined;"
done < awk_1 | tee stock_urls
更好的解决方案仍然是用单行(或者,好吧,双行)替换这个粗糙的 和缓慢的 循环;
sed 's|.*|http://uk.finance.yahoo.com/echartss=&#symbol=&;range=my;compare=;indicator=volume;charttype=area;crosshair=on;ohlcvalues=0;logscale=off;source=undefined;|' awk_1 |
tee stock_urls
这使用
sed
命令 s/regex/replacement/
正则表达式匹配整个输入行,替换中的 &
调用正则表达式匹配的文本。
也许还可以访问 https://shellcheck.net/ 应该能够指出至少其中一些错误。