Linux bash脚本中的变量损坏

Linux bash脚本中的变量损坏,linux,bash,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 |

给定以下代码,我希望变量$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

感谢您的帮助。

评论:如果您使用普通的类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')是:


您需要展示您真正使用的是什么,而“bash-x”可能会帮助您了解问题所在——我无法重现它。

注释:如果您使用普通的类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')是:



您需要显示您真正使用的是什么,“bash-x”可能会帮助您了解问题所在--我无法复制它。

因为您没有回显
$FileName
$FileName3
,我们帮不上忙。所以它实际上是在用.pdf替换/var?或者应该是.pdf/var/ftp..?您应该在所有分配的周围添加双引号(
”),而不使用反勾号,以便正确处理带空格的文件名。@ec:我真的无法在我的计算机上复制它。“.pdf”附加在它的末尾。@ec:显示“bash-x yourscript”的输出。由于您没有回显
$FileName
$FileName3
,我们无能为力。所以它实际上是在用.pdf替换/var?或者应该是.pdf/var/ftp..?您应该在所有分配的周围添加双引号(
”),而不使用反勾号,以便正确处理带空格的文件名。@ec:我真的无法在我的计算机上复制它。“.pdf”附加在它的末尾。@ec:显示“bash-xyourscript”的输出。乔纳森,谢谢你的回复。我还能为您提供哪些其他信息帮助?+PDF=.PDF+文件名1=$'faxtest.txt\r'+文件名2=$'faxtest.txt\r'+文件名3=$'faxtest.txt\r'++basename$'faxtest.txt\r'+文件名=$'faxtest.txt\r'++echo$'faxtest.txt\r'++awk-F'{打印$NF}“+Ext=$'txt\r'++basename$'faxtest.txt\r'+FileName=$'faxtest.txt\r'+oFileName=$'/var/ftp/pub/faxes/faxtest.txt\r'++basename$'faxtest.txt\r'+FileName=$'faxtest.txt\r'+NewFile=$'/var/ftp/pub/faxes/faxes/faxtest.txt\r.pdf'+echo$/echo$/var/ftp/pub/faxes/test.txt\r'/faxes\r'/faxes\r'/r'/faxes\r'/pub/faxes\r'/pdf.pdf/ftp/pub/faxes/faxtest.txt我想我看到了我的问题,变量$FileName中填充了一个字符。\r如果您从Windows导入了文件(最可能的回车源在行尾),那么在进一步处理之前,您应该转换为Unix LF only行尾。一种方法是通过dos2unix或dtou命令;另一种方法是使用vim编辑文件,使用“:set fileformat=unix”将DOS格式更改为unix格式,然后再次保存文件。您可以在开始处看到“.pdf”,因为嵌入的回车符在回显名称后将光标移回行的开头,然后在开始处发出“.pdf”。Jonathan,谢谢你的回复。我还能为您提供哪些其他信息帮助?+PDF=.PDF+文件名1=$'faxtest.txt\r'+文件名2=$'faxtest.txt\r'+文件名3=$'faxtest.txt\r'++basename$'faxtest.txt\r'+文件名=$'faxtest.txt\r'++echo$'faxtest.txt\r'++awk-F'{打印$NF}“+Ext=$'txt\r'++basename$'faxtest.txt\r'+FileName=$'faxtest.txt\r'+oFileName=$'/var/ftp/pub/faxes/faxtest.txt\r'++basename$'faxtest.txt\r'+FileName=$'faxtest.txt\r'+NewFile=$'/var/ftp/pub/faxes/faxes/faxtest.txt\r.pdf'+echo$/echo$/var/ftp/pub/faxes/test.txt\r'/faxes\r'/faxes\r'/r'/faxes\r'/pub/faxes\r'/pdf.pdf/ftp/pub/faxes/faxtest.txt我想我看到了我的问题,变量$FileName中填充了一个字符。\r如果您从Windows导入了文件(最可能的回车源在行尾),那么在进一步处理之前,您应该转换为Unix LF only行尾。一种方法是通过dos2unix或dtou命令;另一种方法是使用vim编辑文件,使用“:set fileformat=unix”将DOS格式更改为unix格式,然后再次保存文件。在开始处可以看到“.pdf”,因为嵌入的回车符在回显名称后将光标移回行的开始处,然后在开始处发出“.pdf”。