定义变量
变量转义
这是别人在群里问到的一个问题。看如下命令:
ssh localhost “/bin/cat > /tmp/tmp << eof
\\\$demo
eof”
上述命令生成的/tmp/tmp文件的内容是$demo,为什么?首先,传给SSH的命令在双引号中,所以Bash先解析一次,但是它解析了”\\“和”\$“两个组合。也就是说,SSH拿到手的时候,命令已经变成”\$name“。即:
/bin/cat > /tmp/tmp << eof
\$demo
eof
那么,写入文件的自然就是”$name“字符串。
换句话说,下面的写法是等效的:
ssh localhost ‘/bin/cat > /tmp/tmp << eof
\$dddd1
eof
变量引用
定义了一个SHELL函数:
ddPATH=”-cp /mnt/demo”
debug=com.k4nz.Enter
debug()
{
java $ddPATH “$USER_FLAGS” $debug
}
而USER_FLAGS使用用户自定义的,可能存在,也可能不存在。在执行这个函数的时候会产生如下错误:
Error: Could not find or load main class
我们尝试打印出要执行的命令,所以对函数作出如下修改,加了一个echo命令:
ddPATH=”-cp /mnt/demo”
debug=com.k4nz.Enter
debug()
{
echo java $ddPATH “$USER_FLAGS” $debug
}
该函数的输入如下:
java -cp /mnt/demo com.k4nz.Enter
在命令行里执行这个命令是没有错误,完全可以正常执行这个类,这就见鬼了。
其实,有的时候就是需要非常仔细的观察,问题的关键就在于那个”$USER_FLAGS”,修改成$USER_FLAGS就正常了。为什么?
由于USER_FLAGS未定义,函数里的java $ddPATH “$USER_FLAGS” $debug命令执行前,SHELL会先进行解析,而解析的结果是java -cp /mnt/demo “” com.k4nz.Enter,而echo的结果是java -cp /mnt/demo com.k4nz.Enter,这两个并不等价。而当我们把函数里的命令修改成java $ddPATH $USER_FLAGS $debug后,解析的结果就与echo等价了,这时候也不会出现那[……]
READ MORE