2011-09-20 29 views
3

我只需要使用bash工作,即时通讯新的给它使用bash

#!/opt/bin/bash 
SAVEIFS=$IFS 
IFS=$'\n' 
array=($(mysql --host=xxxx --user=xxxx --password=xxxx -s -N -e 'use xbmc_video; SELECT strFilename FROM movie, files WHERE files.idFile=movie.idFile ORDER BY idMovie DESC LIMIT 10;')) 

替换字符串数组由此产生的文件名与空间内因为即时通讯在Windows Samba共享工作的数组。问题是我怎么能在每一个字符串删除最后4个符号摆脱扩展,而无需理会这ext是我想要得到纯净的文件名

回答

3

添加到您的脚本的末尾:

for i in ${!array[@]}; do 
    array[i]="${array[i]%%.???}" 
done 

两个技巧在这里使用:

  1. 数组的索引列表:${!array[@]}see info
  2. 模式从最终截止:"${array[i]%%.???}"(必须是在做uble引号是因为在文件名中,你得到的文件的全名使用下面的技巧在循环的空间)(see info

为了确保(以后当你使用数组)的:

for file in "${array[@]}"; do # the double-quotes are important 
    echo "$file" 
done 

欲了解更多信息请参阅the bash hackers sitebash manual

+0

谢谢你 - 我想我仍然想念整个概念 现在当文件名在逗号内有逗号时,这个技巧就失败了。该文件名没有任何反应 – zero

+1

我已经编辑了模式替换方法以'从最终结束计数'(请参阅http://wiki.bash-hackers.org/syntax/pe?s[==replace#substring_removal) – Rajish

+0

感谢您不要送我手动。 – zero

0

我给你两个选择。首先,你可以编辑过的文件扩展名作为生成摆在首位的阵列命令的一部分:

array=($(mysql --host=xxxx --user=xxxx --password=xxxx -s -N -e 'use xbmc_video; SELECT strFilename FROM movie, files WHERE files.idFile=movie.idFile ORDER BY idMovie DESC LIMIT 10;' | sed 's/[.]...$//')) 

(注意,这个假设3个字母的扩展名。如果您需要修剪任何大小的扩展,改变sed命令到sed 's/[.].*$//'

其次,可以修剪从整个阵列的延伸部是这样的:

​​

(再次,这是假定3个字母的扩展名;任何大小的,使用"${array[@]%.*}"