我需要导入如下所示的文本文件:
AMBI
CBNK
CCXI
CERE
CLACW
CNYD
DAEG
DLIA
DLLR
DNDN
DSGX
HAST
HIBB,
HPOL
IRDMZ
MARK
NEPT
NFEC
NINE
NRCIB
OMER
PLCC
PLPM
PSUN
UNTK
有 25 个条目,我需要将它们传递到 bash 脚本中。
我想为每个符号运行一次程序。这些符号是纳斯达克股票符号。我试图在脚本中引用一段话。
我已经能够手动执行此命令:
sh stock (symbol) > /home/user/Desktop/stockquote.txt
通过手动输入(符号),我需要一个脚本来自动执行此操作。
答案1
您是否尝试将每一行视为符号?
将 25 个条目放在名为stocks.txt 的文件中。然后使用以下脚本迭代stocks文件中的每一行,并使用同一脚本中声明的stock函数处理代码:
while read symbol ; do
stock $symbol >> /home/user/Desktop/stockquote.txt
done < stocks.txt
答案2
显然,问题的标题和正文对我来说似乎不太一样。这里有两个解决方案:
将数据从外部文件导入到 Bash 脚本中:
读取文件并将其内容作为条目存储在数组中。 (笔记:考虑到文本文件的内容,这是可行的。例如,如果文件中的任何行有多个不带引号的单词,则如此形成的数组将不会达到预期效果。)
declare -a symbols=($(cat input_file.txt | tr '\n' ' '))
symbols
现在,按如下方式迭代数组的项目。
LOG_FILE=/home/user/Desktop/stockquote.txt
for symbol in ${symbols[@]}
do
# echo "Processing $symbol ..."
sh stock "$symbol" >> "$LOG_FILE"
done
事实上,您可以将其嵌入到名为 stock 的脚本中。只需将sh stock "$symbol"
上面的内容更改为这样:
f_process "$symbol" >> "$LOG_FILE"
其中f_process
可能是处理该符号的函数。如果您不想编写函数,只需将相关代码行放在那里即可。
将外部文件中的数据作为参数传递给 shell 脚本:
LOG_FILE=/home/user/Desktop/stockquote.txt
while read symbol
do
stock "$symbol" >> "$LOG_FILE"
done < input_file.txt
答案3
如果要循环遍历文件的行,可以read
在循环中使用内置函数,如下所示:
while IFS= read -r line; do
echo "$line"
done <input_file.txt
该行的内容存储在变量中line
(您可以选择任何其他名称)。看了解 IFS以获得更多解释。如果没有IFS=
,前导或尾随空格将被删除,这在您的情况下可能是理想的。
请注意>stockquote.txt
每次都会截断输出文件。要么将它放在整个命令中,要么使用>>stockquote.txt
它附加到文件中。如果您使用>>
,请注意脚本启动时该文件可能不为空。
此代码片段为每一行运行程序stock
,并将输出存储在每个符号之间的stockquote.txt
空行(echo
不带参数)中。
while read -r line; do
stock "$line"
echo
done <input_file.txt >stockquote.txt
确保它stock
是可执行的。如果它是 shell 脚本,请确保它以#!/bin/sh
。如果它不在命令搜索路径中$PATH
,请显式指定路径(例如,./stock
如果它在当前目录中)。
您也可以使用xargs
,但要注意它的输入语法很特殊:它不使用换行符作为分隔符,而是使用空格,并将其视为\'"
引用字符(使用默认输入语法 - 只是让事情变得更糟, xargs 有替代输入语法,具体取决于在其命令行选项上)。对于您的用例,这可能也合适,而且更短,但是您失去了在符号中包含空格或引号字符、跳过注释行等的机会。
xargs -n 1 stock <input_file.txt >stockquote.txt