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 */
还有一个鲜为人知的技巧,它只能使用coreutilsprintf(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
新闻组。这方面的专家比堆栈溢出多得多。