0

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

一个.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

请帮忙。

4

3 回答 3

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
于 2013-04-17T14:11:56.393 回答
0

"o+=..." 不是真正可移植的(哪个版本的 bash 允许它?在你提到它之前我从未见过它?它看起来像 perl 机制)

Edit2:在 vladintok 对输出的评论之后,我添加了 DEBUG 信息以尝试查明问题

Edit3:尝试排除对报告的奇怪输出的所有可能解释的另一个步骤......我取消别名,并取消设置任何名为“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:我纠正了o=$o" "$(basename $i)Pantoineo="${o} $(basename $i)"指出的错误。否则, toto=$toto" "titi : 将分配给 toto 直到第一个空格的所有内容(它将在 $toto 内的某个地方,在第一次迭代之后或者如果基本名称包含空格)...

于 2013-04-17T15:44:04.160 回答
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

它会起作用

于 2013-04-17T14:19:43.373 回答