Вероятно, у вас есть одна из двух проблем:
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
Вы можете использовать расширение параметра замены 111 Bash для заполнения переменной цикла. Например:
MANPATH=/usr/lib:/usr/sfw/lib:/usr/info
# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
echo "$path"
done
Примечание. Не заключайте подстановочное расширение в кавычки. Вы хотите, чтобы расширенные значения из MANPATH интерпретировались циклом for как отдельные слова, а не как одна строка.
Канонический способ сделать это в 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
Вы можете использовать Bash для X в нотации $ {}, чтобы выполнить это:
for p in ${PATH//:/\n'} ; do
echo $p;
done
Таким образом, вы можете безопасно пройти через $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 .
for p in $(echo $MANPATH | tr ":" " ") ;do
echo $p
done
Это также может быть решено с помощью 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
может пригодиться, хотя.
Объединение идей:
код:
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
IFS=:
arr=(${MANPATH})
for path in "${arr[@]}" ; do # <- quotes required
echo $path
done
... он позаботится о пробелах: o) но также добавляет пустые элементы, если у вас есть что-то вроде:
:/usr/bin::/usr/lib:
... тогда индекс 0,2 будет пустым ( ''), не могу сказать, почему индекс 4 вообще не установлен