我正在尝试使用 bash 运行文本操作脚本。对于脚本,我想使用以下语法获取一个文本文件进行输入
./my_Script.sh < filename
是否可以通过这种方式从文件中获取输入?我尝试把
'>' test.txt
在脚本的第一行尝试读取数据,但所做的只是创建一个空白文本文件。
答案1
这取决于您想要实现的目标:
如果你想处理每一行在输入文件中,您可以执行以下操作:
#!/bin/bash
while read -r line; do
echo "Next line: $line"
# or something more useful.... :-)
done
然后您可以按照您的描述调用此脚本:
./script.sh < input_file.txt
如果你想将文件名传递给其他工具你可以这样做:
#!/bin/bash
other_tool "$1"
并像这样调用你的脚本:
./script.sh input_file.txt
答案2
如果您想硬编码该输入重定向,请使用以下exec
命令:
exec < test.txt
那么你可以做
while IFS= read -r line; do
echo "got: $line"
done
答案3
和
./script.sh <filename
您将脚本的标准输入作为一个整体附加到文件中filename
。这意味着任何事物从脚本中的标准输入读取的内容将从filename
文件中读取,直到到达该文件的末尾。
例如,您以上述方式调用的脚本(只需将所有字符更改为大写)可以写为
#!/bin/sh
tr 'a-z' 'A-Z'
请注意filename
或<filename
不是一个论据脚本的命令,而是向 shell 发出的一条指令,用于将脚本的标准输入设置为来自文件。
另一方面,如果您使用运行脚本
./scripts.sh filename
那么文件的名称将像$1
脚本中一样可用,并且在读取文件时必须引用该名称:
#!/bin/sh
tr 'a-z' 'A-Z' <"$1"
或者,
#!/bin/sh
filename=$1
tr 'a-z' 'A-Z' <"$filename"
这将允许您多次解析同一文件,而通过脚本的标准输入读取内容只允许您读取该文件一次(除非您使用eg将其保存到脚本中的临时文件中,cat >tmpfilename
然后解析了)。
在命令行上指定脚本文件名还允许您在循环中处理任意数量的文件:
#!/bin/sh
for pathname do
# code that processes "$pathname"
done