我对 Linux 脚本相当陌生,如果有人问这个问题,我深表歉意(在发布之前进行了相当多的搜索)。
我正在创建一个简单的脚本来检查备份文件中是否出现某些字母组合。这些文件的路径取决于设备,并且有很多文件,因此我有一个需要在文本文件中检查的文件的列表。
我想做的是cat
文件并将设备名称插入到该设备文件夹的路径中,然后检查最新的备份文件。例如
cat devicelist.txt | grep A[BCD] /folder1/folder2/$1/latest
这给了我错误:/latest: No such file or directory
那么我做错了什么?
答案1
如果我正确理解您的要求,那么您可以使用xargs
例如
cat devicelist.txt | xargs -d'\n' -I{} echo grep 'A[BCD]' "/folder1/folder2/{}/latest"
或者(直接读取文件)
xargs -a devicelist.txt -d'\n' -I{} echo grep 'A[BCD]' "/folder1/folder2/{}/latest"
echo
一旦您确信它正在执行您想要的操作,请将其删除。
请参阅man xargs
参考资料 获取更多信息以及适用于您的平台的可用选项的完整列表。
答案2
$1 表示传递给脚本的参数(第一个)
所以你可以使用
#!/bin/bash
grep A[BCD] /folder1/folder2/"$1"/latest
不要猫| grep 无用时:) "$1" 允许保留变量内容
-bash-4.4$ mkdir test
-bash-4.4$ mkdir -p test/folder/a/latest
-bash-4.4$ cat > t.sh
#!/bin/sh
grep A[BCD] test/folder/"$1"/latest/toto
-bash-4.4$ chmod u+x t.sh
-bash-4.4$ echo ABCD > test/folder/a/latest/toto
-bash-4.4$ ./t.sh b
grep: test/folder/b/latest/toto: No such file or directory
-bash-4.4$ ./t.sh a
ABCD
-bash-4.4$ rm t.sh
-bash-4.4$ rm -rf test
-bash-4.4$
如果您想避免在找不到文件夹路径时 grep 出现错误消息,您还可以将脚本保留为不存在的 $1 值。
答案3
您可以使用
grep 'A[BCD]' "/folder1/folder2/$1/latest" <devicelist.txt
在您用参数调用的脚本中。
如果你想在 shell 中模拟相同的行为,那么你必须先这样做:
set -- foo
然后$1
就变成了foo
。