我正在尝试将一个简单的参数传递给shell脚本。这是脚本:
if ["$1" == "d"]; then
if ["$2" == NULL]; then
echo "Please enter the local location of the files"
else
LOCAL = $2
scp -r -i ~/Dropbox/Business/aws/first.pem $LOCAL ubuntu@XX.XX.194.202:~/test/
fi
else
scp -r -i ~/Dropbox/Business/aws/first.pem ~/Dropbox/Business/aws/files/binaryhustle/ ubuntu@XX.XX.194.202:~/test/
fi
我输入:sh copyfile.sh d,我得到的错误是copyfile.sh: 1: copyfile.sh: [d: not found
答案 0 :(得分:3)
由于你使用的是双等号(==),我可以假设你正在使用像Bash这样的高级shell。使用普通shell时,您只能使用一个=
,例如
if [ "$1" = d ]; then
对于上面的代码,将"$1"
,=
,d
和]
视为[
的3个独立参数,就像任何其他命令一样有必要将它们分开。如果您执行["$1"
,则会尝试运行"[$1"
。只有if
做的是根据前面的命令结果决定脚本的流程,而[
通常可以返回0(成功/真)或1(失败/假)。
它实际上相当于:
if test "$1" = d; then
此外,shell脚本中没有NULL关键字。你必须与空字符串进行比较
if [ "$2" = '' ]; then
或使用-z
:
if [ -z "$2" ]; then
对于bash,建议使用[[ ]]
。这是一种特殊的语法,并不像'['或'test'那样像其他命令一样执行。它在更高层次上得到了更多的解释。有了它,即使没有引用变量,参数也不受路径名扩展或单词拆分的影响。
if [[ $1 == d ]]; then
if [[ -z $2 ]]; then
虽然我仍然建议引用带有变量的文字字符串的第二个参数,以防止因每个版本的bash实现变化而导致重新解释,可能是旧版本。
[[ $var == "$xyz" ]]
而且你也不能在作业上放置空格:
LOCAL=$2
使用变量引用您的参数以防止word splitting和pathname expansion始终是一个好主意。
scp -r -i ~/Dropbox/Business/aws/first.pem "$LOCAL" ubuntu@XX.XX.194.202:~/test/
答案 1 :(得分:2)
shell脚本确实特别关于空格,所以if条件应该这样写:
if [ "$1" == "d" ]; then
此外,与NULL的比较可能无效,但这应该可以解决问题:
if [ "$2" == "" ]; then
答案 2 :(得分:0)
if
语句中的括号在[
之后和]
之前需要空格:
if [ "$1" == "d" ]; then
如果你没有放置空格,那么shell会看到[d
,因为你在字符串d
中替换$1
["$1"
。
此外,如果您要检查$2
是否为空,则无法通过与NULL
进行比较来完成此操作。 NULL
不是预定义的shell空字符串。你需要这样做:
if [ "$2" == "" ]; then