首页 > 解决方案 > 如何在 Bash 脚本中执行标准重定向?

问题描述

我已经编写了一个 bash 脚本,可以通过您键入的命令行:bash bash_file.sh input_file.txt output_file.txt这非常好。我已经让它按照它应该的方式工作,它从 input_file 读取行Hello 10并将单词输出Hello10 次到output_file.txt. 这么多工作。现在,我不知道如何让 bash 脚本处理这种类型的命令行:bash bash_file.sh < input_file.txt > output_file.txt. 它抛出了各种各样的错误,我什至无法开始找出解决方案——如果有人有解决方案或者可以为我指出一个很好的解决方案的方向。

下面的代码适用于以下命令行命令bash bash_file.sh input_file.txt output_file.txt

string_word=$(<$1)

IFS=' '
read -ra ADDR <<< "$string_word"

num="${ARR[2]}"

str="${ARR[0]} ${ARR[1]}"

while [[ $num -ne 0 ]]; do
    echo $num
    echo "$str" >> $2
    num=$(( num - 1 ))
done

现在,我正在尝试对其进行修改,以便以下命令行命令对其起作用:bash bash_file.sh < input_file.txt > output_file.txt

标签: bashredirectfile-ioio-redirection

解决方案


忽略脚本中的错误,例如您如何阅读ADDR但引用ARR,您通常可以在read没有源的情况下使用从标准输入读取,并且echo无需重定向到写入标准错误:

read -ra ARR

num="${ARR[1]}"
str="${ARR[0]}"

while [[ $num -ne 0 ]]; do
    echo "$str"
    num=$(( num - 1 ))
done

它是这样工作的:

$ echo 'Hello 10' > input_file.txt
$ bash bash_file.sh < input_file.txt > output_file.txt
$ cat output_file.txt
Hello
Hello
Hello
[...]

你也不需要重定向:你现在可以运行它bash bash_file.shHello 10在键盘上输入,然后Hello在屏幕上打印 s,因为当你不重定向时,这是默认的标准输入和标准输出。


推荐阅读