首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用星号截断变量时的压壳展开

用星号截断变量时的压壳展开
EN

Stack Overflow用户
提问于 2018-06-21 19:52:46
回答 2查看 39关注 0票数 0

在我的文件夹中有以下文件:

代码语言:javascript
复制
roi_1_Precentral_L/
roi_1_Precentral_L_both.fig
roi_1_Precentral_L_left.fig
roi_1_Precentral_L_right.fig
roi_1_Precentral_L_slice.fig
roi_2_Precentral_R/
roi_2_Precentral_R_both.fig
...
roi_116_Vermis_10/
roi_116_Vermis_10_both.fig
roi_116_Vermis_10_left.fig
roi_116_Vermis_10_right.fig
roi_116_Vermis_10_slice.fig

我使用以下脚本为所有116个类型中的每个类型获取所需的文件名前缀:

代码语言:javascript
复制
for iroi in `seq 1 116`;
do
    d=roi_${iroi}_*/
    d2=${d:0:-1}         # <-- THIS LINE IS IMPORTANT
    echo $d2
done;

所需的iroi=1输出

代码语言:javascript
复制
$ roi_1_Precentral_L

实际输出

代码语言:javascript
复制
$ roi_1_Precentral_L roi_1_Precentral_L_both.fig roi_1_Precentral_L_left.fig roi_1_Precentral_L_right.fig roi_1_Precentral_L_slice.fig

如何避免在强调的代码行中展开shell以实现所需的输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-21 20:24:44

如果分配给数组,则将在第一行展开glob,而不是像原始代码那样晚于echo展开。

代码语言:javascript
复制
d=( "roi_${iroi}_"*/ )
d2=${d:0:-1}            # Note that this only works with new bash. ${d%/} would be better.
echo "$d2"

如果您期望有多个目录,"${d[@]%/}"将展开到完整列表,并从每个目录中删除尾随的/

代码语言:javascript
复制
d=( "roi_${iroi}_"*/ )
printf '%s\n' "${d[@]%/}"

为了避免不必要的扩展--注意,在上面,除了简单(字符串,而不是数组)赋值的右侧扩展之外,每个扩展都是双引号。(常规的赋值隐式地抑制了字符串的分裂和字汇扩展-尽管即使有引号也没什么坏处!)这就是为什么${d:0:-1}从glob表达本身而不是从其结果中删除/的原因)。

票数 2
EN

Stack Overflow用户

发布于 2018-06-21 19:55:20

回答问题

如果你愿意,你可以引用以避免*$d的扩张.

代码语言:javascript
复制
d=roi_${iroi}_*/
d2="${d:0:-1}"
echo $d2

..。但你可以直接写..。

代码语言:javascript
复制
d2="roi_${iroi}_*"
echo $d2

..。结果还是和你的问题一样。

对预期产出的答复

您可以在数组中进行扩展,并选择第一个数组条目,然后从该条目中删除/

代码语言:javascript
复制
for iroi in {1..116}; do
    d=(roi_"$iroi"_*/)
    d2="${d[0]:0:-1}"
    echo "$d2"
done

这只匹配目录,并打印第一个目录,没有尾随的/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50976540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档