我正在尝试将文件传递到脚本中,该脚本将占用每一行并将其转换为与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空行>
答案 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
之前请先确保命令正确。