[英]For loop in command line runs bash script reading from text file line by line
我有一个bash脚本,要求两个参数之间留有空格。 现在,我想通过从文本文件中读取内容来自动在命令行中填写提示。 文本文件包含带有参数组合的列表。
我想在命令行中是这样的;
for line in 'cat text.file' ; do script.sh ; done
能做到吗? 我想念/做错了什么?
谢谢您的帮助。
一个while
循环可能是您需要的。 text.file
空格分隔的字符串放在文件text.file
:
cat text.file
bingo yankee
bravo delta
然后像下面这样编写有问题的脚本。
#!/bin/bash
while read -r arg1 arg2
do
/path/to/your/script.sh "$arg1" "$arg2"
done<text.file
'cat text.file'
是字符串文字, $(cat text.file)
会扩展为命令输出,但是cat
是无用的,因为bash可以使用重定向来读取文件,并且带有引号的情况下,它将被视为单个参数,并且不带引号将在空格标签和换行符处分开。
Bash语法逐行读取文件,但是对于大文件将很慢
while IFS= read -r line; do ... "$line"; done < text.file
-r
选项保留\\
读取整个文件的另一种方法是content=$(<file)
,注意命令替换中的<
。 因此,一种新颖的方式来读取文件到数组,每个元素都为非空行:
read_to_array () {
local oldsetf=${-//[^f]} oldifs=$IFS
set -f
IFS=$'\n' array_content=($(<"$1")) IFS=$oldifs
[[ $oldsetf ]]||set +f
}
read_to_array "file"
for element in "${array_content[@]}"; do ...; done
oldsetf
用于存储当前set -f
或set +f
设置 IFS
oldifs
IFS=$'\\n'
以换行符分割(多个换行符将被视为一个) set -f
避免glob扩展,例如在行包含单个*
情况下 $()
()
周围的note ()
存储拆分结果到数组 尝试这样的事情:
#!/bin/bash
ARGS=
while IFS= read -r line; do
ARGS="${ARGS} ${line}"
done < ./text.file
script.sh "$ARGS"
这会将每行添加到变量中,然后将其用作脚本的参数。
如果要创建一个由您所要求的文字确定的解决方案(使用for循环并解析文件中的行),我将使用由文件中的行数确定的迭代(如果它不是太大) 。
假设每行有两个字符串,并用一个空格隔开(在脚本中用作位置参数:
file="$1"
f_count="$(wc -l < $file)"
for line in $(seq 1 $f_count)
do
script.sh $(head -n $line $file | tail -n1) && wait
done
但是,使用sjsam的解决方案可能会有更好的时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.