Как сделать циклический сдвиг строк в 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
вы должны быть в состоянии сделать остальные с помощью файла.