Как выполнить стандартное перенаправление в сценарии Bash? - PullRequest
0 голосов
/ 06 февраля 2020

Я написал сценарий bash, который через командную строку вводил: bash bash_file.sh input_file.txt output_file.txt, и это прекрасно работает. Я заставил его работать как надо, где он читает строку из файла input_file Hello 10 и выводит слово Hello 10 раз в 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

1 Ответ

0 голосов
/ 06 февраля 2020

Игнорируя ошибки в вашем скрипте, например, как вы читаете ADDR, но ссылаетесь на ARR, вы обычно можете просто использовать read без источника для чтения из stdin и echo без перенаправления для записи в stderr:

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.sh, введите Hello 10 на клавиатуре, и напечатайте Hello s на экране, так как это стандартный stdin и stdout, когда вы не перенаправляете.

...