快速背景:
$ ls src
file1 file2 dir1 dir2 dir3
脚本:
#!/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代替。
答案 0 :(得分:19)
请改为echo
行:
echo $(basename "$i")
答案 1 :(得分:13)
无需分配外部流程:
echo "${i##*/}"
它使用“删除最长匹配前缀”parameter expansion。
*/
是模式,因此它将删除从字符串开头到最后一个斜杠的所有内容。如果$i
的值没有斜杠,那么它与"$i"
相同。
此特定参数扩展为specified in POSIX,是原始Bourne shell遗留的一部分。它在所有类似Bourne的shell中受支持( sh , ash , dash , ksh , bash , zsh 等)。许多功能丰富的shell(例如 ksh , bash 和 zsh )具有其他扩展功能,可以在不涉及外部进程的情况下处理更多内容。
答案 2 :(得分:8)
如果您在脚本开头执行cd
,则应在脚本退出时将其还原。
#!/bin/bash
cd src
for i in * ; do
if [ -d "$i" ]; then
echo "$i"
fi
done
答案 3 :(得分:4)
将basename
用作:
if [ -d "$i" ]; then
basename "$i"
fi