bash脚本中的可变损坏

时间:2009-11-07 15:39:33

标签: linux bash

鉴于以下代码,我期望变量$ NewFile为/var/ftp/pub/faxes/myfile.txt.pdf
但是我的系统正在返回:“。pdf / ftp / pub / faxes / myfile.txt”

$ Ext返回:“txt”
$ oFileName返回:“/ var / ftp / pub / faxes / myfile.txt”

我已经尝试了一百种不同的方法而没有运气。

PDF=".pdf"

#extract the file.ext from the script
FileName1=`head $f -n1 | awk -F/ '{print $NF}' | sed 's/\"//'`
FileName2=`head $f -n1 | awk -F/ '{print $NF}' | sed 's/\"//'`
FileName3=`head $f -n1 | awk -F/ '{print $NF}' | sed 's/\"//'`

FileName=`basename $FileName1`
Ext=`echo $FileName | awk -F . '{print $NF}'`

FileName=`basename $FileName2`
oFileName=/var/ftp/pub/faxes/${FileName}

FileName=`basename $FileName3`
NewFile=/var/ftp/pub/faxes/${FileName}${PDF}

echo $oFileName
echo $NewFile
echo $Ext

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

评论:如果您转移到类似Unix的普通系统而不是Linux,那么您将无法使用“head $f -n1”;您必须在文件名之前放置选项(控制)参数,因此请使用“head -n1 $f”。 (如果设置环境变量POSIXLY_CORRECT,Linux的行为与其他系统相同。)

评论:你写得很好:

FileName1=`head -n1 $f | awk -F/ '{print $NF}' | sed 's/\"//'`
FileName2=$Filename1
FileName3=$Filename1

比在同一数据上运行相同的三个程序三次更有意义。

评论:你应该学习并使用'$(...)'表示法:

FileName1=$(head -n1 $f | awk -F/ '{print $NF}' | sed 's/\"//')

在MacOS X上运行时,f = xxxx.input,文件xxxx.input包含一行“/some/where/myfile.txt”,脚本会生成:

/var/ftp/pub/faxes/myfile.txt
/var/ftp/pub/faxes/myfile.txt.pdf
txt

跟踪输出('bash -x')是:

+ f=xxxx.input
+ PDF=.pdf
++ head -n 1 xxxx.input
++ sed 's/\"//'
++ awk -F/ '{print $NF}'
+ FileName1=myfile.txt
++ head -n 1 xxxx.input
++ awk -F/ '{print $NF}'
++ sed 's/\"//'
+ FileName2=myfile.txt
++ awk -F/ '{print $NF}'
++ head -n 1 xxxx.input
++ sed 's/\"//'
+ FileName3=myfile.txt
++ basename myfile.txt
+ FileName=myfile.txt
++ echo myfile.txt
++ awk -F . '{print $NF}'
+ Ext=txt
++ basename myfile.txt
+ FileName=myfile.txt
+ oFileName=/var/ftp/pub/faxes/myfile.txt
++ basename myfile.txt
+ FileName=myfile.txt
+ NewFile=/var/ftp/pub/faxes/myfile.txt.pdf
+ echo /var/ftp/pub/faxes/myfile.txt
/var/ftp/pub/faxes/myfile.txt
+ echo /var/ftp/pub/faxes/myfile.txt.pdf
/var/ftp/pub/faxes/myfile.txt.pdf
+ echo txt
txt

你需要展示你真正使用的东西,而'bash -x'可能会帮助你找到你的问题所在 - 我无法重现它。