2009-11-07 3 views
0

Учитывая следующий код, я ожидал, что переменная $ NewFile быть /var/ftp/pub/faxes/myfile.txt.pdf
Однако моя система возвращается:».pdf/FTP/паб/факсы/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

Поскольку вы не выбрали '$ FileName' или' $ FileName3', мы не можем помочь. –

+0

, поэтому он фактически заменяет/var на .pdf? или это должно быть .pdf/var/ftp ..? – falstro

+1

Вы должны добавить двойные кавычки ('' "') вокруг всех назначений без обратных ссылок, чтобы имена файлов с пробелами обрабатывались правильно. – Thomas

ответ

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, с е = xxxx.input и файл xxxx.input, содержащий одну строку что говорит '/some/where/myfile.txt', сценарий производит:

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

Трассировочная ('баш -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» может помочь вам понять, где ваша проблема - я не могу воспроизвести ее.

+0

Джонатан, спасибо за ответ. какую еще информацию я могу вам помочь? – 2009-11-07 16:13:54

+0

+ PDF = .pdf + имя_файла1 = $ 'faxtest.txt \ г' + filename2 = $ 'faxtest.txt \ г' + имя_файла3 = $ 'faxtest.txt \ г' ++ $ базовое имя 'faxtest. txt \ r ' + FileName = $' faxtest.txt \ r ' ++ echo $' faxtest.txt \ r ' ++ awk -F. '{print $ NF}' + Ext = $ 'txt \ r' ++ basename $ 'faxtest.txt \ r' + FileName = $ 'faxtest.txt \ r' + oFileName = $ '/ var/FTP/паб/факсы/faxtest.txt \ r ' ++ basename $' faxtest.txt \ r ' + FileName = $' faxtest.txt \ r ' + NewFile = $'/var/ftp/pub/faxes/faxtest.txt \ r.pdf ' + echo $'/var/ftp/pub/faxes/faxtest.txt \ r ' /var/ftp/pub/faxes/faxtest.txt + echo $'/var/ftp/pub/faxes/faxtest. txt \ r.pdf ' .pdf/ftp/pub/faxes/faxtest.txt – 2009-11-07 16:20:08

+2

Я думаю, что вижу свою проблему, переменная $ FileName заполняется символом \ r. – 2009-11-07 16:21:20