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

Bash脚本中的While循环在读取文件时删除第一行,bash,macos,while-loop,Bash,Macos,While Loop,我正在尝试将一个文件传递到一个脚本中,该脚本将接收每一行并将其转换为与Mac兼容。它通过对行进行sed’s处理,然后删除相关信息,并将其放入一个变量中供以后使用。因此,如果源文件中的一行是:windows\u cmd\ip.address\sharename\rest\of\path\download\location Sed将删除之间的所有内容,然后将\转换为/。之后,我想使用/作为分隔符来剪切相关信息,如服务器ip、共享名称等 每当while循环运行时,它总是跳过文件中的第一行,我无法让脚本

我正在尝试将一个文件传递到一个脚本中,该脚本将接收每一行并将其转换为与Mac兼容。它通过对行进行sed’s处理,然后删除相关信息,并将其放入一个变量中供以后使用。因此,如果源文件中的一行是:windows\u cmd\ip.address\sharename\rest\of\path\download\location

Sed将删除之间的所有内容,然后将\转换为/。之后,我想使用/作为分隔符来剪切相关信息,如服务器ip、共享名称等

每当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/612608/807/612608807228
xcopy /y  //111.22.3.444/DATA/194491/126/194491126025

你的循环构造得很差。为了便于分析,我们将其简化为:

while read i; do 
   sed cmd
done < $1
但这样做似乎更干净:

awk '{print $3}' $1 |
while IFS=\\ read a b c SERVER_NAME SHARE_NAME; do 
    echo $SERVER_NAME
    echo $SHARE_NAME
done
为什么不试试awk呢

此外,一旦代码生成了所有正确的命令字符串,就可以直接通过管道将它们逐个运行,例如

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

…但在添加| bash之前,首先确保命令正确。

海报希望将dos转换为unix行,并在带有sed@L埃格里斯是正确的。我正在获取一个充满dos行的文件,将它们转换为unix风格,然后使用cut提取服务器地址,然后使用cut连接到服务器并复制我需要的文件。我显然是一个傻瓜,所以我并不惊讶我的循环被搞砸了。在某些情况下,我会在一个文件中有3行以上的内容,因此我会尝试使用并理解while IFS=\\read a b c SERVER\u NAME SHARE\u NAME;你的例子。谢谢你的帮助。while-read循环一次只能运行一行。文件的每一行将运行循环的一次迭代。设置IFS允许read拆分行,因此您不需要使用cut。@Williampersell感谢您的解释。这让我学到了一些非常有用的新概念。我可以根据您的建议获得缺少的行,但无法根据需要格式化/处理字符串。我最终使用了while-read-r行;do line=${line/\\//}line=${line/\\/}line=${line%%\*\}您的sed命令缺少引号或位于错误的位置。除非您需要在子流程的环境中使用变量,否则不必导出变量。嘿,我最初使用awk提取一些我需要的信息,但没有使用它转换反斜杠。最后,在我把斜线排序后,我用它们作为分隔符,看起来比awk好。
awk '{print $3}' $1 |
while IFS=\\ read a b c SERVER_NAME SHARE_NAME; do 
    echo $SERVER_NAME
    echo $SHARE_NAME
done
#!/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
awk '{gsub(/\\/,"/",$3);gsub(/\\/,"/",$4);print}' $input_file | bash