我想创建一个bash脚本,以列出用户通过输入提供的目录中的所有目录,或列出当前目录中的所有目录(不提供任何输入).
到目前为止,这就是我所拥有的,但是当我执行它时,我遇到了两个问题.
1)脚本完全忽略了我的输入.该文件位于我的桌面上,但是当我输入“ home”作为输入时,该脚本仅打印桌面的目录(当前目录).
2)目录按行打印(按预期),但会将文件夹名称中的每个单词视为其自己的文件夹.即打印为:
this
folder
这是我到目前为止的代码:
#!/bin/bash
echo -n "Enter a directory to load files: "
read d
if [ $d="" ]; #if input is blank, assume d = current directory
then d=${PWD##*/}
for i in $(ls -d */);
do echo ${i%%/};
done
else #otherwise, print sub-directories of given directory
for i in $(ls -d */);
do echo ${i%%/};
done
fi
另外,在您的答复中,请解释您的答案,因为我是bash的新手.
感谢您的关注,感谢您的宝贵时间.
编辑:感谢John1024的回答,我提出了以下内容:
#!/bin/bash
echo -n "Enter a directory to load files: "
IFS= read d
ls -1 -d "${d:-.}"/*/
它可以满足我的所有需求.非常感激!
解决方法:
我相信此脚本可以实现您想要的功能:
#!/bin/sh
ls -1 -d "${1:-.}"/*/
用法示例:
$bash ./script.sh /usr/X11R6
/usr/X11R6/bin
/usr/X11R6/man
说明:
> -1告诉ls在单独的行上打印每个文件/目录
> -d告诉ls按名称而不是目录列出目录
>如果有一个或,shell将${1:-.}作为脚本的第一个参数. (表示当前目录)(如果没有).
增强功能
上面的脚本在每个目录名称的末尾显示一个/.如果您不想这样做,我们可以使用sed从输出中删除尾部斜杠:
#!/bin/sh
ls -1d ${1:-.}/*/ | sed 's|/$||'
脚本的修订版
从脚本开始,可以进行一些简化:
#!/bin/bash
echo -n "Enter a directory to load files: "
IFS= read d
d=${d:-$PWD}
for i in "$d"/*/
do
echo ${i%%/}
done
笔记:
> IFS =读d
通常,在将输入分配给d之前,先删除开头和结尾的空白.但是,通过将IFS设置为空值,将保留前导空格和尾随空格.因此,即使用户指定名称以空格开头或结尾的目录,这在病理上很奇怪的情况下,这也将起作用.
如果用户输入反斜杠,则外壳程序将尝试将其作为转义符处理.如果您不喜欢,请使用IFS = read -r d,反斜杠将被视为普通字符,而不是转义符.
> d = ${d:-$PWD}
如果用户提供了d的值,则它保持不变.如果他没有,则将其分配给$PWD.
>对于“ $d” / * /中的i
这将遍历$d的每个子目录,并将正确处理带有空格,制表符或任何其他奇数字符的子目录名称.
相比之下,请考虑:
for i in $(ls -d */)
在这里执行ls之后,shell会将输出拆分成单个单词.这称为“单词拆分”,这就是为什么应避免这种形式的for循环的原因.
注意“ $d” / * /中i的双引号.它们在那里是为了防止$d上的单词分裂.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。