我只需要使用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是我想获得纯文件名
答案 0 :(得分:3)
将其添加到脚本的末尾:
for i in ${!array[@]}; do
array[i]="${array[i]%%.???}"
done
这里使用了两个技巧:
${!array[@]}
(see info)"${array[i]%%.???}"
(由于文件名中的空格,必须是双引号)(see info)要确保(稍后在使用数组时)获得文件的全名,请在循环中使用以下技巧:
for file in "${array[@]}"; do # the double-quotes are important
echo "$file"
done
有关详细信息,请参阅the bash hackers site和bash manual
答案 1 :(得分: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/[.].*$//'
)
其次,您可以像这样修剪整个数组中的扩展名:
trimmedarray=("${array[@]%.???}")
(同样,这假定为3个字母的扩展名;对于任何尺寸,都使用"${array[@]%.*}"
)