如何使用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 <<< "$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 < somefile
可以只是 cat somefile
在 Bash 中,for i in $(cat somefile)
可以简化为 for i in $(< somefile)
但实际上,您想阅读与
read IFS= read -r i; do ...; done < manifest.txt
i | cut -d' ' -f1
不会使 cut
读取 $i
;你必须改用cut -d' ' -f1 <<< "$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循环中的文件
如何使用 Java 将文本文件作为一个字符串读入 Spark DataFrame