Если вы хотите подсчитать количество символов в том, что ввел пользователь, но не включая символ новой строки, тогда это должно быть:
#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}
Если вы хотите включить символ новой строки, который, возможно, ввел пользователь, то:
#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput && userInput="$userInput
"
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}
read
обычно возвращает true, если была введена полная строка (присутствует символ новой строки), поэтому мы добавляем ее, если чтение
было успешным.
Обратите внимание, что в большинстве реализаций оболочки (за исключением zsh
) он не будет работать должным образом, если пользователь введет символ NUL (он же ^@
).
Чтобы обойти это, вы можете сделать:
printf 'Type text: '
length=$(line | wc -m)
вместо этого. Или:
length=$(line | tr -d '\n' | wc -m)
# or
length=$(($(line | wc -m) - 1)) # as line always includes a newline on
# output even if one was not provided on
# input.
, если вы не хотите считать новую строку.
Поведение также изменится, если пользователю удастся ввести байты, которые не являются частью допустимых символов. Вы также найдете некоторые реализации sh
, чьи ${#var}
не работают должным образом с многобайтовыми символами (будет возвращать длину в байтах вместо символов).
Этот лайнер должен помочь, и он заботится о том, чтобы выходной файл не сортировался:
cat -n barcodes1.tsv barcodes.tsv | sort -uk2 | sort -nk1 | cut -f2- > diff.csv
По сути, это: