Bash编程:获取给定目录的一个子文件夹的名称

Bash编程:获取给定目录的一个子文件夹的名称,bash,Bash,在中,我想获取a的唯一子文件夹的名称: cd /tmp; mkdir -p a/b; v=$(ls -1 a); echo "$v" 产出: b a/* b 这就是我想要的 这是可行的,因为我知道a中只有一个子文件夹 请随意假设在我的场景中,这在所有情况下都是有保证的 我感到不安的是 除此之外,使用ls显然是不必要的。 它是一个外部命令,其输出专门用于 由人读取,而不是由脚本解析。 这甚至更具威胁性和盲目性(与上述链接相同): 解析ls的输出——一个永远不应该解析其输出的实用程序。

在中,我想获取
a
的唯一子文件夹的名称:

cd /tmp; mkdir -p a/b; v=$(ls -1 a); echo "$v"
产出:

b
a/*
b
这就是我想要的

这是可行的,因为我知道
a
中只有一个子文件夹

请随意假设在我的场景中,这在所有情况下都是有保证的

我感到不安的是

除此之外,使用ls显然是不必要的。
它是一个外部命令,其输出专门用于
由人读取,而不是由脚本解析。
这甚至更具威胁性和盲目性(与上述链接相同):


解析ls的输出——一个永远不应该解析其输出的实用程序。


这引起了我的共鸣,但这一点,试图使用globbing,obv.是行不通的:

 cd /tmp; mkdir -p a/b; v=a/*; echo "$v"
产出:

b
a/*
b
悲伤

那么,如何获得变量赋值的globbing呢

我想我知道如何在任务之外利用全球化

for d in a/*; do echo "$(basename $d)"; done
产出:

b
a/*
b
“正确答案”(TM)

请你教我如何正确地做这件事,并解释它背后的原则好吗

**注意:我不喜欢此命令的输出:**

cd /tmp; w='name with blanks'; mkdir -p "$w/b"; v=$(echo "$w"/*); echo "$v"
即:

name with blanks/b
我只想得到:

b
我是否必须在之后使用
basename
,或者我是否可以以某种方式直接获得
b

v=$(cd a;echo *)
通配符在命令替换中展开,
echo
将输出通配符,以便在赋值中使用


cd
将允许您在不调用
basename

的情况下直接获取basename,这句话肯定是我写的。无论如何您的失败是因为大括号扩展、全局和分词不适用于标量赋值

printf -v v %s */
还有一个鲜为人知的技巧,它只能使用coreutils
printf(1)
(假设有多个目录)

或者,这可能是最接近您所追求的(GNU查找):


参见:

你会认为这个优于或等价于<代码> ls - 1 a < /> >,为什么?一个是
type echo
产生
echo是一个shell内置程序,所以:不是一个外部程序。
echo
是一个shell内置程序,所以它不必运行其他程序。对。那绝对是赞成echo的,完全同意。在shell内置的情况下,
$(…)
命令替换是否会产生子shell?仅供参考,您不需要使用
-1
选项来
ls
。当写入终端时,它只打印列输出,而且无论如何只有一个文件。别名通常不会在shell脚本中展开。可能的重复我怀疑重复。这里有很多更好的地方,关于使用子shell、内置命令与外部命令、引用空分隔路径名等等。在哪里?我一定是瞎了。这当然要优雅得多!交换答案!为什么更优雅?没有潜艇<代码>+1
。不需要
cd
<代码>+1。使用内置的<代码>+1。如果你有很多shell问题,请考虑在FeleNoDE上加入<代码> { Bash < /Cord> >。还有官方的
help bash
邮件列表,以及
comp.unix.shell
新闻组。这方面的专家比堆栈溢出多得多。