我是在 Linux 中编写脚本的新手。
我有输入文本文件,其中每一行包含两个由一个或多个空格分隔的字符串(文件路径)。
我正在编写一个自动脚本文件,该文件传递第一个字符串(路径)中列出的文件,将该文件复制到第二个字符串(路径),并对每个输入文件中的每一行重复。
我有 .zip 文件,其中包含输入文件中列出的所有文件。
它看起来像这样:
/path/to/file.x /different/path/to/file.x
/path/to/file2.x /different/path/to/file2.x
ETC。
其中 file.x 将被传递,然后从单独的 .zip 文件复制到不同的路径。
每个输入文件都有自己的 .zip,具有不同的行数和指示的不同路径。
我想我会尝试运行脚本:
~$ ./script.sh files.zip map.txt
然后编写脚本:
zipfile = "$1"
map = "$2"
externalprogram "$zipfile" "$map"
while IFS='' read -r line;
do
VAR_STR=$line
aLeng=${#VAR_STR[@]}
IFS=/ read -a arr <<< "$VAR_STR"
FILE="${arr[${aLeng}]-1}"
cp <path to zip file>/$FILE /different/path/
done < "$map"
显然,它相当复杂,我不知道如何在同一行中将第二条路径作为变量传递。
任何意见都会受到赞赏。谢谢。
编辑:我的意思是把map.txt放在我提到运行脚本的地方。另外,我应该说这对我来说相当复杂。 Linux 的学习还有很多我要做的^_^
答案1
由于您的问题是一个开放式的输入请求,而不是一个具体问题,因此这里有一些评论。
- 您似乎没有充分利用该
read
命令。查看手册页文档,了解如何轻松地使用它一次性读取多个字段到唯一变量,例如。read path1 path2
。 - 你为什么要分配
VAR_STR=$line
?在我看来,你可以直接操作$line
。 - 从第二个字段中修剪路径的方法很聪明,但是
bash
大多数其他 shell 都有一个直接、更简单且更有效的方法,使用#
习惯用法从变量中删除前缀模式,例如。FILE=${path2##*/}
。再次,请参阅手册页,了解 shell 可以非常高效地本地完成的其他很酷的事情的文档。 - 标准化 bash 变量的个人命名约定;要么全部小写,要么全部大写,但不要混合。
- 你以“显然......”开头的结论对我来说一点也不明显,因为我不知道你的意思。