我对bash脚本完全陌生。我正在尝试编写bash脚本,以将文件从登台复制到多个生产服务器。
我正在使用三个文件。
serverPass.txt:包含多个服务器ip及其密码(以空格分隔)。
paths.txt:包含需要在serverPass.txt
copy.sh:bash脚本文件。
copy.sh:
#!/bin/bash
while read SERVER PASSWORD;
do
while read PATH;
do
sshpass -p "$PASSWORD" scp * "$SERVER":"$PATH"
done <./paths.txt
done <./serverPass.txt
我得到的输出是:
sshpass: command not found
但是sshpass已经安装并且在直接用于命令行时可以正常工作。我在做什么错了?
答案 0 :(得分:1)
while read PATH;
PATH
是一个特殊变量。来自POSIX shell manual:
路径
按照IEEE Std 1003.1-2001的Base Definitions卷第8章环境变量中所述进行格式化的字符串,用于实现命令解释;请参阅命令搜索和执行。
...
命令搜索和执行
....应该使用PATH环境变量....来搜索该命令。
PATH
环境变量指定搜索命令的路径。我的系统PATH
上的示例等于:
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/bin:/sbin:/home/kamil/bin
这些是我的命令所在的路径。这些路径用:
分隔。
执行while read PATH
时,您用其他字符串覆盖了PATH环境变量,因此找不到您的命令。
更改变量的名称。通常在shell中将导出的变量设置为大写。对于脚本中未导出的变量,通常使用小写字母。还可以将-r
选项与read一起使用,以使\
的反斜杠不特殊,如果您不想删除行中的前导和尾随空格,请指定IFS=
(如果要这样做,请使用unno )。您修复的脚本可能如下所示:
#!/bin/bash
while read -r server password; do
while read -r path; do
sshpass -p "$password" scp * "$server":"$path" </dev/null
done <./paths.txt
done <./serverPass.txt