为 Bash 脚本获取文件参数

为 Bash 脚本获取文件参数

我正在尝试使用 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

相关内容