2013-04-10 133 views
1

我在Linux中對shell腳本有疑問。 我一直試圖讓這段代碼工作幾個小時,而且它做了一些我不明白的事情。代碼的目的是在csv文件中爲用戶添加名稱,gecos和組的值。 CSV文件的格式如下:Linux scipt變量無法正確識別

U12341;Mario Speedwagon;docent 
U12342;Petey Cruiser;classA 

這是我的代碼,我刪除了論壇功能useradd的暫時性的,因爲它是更容易調試的方式。它一直告訴我,這個組是一個無效的名字。所以我試着把變量放在屏幕上,並注意到了一些很奇怪的東西。

for actie in `more +2 users.csv | tr " " "_"` 
do 
login=`echo $actie | tr ";" ":" | cut --delimiter=: --field=1 | tr '[A-Z]' '[a-$ 
groep=`echo $actie | tr ";" ":" | cut --delimiter=: --field=3`; 
gecos=`echo $actie | tr ";" ":" | cut --delimiter=: --field=2 | tr "_" " "`; 

echo "In login ($login), in gecos ($gecos) en in groep ($groep)" 
sudo useradd $login -c "$gecos" 
echo "User $login is toegevoegd onder de naam $gecos in groep $groep" 

done 

這是奇怪的輸出:

)n login (u12341), in gecos (Mario Speedwagon) en in groep (docent 
useradd: user 'u12341' already exists 
User u12341 is toegevoegd onder de naam Mario Speedwagon in groep docent 
)n login (u12342), in gecos (Petey Cruiser) en in groep (classA 
useradd: user 'u12342' already exists 

似乎在字符串的第一個字符把字符$組後。我認爲我使用同一個變量作爲組名的問題完全一樣。

其他一切似乎都很好,如果我運行沒有組代碼的腳本,它會爲用戶添加正確的gecos數據。

有人遇到過這樣的問題嗎? 在此先感謝。

回答

1

在Windows機器上製作了csv文件嗎? Windows以回車+換行符(\r\n)結束行,而Linux僅使用換行符(\n)。我的猜測是它包含groep變量中每行結尾的回車\r。然後,當它迴應該變量時,\r不帶\n將光標發送到行的開頭,而不移動到下一行。 (爲了演示,嘗試echo -e "Here's a line of text to print with a \rcarriage return in the middle."

我不知道副手自動剝離CR(我會看看如果我能找到一個),但你可以通過sed或其他東西運行文件和刪除所有出現的\r

編輯:
選項1:安裝dos2unix(標準)
選項2:tr -d '\r' <input.file> new.file(從here解除此)
選項3:顯然只是運行cat oldfile.csv > newfile.csv將去掉回車。我沒有一個文件來測試它,但你可以試試看。

+0

我試過你的例子\ r,那似乎確實是這個問題。我會看看我能否找到一種方法來刪除它(因爲它不在文本編輯器中顯示)。 編輯:我試着像你說的那樣複製文件,但問題仍然存在。 – 2013-04-10 22:49:37

+0

無論哪種方式,我不認爲我被允許更改csv文件。 – 2013-04-10 23:09:43

+0

您可以在獲取'groep'變量的管道末端使用'tr -d'\ r''。 – iamnotmaynard 2013-04-10 23:11:29