read -p "Input a sentence: " mystring
string=("$mystring" | rev)
echo "The sentence reversed character by character is: " $string
Я хочу перевернуть только $string, но он переворачивает все до $string на. Может ли кто-нибудь мне помочь, пожалуйста?
решение1
Вам необходимо передать строку в качестве стандартного ввода в rev
, либо используя herestring или heredoc, либо передав вывод по конвейеру, printf
а затем собрать вывод с rev
помощьюзамена команды.
IFS= read -rep 'Input a sentence: ' mystring
string=$(
rev <<< "$mystring"
)
# or:
string=$(
printf '%s\n' "$mystring" | rev
)
printf '%s\n' "The sentence reversed character by character is: $string"
Обратите внимание, что rev
это не стандартная команда (хотя она довольно распространена). Если бы вы использовали zsh
вместо bash
, вы могли бы выполнить обратное преобразование внутри (и также иметь возможность разрешить пользователю вводить что угодно):
mystring=
vared -p 'Input a sentence: ' mystring
string=${(j[])${(s[]Oa)mystring}}
print -r The sentence reversed character by character is: $string
(обратите внимание, что поскольку zsh
's vared
, в отличие от bash
's , read -e
позволяет пользователю включать символы новой строки (и любые символы, даже NUL) в содержимое ited var
, ed
использование rev
для его обратного преобразования не будет работать, поскольку rev
работает с одной строкой за раз).
В bash
, помните:
- Расширения параметров должны быть заключены в кавычки. В вашей
echo
строке вы заключили в кавычки части, которые не нужно было заключать в кавычки, и опустили кавычки в единственном месте, где они были нужны. - Чтобы прочитать строку, нужно
IFS= read -r line
.read line
делает что-то совершенно другое. echo
нельзя использовать для вывода произвольных данных.printf
Вместо этого используйте.