参数未传递给shell脚本copyfile.sh:1:copyfile.sh:[d:未找到

时间:2013-08-31 18:29:44

标签: linux bash shell unix sh

我正在尝试将一个简单的参数传递给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

3 个答案:

答案 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 splittingpathname 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