如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]

Posted

技术标签:

【中文标题】如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]【英文标题】:How to use for loop to pass a line of string from text file as separate variable for another script in Bash [duplicate] 【发布时间】:2020-03-29 18:40:14 【问题描述】:

我正在编写一个接受 manifest.txt 文件的 bash 脚本。它应该循环遍历该文本文件的每一行,并在用空格分隔符分隔文本字符串后调用另一个脚本从文本文件的行中传递文本字符串。

我一直在弄清楚如何拆分文本字符串;我尝试使用cut -d' ',但它对我不起作用。

这是文本文件的示例:

20200451310 B.315
30203131340 Pam 3781, no.1
20200461200 B.16
20200471180 B.116, B.198
20200471190 B.129
10107291410 B.102
30203141220 Pam 3870, no. 1
20200481160 B.525

这是我目前拥有的 bash 脚本:

#!/bin/bash 
IFS=$'\n'       # make newlines the only separator
set -f          # disable globbing
for i in $(cat < "$manifest.txt"); do
  echo " $i"
  uid = $i | cut -d' ' -f1
  string = $i | cut -d' ' -f2-10   
  echo "uid is $uid"
  echo "string is $string"
  /anotherscript.sh $uid $string
done

结果应该是,例如:

/anotherscript.sh "30203141220" "Pam 3870, no. 1"

【问题讨论】:

查看BashFAQ/001 和Looping through the content of a file in Bash 了解如何逐行读取文件。 然后,使用shellcheck.net 获取有关常见错误的指针(作业中= 周围的空格等)。 您使用的是$ ,但您的意思是$( ) 用于命令替换。命令i | cut -d' ' -f1 不起作用,您必须以某种方式将$i 传递给cut,例如使用cut -d' ' -f1 &lt;&lt;&lt; "$i" 但实际上,您应该将每一行读入两个变量,而不是使用cut,然后让 Bash 为您拆分。 【参考方案1】:

您可以将脚本简化为:

#!/usr/bin/env bash

while read -r uid string; do
    ./anotherscript.sh "$uid" "$string"
done < manifest.txt

尝试中的错误清单:

"$manifest.txt"尝试对不是变量名的manifest.txt进行变量扩展,导致报错;你想要manifest.txt 而不是 cat &lt; somefile 可以只是 cat somefile 在 Bash 中,for i in $(cat somefile) 可以简化为 for i in $(&lt; somefile)

但实际上,您想阅读与

read IFS= read -r i; do ...; done < manifest.txt

i | cut -d' ' -f1 不会使 cut 读取 $i;你必须改用cut -d' ' -f1 &lt;&lt;&lt; "$i" 之类的东西

$somecommand 是错误的语法;对于命令替换,您需要$(somecommand) 作业不能在= 周围有空格:uid = something 应该是uid=something

要拆分字符串,请使用read 读取多个变量,而不是使用cut

while read -r uid string; do ... done < manifest.txt

/anotherscript.sh 可能是错误的路径,应该改为./anotherscript.sh

/anotherscript.sh $uid $string 中的参数应该被引用:

./anotherscript.sh "$uid" "$string"

【讨论】:

以上是关于如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Powershell写入第一行但无法将后续行写入for循环中的文件

如何使用 Python 中的 for 循环用回车覆盖一行?

Visual c++ 如何从富文本框中读取

如何使用 Java 将文本文件作为一个字符串读入 Spark DataFrame

Java 如何使用输入流和输出流 将txt文件中的某一行数据删除?

从单个ECHO命令输出的连接文本文件在预期输出后第二次将字符插入到字符串中