#string #bash
#строка #bash
Вопрос:
Я хочу получить 1.2.3.4 из строки 1.2.3.4.5 Я знаю, что могу использовать этот код для получения окончательного числа, но что я могу использовать, чтобы получить все предыдущие числа. (Включая ‘:’)
$ foo=1.2.3.4.5
$ c_num=`echo ${foo##*.}`
$ echo $c_num
$ 5
Я пробовал использовать IFS.
$ IFS='.' read -ra STRING <<< "$foo"
$ u_num="${STRING[0]}"'.'"${STRING[1]}"'.'"${STRING[2]}"'.'"${STRING[3]}"
$ echo $u_num
$ 1 2 3 4
# It should have returned 1.2.3.4
Комментарии:
1. Да, это используется в чистом сценарии оболочки bash.
2. В чем именно смысл второго примера? Если
foo
1.2.3.4.5
да, то как вы хотите1.2.6
получить результат?3. Как вы можете видеть, 1 2 3 4 все собираются в массив, но моей переменной u_num нужны только первые 2. Я отредактирую код, чтобы сделать все четыре.
4. Почему вы используете
:
?5. извините, это была ошибка, обновлено.
Ответ №1:
Попробуйте использовать:
echo ${foo%.*}
Получение:
foo="1.2.3.4.5"
echo ${foo%.*}
1.2.3.4
и
foo="1 2 6"
echo ${foo%.*}
выдает
1 2 6
Если вы хотите преобразовать пробелы в .
, вы можете использовать tr
:
echo $foo | tr ' ' '.'
Что дает следующее для foo="1 2 6"
1.2.6
Комментарии:
1. это также возвращает ‘1 2 3’
2. @RussellHickey у меня это работает с bash под Debian. Вы уверены, что используете bash? в чем ваша фишка?
3. @RussellHickey Я не уверен, что понимаю ваш комментарий. Что именно дает
1 2 3
результат? Возможно, ваш второй пример в постановке задачи нуждается в уточнении.4. @RussellHickey не могли бы вы тогда просто использовать
tr
? Например, ?echo $foo | tr ' ' '.'
5. @RussellHickey
tr
— это внешняя команда для Bash, а не встроенная. Обычно, когда мы упоминаем только Bash (или чистый Bash), мы игнорируем все внешние команды и хотим только встроенные. Введитеhelp
, чтобы получить список всех встроенных функций и ключевых слов; вы увидите, чтоtr
этого нет в списке.