Цикл по элементам переменной пути в Bash

Вероятно, у вас есть одна из двух проблем:

1) Вы не включили порт в свой URL. Либо вы настроили порт Tomcat на порт 80, и в этом случае порт не нужен, либо вам нужно включить порт, который по умолчанию равен 8080, например:

http://localhost:8080/file/demo/%2Be4%2FE5cR%2FaM%3D

2) Вы добавляя зашифрованный идентификатор как часть самого URL-адреса, который должен быть сопоставлен с сервлетом / JSP / представлением какого-либо типа в ваших сопоставлениях URL-адресов и вряд ли. Tomcat не узнает уникальный идентификатор и не знает соответствующего обработчика для вызова процесса обработки. Предполагая, что вы намереваетесь вызывать сервлет / JSP / контроллер, который сопоставляется с '/ file / demo', вы скорее захотите передать идентификатор в качестве параметра запроса, например:

http://localhost:8080/file/demo?id=%2Be4%2FE5cR%2FaM%3D
29
задан codeforester 30 May 2017 в 19:38
поделиться

8 ответов

Канонический способ сделать это в Bash - использовать встроенное значение read соответствующим образом:

IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")

Это единственное надежное решение: будет делать именно то, что вы хотите: разбить строку на разделитель : и быть безопасным в отношении пробелов, символов новой строки и глобальных символов, таких как *, [ ] и т. д. (в отличие от других ответов: все они разбиты).

После этой команды у вас будет массив path_array, и вы можете зацикливаться на нем:

for p in "${path_array[@]}"; do
    printf '%s\n' "$p"
done
12
ответ дан gniourf_gniourf 30 May 2017 в 19:38
поделиться
  • 1
    Существует ли место (кроме этого ТАК вопрос), который отслеживает работу для метеора в Windows? Просто стараясь избегать дублирования усилия или вопросов:) – James Manning 13 July 2012 в 18:46
  • 2
    Существует ли место (кроме этого ТАК вопрос), который отслеживает работу для метеора в Windows? Просто стараясь избегать дублирования усилия или вопросов:) – James Manning 13 July 2012 в 18:46
  • 3
    Существует ли место (кроме этого ТАК вопрос), который отслеживает работу для метеора в Windows? Просто стараясь избегать дублирования усилия или вопросов:) – James Manning 13 July 2012 в 18:46
  • 4
    Существует ли место (кроме этого ТАК вопрос), который отслеживает работу для метеора в Windows? Просто стараясь избегать дублирования усилия или вопросов:) – James Manning 13 July 2012 в 18:46
  • 5
    Существует ли место (кроме этого ТАК вопрос), который отслеживает работу для метеора в Windows? Просто стараясь избегать дублирования усилия или вопросов:) – James Manning 13 July 2012 в 18:46

Вы можете использовать Bash для X в нотации $ {}, чтобы выполнить это:

for p in ${PATH//:/\n'} ; do
    echo $p;
done
0
ответ дан Hunter McMillen 30 May 2017 в 19:38
поделиться

Таким образом, вы можете безопасно пройти через $PATH с помощью одной петли, в то время как $IFS останется неизменным внутри или снаружи петли.

while IFS=: read -d: -r path; do # `$IFS` is only set for the `read` command
    echo $path
done <<< "${PATH:+"${PATH}:"}"   # append an extra ':' if `$PATH` is set

Вы можете проверить значение $IFS,

IFS='xxxxxxxx'
while IFS=: read -d: -r path; do
    echo "${IFS}${path}"
done <<< "${PATH:+"${PATH}:"}"

, и на выходе будет что-то вроде этого.

xxxxxxxx/usr/local/bin
xxxxxxxx/usr/bin
xxxxxxxx/bin

Ссылка на еще один вопрос о StackExchange .

4
ответ дан Community 30 May 2017 в 19:38
поделиться
for p in $(echo $MANPATH | tr ":" " ") ;do
    echo $p
done
0
ответ дан rayd09 30 May 2017 в 19:38
поделиться

Это также может быть решено с помощью Python из командной строки:

python -c "import os,sys;[os.system(' '.join(sys.argv[1:]).format(p)) for p in os.getenv('PATH').split(':')]" echo {}

Или как псевдоним:

alias foreachpath="python -c \"import os,sys;[os.system(' '.join(sys.argv[1:]).format(p)) for p in os.getenv('PATH').split(':')]\""

С примером использования:

foreachpath echo {}

Преимущество этого подхода состоит в том, что {} будет заменяться каждым путем подряд. Это может быть использовано для создания всевозможных команд, например, для перечисления размера всех файлов и каталогов в каталогах в $PATH. включая каталоги с пробелами в имени:

foreachpath 'for e in "{}"/*; do du -h "$e"; done'

Вот пример, который сокращает длину переменной $PATH путем создания символических ссылок на каждый файл и каталог в $PATH в $HOME/.allbin. Это не полезно для повседневного использования, но может быть полезно , если вы получаете сообщение об ошибке too many arguments в контейнере docker, потому что bitbake использует полный $PATH как часть командной строки. ...

mkdir -p "$HOME/.allbin"
python -c "import os,sys;[os.system(' '.join(sys.argv[1:]).format(p)) for p in os.getenv('PATH').split(':')]" 'for e in "{}"/*; do ln -sf "$e" "$HOME/.allbin/$(basename $e)"; done'
export PATH="$HOME/.allbin"

Теоретически это также должно ускорить регулярное использование оболочки и сценариев оболочки, поскольку существует меньше путей поиска для каждой выполняемой команды. Это является довольно хакерским, поэтому я не рекомендую кому-либо сокращать свои $PATH таким образом.

Псевдоним foreachpath может пригодиться, хотя.

1
ответ дан Alexander 30 May 2017 в 19:38
поделиться
  • 1
    @TonyBlundell: Сделанный установщиком MSI, который вытянут в Метеор позже, см. мое сообщение. – Tamara Wijsman 15 June 2012 в 12:53
  • 2
    @TonyBlundell: Сделанный установщиком MSI, который вытянут в Метеор позже, см. мое сообщение. – Tamara Wijsman 15 June 2012 в 12:53
  • 3
    @TonyBlundell: Сделанный установщиком MSI, который вытянут в Метеор позже, см. мое сообщение. – Tamara Wijsman 15 June 2012 в 12:53
  • 4
    @TonyBlundell: Сделанный установщиком MSI, который вытянут в Метеор позже, см. мое сообщение. – Tamara Wijsman 15 June 2012 в 12:53
  • 5
    @TonyBlundell: Сделанный установщиком MSI, который вытянут в Метеор позже, см. мое сообщение. – Tamara Wijsman 15 June 2012 в 12:53

Объединение идей:

код:

PATHVAR='foo:bar baz:spam:eggs:'  # demo path with space and empty
printf '%s:\0' "$PATHVAR" | while IFS=: read -d: -r p; do
    echo $p
done | cat -n

выход:

1   foo
2   bar baz
3   spam
4   eggs
5   
0
ответ дан Walker Hale IV 30 May 2017 в 19:38
поделиться
  • 1
    попытка этих решений... вернется в некоторое время.. Спасибо!! – Rookie 18 November 2012 в 07:09
  • 2
    попытка этих решений... вернется в некоторое время.. Спасибо!! – Rookie 18 November 2012 в 07:09
  • 3
    попытка этих решений... вернется в некоторое время.. Спасибо!! – Rookie 18 November 2012 в 07:09
  • 4
    попытка этих решений... вернется в некоторое время.. Спасибо!! – Rookie 18 November 2012 в 07:09
  • 5
    попытка этих решений... вернется в некоторое время.. Спасибо!! – Rookie 18 November 2012 в 07:09
IFS=:
arr=(${MANPATH})
for path in "${arr[@]}" ; do # <- quotes required
   echo $path
done

... он позаботится о пробелах: o) но также добавляет пустые элементы, если у вас есть что-то вроде:

:/usr/bin::/usr/lib:

... тогда индекс 0,2 будет пустым ( ''), не могу сказать, почему индекс 4 вообще не установлен

0
ответ дан Acid 30 May 2017 в 19:38
поделиться
Другие вопросы по тегам:

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