Linux For loop in命令行逐行从文本文件中运行bash脚本读取
我有一个bash脚本,它要求两个参数之间有空格。现在,我想通过读取文本文件来自动填写命令行中的提示。文本文件包含一个包含参数组合的列表 我想在命令行中是这样的Linux For loop in命令行逐行从文本文件中运行bash脚本读取,linux,bash,Linux,Bash,我有一个bash脚本,它要求两个参数之间有空格。现在,我想通过读取文本文件来自动填写命令行中的提示。文本文件包含一个包含参数组合的列表 我想在命令行中是这样的 for line in 'cat text.file' ; do script.sh ; done 这能做到吗?我错过了什么/做错了什么 谢谢你的帮助。A,而循环可能正是你所需要的。将空格分隔的字符串放入文件text.file: cat text.file bingo yankee bravo delta 然后像下面这样写有问题的脚本
for line in 'cat text.file' ; do script.sh ; done
这能做到吗?我错过了什么/做错了什么
谢谢你的帮助。A
,而循环可能正是你所需要的。将空格分隔的字符串放入文件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
#/bin/bash
读取时-r arg1 arg2
做
/path/to/your/script.sh“$arg1”$arg2”
完成Awhile
循环可能是您需要的。将空格分隔的字符串放入文件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
#/bin/bash
读取时-r arg1 arg2
做
/path/to/your/script.sh“$arg1”$arg2”
完成'cat text.file'
是一个字符串文本,$(cat text.file)
将扩展到命令的输出,但是cat
是无用的,因为bash可以使用重定向读取文件,也可以使用引号将其视为单个参数,如果没有引号,它将在空格选项卡和换行处拆分
Bash语法可以逐行读取文件,但对于大文件来说速度较慢
while IFS= read -r line; do ... "$line"; done < text.file
oldsetf
用于存储当前set-f
或set+f
设置
oldifs
用于存储当前IFS
IFS=$'\n'
在换行符上拆分(多个换行符将被视为一个)
set-f
避免全局扩展,例如,如果行包含单个*
- 请注意
()
周围的$()
以将拆分结果存储到数组中
'cat text.file'
是一个字符串文本,$(cat text.file)
将扩展到命令的输出,但是cat
是无用的,因为bash可以使用重定向读取文件,也可以使用引号将其视为单个参数,如果没有它,将在空格选项卡和换行处拆分
Bash语法可以逐行读取文件,但对于大文件来说速度较慢
while IFS= read -r line; do ... "$line"; done < text.file
oldsetf
用于存储当前set-f
或set+f
设置
oldifs
用于存储当前IFS
IFS=$'\n'
在换行符上拆分(多个换行符将被视为一个)
set-f
避免全局扩展,例如,如果行包含单个*
- 请注意
()
周围的$()
以将拆分结果存储到数组中
试着这样做:
#!/bin/bash
ARGS=
while IFS= read -r line; do
ARGS="${ARGS} ${line}"
done < ./text.file
script.sh "$ARGS"
#/bin/bash
ARGS=
而IFS=读取-r行;做
ARGS=“${ARGS}${line}”
完成<./text.file
script.sh“$ARGS”
这会将每一行添加到一个变量中,然后将该变量用作脚本的参数。
试着这样做:
#!/bin/bash
ARGS=
while IFS= read -r line; do
ARGS="${ARGS} ${line}"
done < ./text.file
script.sh "$ARGS"
#/bin/bash
ARGS=
而IFS=读取-r行;做
ARGS=“${ARGS}${line}”
完成<./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
file=“$1”
f_count=“$(wc-l<$文件)”
对于以美元为单位的行(序号1$f_计数)
做
script.sh$(head-n$行$file | tail-n1)&等待
完成
不过,使用解决方案可能会更好。如果我要创建一个由您要求的文本决定的解决方案(使用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
file=“$1”
f_count=“$(wc-l<$文件)”
对于以美元为单位的行(序号1$f_计数)
做
script.sh$(head-n$行$file | tail-n1)&等待
完成
不过,您使用解决方案的时间可能会更好。这应该是公认的答案。我自己引用了这个答案。这应该是公认的答案。我自己也引用了这个答案。在这里查看我的答案以使用for循环:在这里查看我的答案以使用for循环:mywiki似乎不知道我们的安全做法通过使用双引号保留文字字符串和文件名(使用空格/特殊字符)。即使这不是最有效的做法,也可以在避免wiki中提到的错误的情况下进行循环。尽管如此,while循环是最好的选择,因此我同意您的答案解决方案。mywiki似乎不知道关于使用for循环的安全实践通过使用双引号来保留文本字符串和带有空格/特殊字符的文件名。即使这不是最有效的实践,也可以在避免wiki中提到的错误的情况下进行。虽然在这里使用while循环是最好的方法,但我同意您的答案。只要作为建议,您可以考虑将较大的代码块分解为更可读的格式(可能是shell脚本格式),因为显然OP是shell代码和最佳实践的新手。这将使他/她更容易阅读您的解决方案。还请注意$(@Yokai谢谢你的反馈我已经改成了一个更容易使用的函数只是作为一个建议,你可以考虑将更大的代码块分解成更可读的格式(也许是shell脚本格式),因为OP显然是shell代码和最佳实践的新手。这将使它成为一个bi