bash - 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 个空行>
解决方案
你的循环结构很差。为了分析,让我们将其简化为:
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
推荐阅读
- c# - 将 IQueryable 应用于 Linq Dynamic 后,Count() 不起作用,在 EF Core 中引发“必须是可简化节点”错误
- docker - 使用 groovy 在 Jenkins 中配置 Docker
- intellij-idea - 有没有办法在 Intellij 中提交之前添加一些控件?
- python - 使用 python 将图像上传到 azure blob 存储
- vim - 如何让 vim 作为 IDE 运行和编译 Java 文件?
- git - git show --tags > file.txt 缺少标签
- spring-boot - Spring Boot CORS 通过配置启用
- php - 当我收到错误时系统无法创建文件“/footer.php.lock”(如 EUID:1000,EGID:1002 1002)权限被拒绝
- node.js - 我正在编写此脚本,但它正在显示或未知操作员
- php - Google reCaptcha v2(复选框)验证