找到值后需要帮助回显变量

时间:2015-03-22 11:25:22

标签: shell scripting

我的要求如下。

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"作为输出。

有人可以帮忙吗?

2 个答案:

答案 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变量的内容:记事本。