首页 > 解决方案 > bash脚本中的while循环从文件中读取时删除第一行

问题描述

我正在尝试将文件传递到脚本中,该脚本将获取每一行并将其转换为与 Mac 兼容。它通过 sed'ing 行然后删除相关信息并将其放入变量中以供以后使用来实现这一点。所以如果源文件中有一行是: 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 个空行>

标签: bashmacoswhile-loop

解决方案


你的循环结构很差。为了分析,让我们将其简化为:

while read i; do 
   sed cmd
done < $1

read读取输入文件的一行。然后sed开始,从循环中继承它的标准输入。由于第一行数据已经被消费,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

推荐阅读