Распечатать значение аргумента в цикле for

Ваша подсказка содержит цвета (и, возможно, другие не -печатные формы ).

В bash вы можете окружить части \[и \], чтобы указать bash игнорировать эти части для расчета длины подсказки.

Пример:

PS1="\e[33mthis is green\e[0m this is normal"
# should be done as:
PS1="\[\e[33m\]this is green\[\e[0m\] this is normal"

Второй имеет \[и \]вокруг каждой части, которая при изменении цвета не добавляет никаких видимых символов на дисплее, поэтому не должна учитываться при расчете размещения символов в подсказке.

Если вы модифицировали PS1, убедитесь, что вы не добавили видимые символы \[и \]. Если вы это сделали, вытащите их за пределы тех.

Еще одна вещь :Вы можете shopt -q -s checkwinsizeсделать так, чтобы размер терминала обновлялся при изменении его размера.

Похоже, вы используете настройку, которая показывает только конец введенной в данный момент командной строки (аналогично тому, что делает ksh... вы уверены, что используете bash?):Я посмотрю, какая опция может это изменить, но я пока этого не знаю.

редактировать

В чате мы также обсуждали:

set -o emacs  #he was in vi mode
set -o posix  #he was in posix=no mode

но, в конце концов, кажется, что сработало то, что он избавился от ~/.inputrc (, что он и сделал, он мог содержать что-то неправильное, но я не знаю, что там было, и я не просил удалить его ^^ просто переименовав его (или исправив его содержимое )помогло бы...)

2
04.07.2019, 12:28
2 ответа
#! /bin/sh -
i=1
for arg do
  printf '%2d: %s\n' "$i" "$arg"
  i=$((i + 1))
done

То есть, вместо того, чтобы перебирать индексы, перебирайте аргументы и увеличивайте индекс отдельно.

Несколько замечаний по вашему подходу:

  • оставление расширения параметра без кавычек в контексте списка имеет особое значение, вы почти никогда не захотите этого делать .

  • echoнельзя использовать для вывода произвольных данных .

  • В наши дни следует избегать `...`формы подстановки команд. Вместо этого используйте $(...).

  • Поскольку подстановка команд без кавычек также вызывает split+glob, ее следует использовать с осторожностью. Здесь вы используете часть split , что означает, что у вас есть зависимость от текущего значения $IFS. Вывод seqне будет включать подстановочные знаки, поэтому у вас не будет проблем с частью glob .

  • seqне является стандартной командой и встречается не во всех системах. Зацикливаться на числах в любом случае не лучший подход, так как это означает сохранение всего вывода в памяти и его разделение (, что приводит к дополнительным копиям в памяти ), а это означает запуск отдельной утилиты в отдельном процессе, даже если оболочка имеет встроенную поддержку для этого.

  • Если вы не поместите ни -bang(#! /path/to/interpreter -первую строку ), единственная гарантия, которую вы получите, это то, что она будет интерпретирована оболочкой POSIX sh(в более старых версиях. систем, которые могут быть даже оболочкой Bourne (не -POSIX )), поэтому вам необходимо убедиться, что используемый вами синтаксис совместим с POSIX. Даже в системах, где shпредоставляется bash, не все расширения bashвключены при работе с sh.

    Приведенный выше код совместим с POSIX (и также будет работать в bash), но не совместим с Bourne (из-за $((...))синтаксиса арифметического расширения, который не был доступен в оболочке Bourne ). На Solaris 10 и старше,вам нужно изменить -взрыв на #! /usr/xpg4/bin/sh -, чтобы получить (в основном )POSIX -совместимый интерпретатор

4
27.01.2020, 21:52
#!/bin/bash
for ((i=1; i<=$#; i++))
do
  echo "$i - ${!i}"
done
1
27.01.2020, 21:52

Теги

Похожие вопросы