我正在尝试创建一个登录到另一台服务器的脚本(test.sh)并检查某些不同文件夹的磁盘使用情况:
test.sh:
DIRS="dir_A dir_B dir_C"
for DIR in $DIRS
do
sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host 'cd /opt/app/$DIR;SIZE=$(du -s);echo "YVALUE="$SIZE > ../size_$DIR.txt'
done
但是,变量DIR永远不会传递给脚本。运行脚本时它是空的。我尝试在$ DIR周围使用{}但仍然没有成功。我错过了什么?谢谢你的帮助!
答案 0 :(得分:2)
基本上,使用双引号而不是单引号。如有必要,您仍然可以使用单引号连接:
sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host 'cd /opt/app/'"$DIR"';SIZE=$(du -s);echo "YVALUE="$SIZE > ../size_'"$DIR".txt
我刚注意到一些事情:du -s
产生了两列的输出,所以可能还没有以正确的方式使用它。也许还需要类似SIZE=${SIZE%$'\t'*}
的东西。
另一种方法是通过输入发送目录,让另一端读取它:
sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host 'read -r DIR; cd "/opt/app/$DIR"; SIZE=$(du -s); echo "YVALUE=$SIZE" > "../size_$DIR.txt"' <<< "$DIR"
如果目录包含可能导致语法错误的空格或字符,这将非常有用。建议使用阵列:
DIRS=('DIR 1' 'DIR 2' 'DIR 3')
for DIR in "${DIRS[@]}"; do
sshpass ...
done
答案 1 :(得分:1)
用单引号('
)包装字符串将停止发生任何bash扩展,你需要使用双引号来评估$ DIR,转义你要发送的字符串中的任何双引号通过SSH:
sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host "cd /opt/app/$DIR;SIZE=\$(du -s);echo \"YVALUE\"=$SIZE > ../size_$DIR.txt"