对于命令行中的循环,逐行从文本文件中读取bash脚本

时间:2018-01-12 08:18:15

标签: linux bash

我有一个bash脚本,要求两个参数之间有空格。现在我想通过从文本文件中读取来自动填写命令行中的提示。文本文件包含带参数组合的列表。

我认为在命令行中是这样的;

> Release v1
  Sprint 1
  Sprint 2
> Release v2
  Sprint 3
  Sprint 4

可以这样做吗?我错过了什么/做错了什么?

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

while循环可能就是您所需要的。将空格分隔的字符串放在文件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

答案 1 :(得分:1)

'cat text.file'是一个字符串文字,$(cat text.file)会扩展为命令的输出,但是cat是无用的,因为bash可以使用重定向读取文件,同时使用引号将其视为单个参数和没有它将在空格选项卡和换行符中分开。

Bash语法逐行读取文件,但对于大文件来说会很慢

while IFS= read -r line; do ... "$line"; done < text.file
  • 取消设置读取命令的IFS会保留前导空格
  • -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 -fset +f设置
  • oldifs用于存储当前IFS
  • IFS=$'\n'分隔换行符(多个换行符将被视为一个)
  • set -f避免全局展开,例如,如果行包含单个*
  • ()周围注意$()以将拆分结果存储到数组

答案 2 :(得分:1)

Don't use for to read files line by line

尝试这样的事情:

#!/bin/bash
ARGS= 
while IFS= read -r line; do
    ARGS="${ARGS} ${line}"
done < ./text.file

script.sh "$ARGS"

这会将每一行添加到一个变量中,然后将该变量用作脚本的参数。

答案 3 :(得分:0)

如果我要创建一个由你要求的文字确定的解决方案(使用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's解决方案可能会有更好的时间。