我的要求如下。
txt="Notepad"
doc="Microsoft Word"
xls="Microsoft Excel"
pst="Microsoft Outlook"
对于文件名我需要找到文件extn。如果extn是txt,那么我应该回复" Notepad",如果ext是xls,那么我应该回应" Microsoft excel"
下面的是我尝试但没有得到正确输出的代码
filename=/admin/phase1/project/summary_copy_new.txt
onlyfilename=`basename $filename`
echo $onlyfilename
以summary_copy_new.txt
获得答案ext=`echo "$onlyfilename##*.}"`
echo $ext
得到答案为txt
现在,如果我给出以下命令,我没有得到"记事本"作为答案
echo "$""$ext"
我的输出为$ txt。 但我需要" Notepad"作为输出。
有人可以帮忙吗?
答案 0 :(得分:1)
对于间接变量扩展,请使用${!name}
构造。例如对
txt="Notepad"
ext="txt"
echo "${!ext}"
#Notepad
此外,虽然"$onlyfilename##*.}"
可以正常工作,但是:
ext="${onlyfilename##*.}"
当文件没有任何扩展名时,您遇到问题,例如
file="some"
ext=${file##*.}
echo "$ext"
#some
结果显然不正确。因此,使用正则表达式会更好。
您应用的完整演示:
txt="Notepad"
doc="Microsoft Word"
xls="Microsoft Excel"
pst="Microsoft Outlook"
gz="gzip"
while read -r file
do
base=$(basename "$file")
[[ $base =~ ^([^.]*)\.(.*)$ ]] && ext=${BASH_REMATCH[2]} || ext="NOTHING"
printf "%-12s extension is: %-8s program is: %s\n" "$base" "$ext" "${!ext:-PROGRAM_UNDEFINED}"
done <<'EOF'
/some/text.txt
/spaced dir/excel.xls
/spacedname/e mail.pst
/undefinedext/word.docx
/multidot/file.tar.gz
/no/extension
EOF
打印
text.txt extension is: txt program is: Notepad
excel.xls extension is: xls program is: Microsoft Excel
e mail.pst extension is: pst program is: Microsoft Outlook
word.docx extension is: docx program is: PROGRAM_UNDEFINED
file.tar.gz extension is: tar.gz program is: PROGRAM_UNDEFINED
extension extension is: NOTHING program is: PROGRAM_UNDEFINED
上述问题不是你无法定义一个程序,例如: tar.gz
,因为您无法定义带有点的变量:tar.gz="tar"
。
其中(以及许多其他原因)最好使用associative arrays
。
declare -A prg_for=(
[txt]="Notepad"
[doc]="Microsoft Word"
[xls]="Microsoft Excel"
[pst]="Microsoft Outlook"
[gz]="gzip"
[tar.gz]="tar"
)
while read -r file
do
base=$(basename "$file")
[[ $base =~ ^([^.]*)\.(.*)$ ]] && ext=${BASH_REMATCH[2]} || ext="NOTHING"
printf "extension is: %10s program is: %s\n" "$ext" "${prg_for[$ext]:-PROGRAM_UNDEFINED}"
done <<'EOF2'
/some/text.txt
/spaced dir/excel.xls
/spacedname/e mail.pst
/undefinedext/word.docx
/multidot/file.tar.gz
/no/extension
EOF2
正确打印tar
扩展程序的tar.gz
extension is: txt program is: Notepad
extension is: xls program is: Microsoft Excel
extension is: pst program is: Microsoft Outlook
extension is: docx program is: PROGRAM_UNDEFINED
extension is: tar.gz program is: tar
extension is: NOTHING program is: PROGRAM_UNDEFINED
答案 1 :(得分:0)
你需要像这样调用eval命令:
eval echo "$""$ext"
此命令的输出是txt变量的内容:记事本。