簡體   English   中英

Bash腳本中的While循環從文件讀取時刪除第一行

[英]While loop in Bash script removing first line when reading from file

我正在嘗試將文件傳遞到腳本中,該腳本將占用每一行並將其轉換為與Mac兼容。 它通過分割行,然后切出相關信息並將其放入變量中以供稍后使用來實現。 因此,如果源文件中的一行是:windows_cmd \\ ip.address \\ sharename \\ rest \\ of \\ path“ \\ download \\ location”

Sed將刪除“”之間的所有內容,然后將“ \\”轉換為“ /”。 之后,我想使用“ /”作為分隔符以切出相關信息,例如server_ip,share_name等。

每當while循環運行時,它始終會跳過文件中的第一行,並且我無法獲取腳本來輸出變量,因此我可以進行故障排除。

xcopy /y  \\111.22.3.444\DATA\400221\800\4002218002360 "~/desktop\4002218002360\"
xcopy /y  \\111.22.3.444\DATA\612608\807\612608807228 "~/desktop\612608807228\"
xcopy /y  \\111.22.3.444\DATA\194491\126\194491126025 "~/desktop\194491126025\"

我的源文件如下所示:

#!/bin/bash

input_file="$1"

while read i; 
    do sed s/\".*$// | sed s/'\\'/'\/'/g;
        export SERVER_NAME=$(echo "$i" | cut -d / -f 4); 
        export SHARE_NAME=$(echo "$i" | cut -d / -f 5);
    done < $1

    echo ${SERVER_NAME}
    echo ${SHARE_NAME}
exit 0

我期望輸出:

xcopy /y  //111.22.3.444/DATA/400221/800/4002218002360
xcopy /y  //111.22.3.444/DATA/612608/807/612608807228
xcopy /y  //111.22.3.444/DATA/194491/126/194491126025

但是我得到了:

xcopy /y  //111.22.3.444/DATA/612608/807/612608807228
xcopy /y  //111.22.3.444/DATA/194491/126/194491126025

<2空行>

您的循環結構不良。 為了進行分析,我們將其簡化為:

while read i; do 
   sed cmd
done < $1

read讀取輸入文件的一行。 然后啟動sed ,從循環繼承其stdin。 由於第一行數據已被使用,因此sed在第二行開始讀取。 它消耗所有數據並退出。 然后再次執行read ,並返回非零值(因為沒有剩余數據)。 while read循環的目的是什么?

認為您可以通過以下方法來完成:

< $1 sed ... |
while IFS=/ read a b c SERVER_NAME SHARE_NAME; do
    echo ${SERVER_NAME}
    echo ${SHARE_NAME}
done

但似乎這樣做會更清潔:

awk '{print $3}' $1 |
while IFS=\\ read a b c SERVER_NAME SHARE_NAME; do 
    echo $SERVER_NAME
    echo $SHARE_NAME
done

為什么不嘗試一下awk

#!/bin/bash

input_file="$1"

# change all \ to / in the third column of input text:
awk '{gsub(/\\/,"/",$3);print}' $input_file

# change the fourth column, too:
awk '{gsub(/\\/,"/",$3);gsub(/\\/,"/",$4);print}' $input_file

另外,一旦您的代碼生成了所有正確的命令字符串,就可以直接通過管道將其運用於bash以使其一一運行,例如,

awk '{gsub(/\\/,"/",$3);gsub(/\\/,"/",$4);print}' $input_file | bash

...但是在添加| bash之后,請先確保命令正確無誤 | bash

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM