0

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

4

3 回答 3

3

由于您使用的是双等号 (==),我可以假设您使用的是 Bash 之类的高级 shell。使用普通外壳,您只能使用一个,=例如

if [ "$1" = d ]; then

对于上面的代码,将、"$1"和视为3 个单独的参数,就像任何其他命令一样,因此需要空格来分隔它们。如果你这样做了,那就像尝试运行一样。唯一的作用是根据前面命令的结果来决定脚本的流程,通常可以返回 0(成功/真)或 1(失败/假)。=d][["$1""[$1"if[

它实际上相当于:

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

用变量引用你的参数以防止分词路径名扩展总是一个好主意。

        scp -r -i ~/Dropbox/Business/aws/first.pem "$LOCAL" ubuntu@XX.XX.194.202:~/test/
于 2013-08-31T19:10:25.650 回答
2

Shell 脚本对空格非常特别,所以 if 条件应该这样写:

if [ "$1" == "d" ]; then

此外,与 NULL 的比较可能不起作用,但这应该可以解决问题:

if [ "$2" == "" ]; then
于 2013-08-31T18:40:41.173 回答
0

语句中的括号在前后if需要空格:[]

if [ "$1" == "d" ]; then

如果你不放空格,那么 shell 会看到,因为你在 string 中[d替换了dfor 。$1["$1"

此外,如果您要检查是否为$2空,则无法通过与NULL. NULL不是预定义的 shell 空字符串。你需要这样做:

if [ "$2" == "" ]; then
于 2013-08-31T18:37:42.357 回答