![](/img/trans.png)
[英]Bash script while loop stops after reading the first line of text file
[英]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.