为什么字符串串联提取的文件名不起作用?

时间:2013-04-17 14:04:22

标签: bash

我有一个文件“a.txt”,其中包含带路径的文件名。

A.TXT:

/root/chan/properties.lo  
/root/attributes.cc   
/root/chan/eagle/bath.ear

我想提取这些文件名并将它们放在一个变量中:

#!/bin/bash
for i in $(cat a.txt);  do
    o+=$(basename $i)
done

echo $o

但它不起作用。 我在说:

feedBackMailConfiguration.xmltiess

请帮助。

3 个答案:

答案 0 :(得分:2)

while read -r i;
do
   o=$o" "$(basename $i)
done < a.txt

echo $o

以上都会这样做。 (编辑复制和粘贴错误)

更多编辑:刚试过这个(终结者,ubuntu),它给出了正确的结果:

while read -r i; do o="$o $(basename $i)";done < a.txt

答案 1 :(得分:0)

您只需要在脚本中添加空格连接,如下所示:

#!/bin/bash
for i in $(cat a.txt);  do
    # Check the " " at the end of the following line  
    o+=$(basename $i)" "
done

echo $o

它会起作用

答案 2 :(得分:0)

“o + = ...”实际上不是可移植的(哪个版本的bash允许它?我从未看到它直到你提到它?它看起来像perl机制)

Edit2:关于输出是什么的vladintok评论,我添加了DEBUG信息以试图找出问题

Edit3:尝试取消报告的奇怪输出的每个可能解释的另一步...我unalias,并取消设置任何名为“o”和“basename”的函数......

尝试:

#!/bin/bash
unalias o         2>/dev/null 
unalias basename  2>/dev/null
unset o           2>/dev/null
unset basename    2>/dev/null
for i in $(cat a.txt);  do
    printf 'DEBUG: i is: %s\n' "$i"
    o="${o} $(basename $i)"
done

printf 'DEBUG: final o is: %s\n' "$o"
echo $o
#end of the script.

(当然上面是一个SINGLE文件。将其命名为'test.bash',将其命名为chmod +x test.bash,然后执行它:./test.bash

Edit1:我将Pantoine指出的o=$o" "$(basename $i)更正为o="${o} $(basename $i)"。否则,toto = $ toto“”titi:将分配给toto所有东西,直到第一个空格(在第一次迭代之后或者如果basename包含空格的$ toto之内)...