Bash脚本中的While循环从文件读取时删除第一行

时间:2019-08-19 20:03:55

标签: bash macos while-loop

我正在尝试将文件传递到脚本中,该脚本将占用每一行并将其转换为与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空行>

2 个答案:

答案 0 :(得分:1)

您的循环结构不良。为了进行分析,我们将其简化为:

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

答案 1 :(得分:0)

为什么不尝试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之前请先确保命令正确。