Как сделать циклический сдвиг строк в bash?

у меня есть домашнее задание, где мне нужно взять ввод из файла и постоянно удалять первое слово в строке и добавлять его в конец строки, пока все комбинации не будут сделаны.

Я действительно не знаю, с чего начать и был бы благодарен за какую-либо сторону.

часть, которая меня смущает, заключается в том, что это должно выполняться без использования массивов. Я не просто ищу кого-то, чтобы решить проблему для меня, я просто ищу для какого-то направления.

пример ввода:

Pipes and Filters
Java Swing
Software Requirements Analysis

ВЫХОД ОБРАЗЦА:

Analysis Software Requirements
Filters Pipes and
Java Swing
Pipes and Filters
Requirements Analysis Software
Software Requirements Analysis
Swing Java

5 ответов


несколько лакомых кусочков, которые должны помочь: когда вы вызываете функцию со строкой, строка разделяется на несколько аргументов (позиционные параметры, по имени $n, где n являются целыми числами, начинающимися с 1) на символах переменной $IFS (по умолчанию это пробелы, вкладки и новые строки)

function first() {
    echo 
}
first one two three
# outputs: "one"

$* и $@ даст вам все позиционные параметры, в порядке.

второй, специальная переменная $# содержит количество аргументов функции.

в-третьих, shift отбрасывает первый позиционный параметр и перемещает все остальные на один.

function tail() {
    shift
    echo $*
}

В-четвертых, вы можете захватить вывод команд и функций с помощью `... или $(...)

rest=`tail $*`

в-пятых, вы можете направить вывод одной команды на вход другой с помощью символ (|):

seq 5 | sort

чтобы вы начали, проверьте read builtin:

while read first_word rest_of_the_line; do
    ... your code here ...
done

вам также нужен способ подачи Вашего входного файла в этот цикл.


позвольте мне показать вам быстрый рабочий пример, основанный на @outis ответ:

strings="string1 string2 string3"
next() { echo ; }
rest() { shift; echo $*; }
for i in $strings; do
  echo $(next $strings)
  strings=$(rest $strings)
done

или другим способом, если вы заинтересованы в прохождении по последовательности:

strings="string1 string2 string3"
next() { echo ; }
rest() { shift; echo $*; }
totalWords=$(c() { echo $#; }; c $strings)
for i in `seq -w 1 $totalWords`; do
  echo $i: $(next $strings)
  strings=$(rest $strings)
done

расширения параметр позволит вам вырезать части переменной.


Это короткая демонстрация. Пройдите через слова, получите последнее слово и поставьте перед строкой. до тех пор, пока последняя строка не будет такой же, как и исходная.

    #!/bin/bash    
    s="Software Requirements Analysis"
    org="$s"
    while true
    do
       last=${s##* } #Analysis
       front=${s% *} #Software Requirements
       s="$last $front"
       echo $s
       case "$s" in
         "$org") break;;
       esac
    done

вы должны быть в состоянии сделать остальные с помощью файла.