Ответ 1
Сделайте это вместо строки echo
:
echo $(basename "$i")
Краткая информация:
$ ls src
file1 file2 dir1 dir2 dir3
Script:
#!/bin/bash
for i in src/* ; do
if [ -d "$i" ]; then
echo "$i"
fi
done
Вывод:
src/dir1
src/dir2
src/dir3
Однако я хочу, чтобы он читал:
dir1
dir2
dir3
Теперь я понимаю, что могу сделать sed/awk для удаления "src/", однако мне любопытно узнать, есть ли лучший способ обойти это. Возможно, вместо этого используйте find-while-loop.
Сделайте это вместо строки echo
:
echo $(basename "$i")
Не нужно искать внешний процесс:
echo "${i##*/}"
Он использует параметр "удалить самый длинный соответствующий префикс" расширение параметра.
*/
- это шаблон, поэтому он будет удалять все с начала строки до последней косой черты. Если в значении $i
нет косой черты, тогда он совпадает с "$i"
.
Это конкретное расширение параметра указанное в POSIX, и является частью наследия исходной оболочки Bourne. Он поддерживается во всех борнеподобных оболочках (sh, ash, dash, ksh, bash, zsh и т.д.). Многие из богатых функциональными возможностями оболочек (например, ksh, bash и zsh) имеют другие расширения, которые могут обрабатывать еще больше без привлечения внешних процессов.
Если вы выполните cd
в начале script, его следует вернуть, когда script завершает работу.
#!/bin/bash
cd src
for i in * ; do
if [ -d "$i" ]; then
echo "$i"
fi
done
Используйте basename
как:
if [ -d "$i" ]; then
basename "$i"
fi