即使命令触​​发,bash“command not found”错误

时间:2014-01-16 15:18:21

标签: bash shell variables rsync

我正在构建一些小的测试文件来开始学习bash脚本。

我构建的其中一个文件执行rsync命令。该命令成功触发,但是当终端触发脚本时,脚本中导致命令触发的行将引发错误line 15: =building: command not found

这是脚本:

#!/bin/bash

clear

cd ~/Desktop

mkdir -p ./GGERPTTESTINGSANDBOX/source_folder/
mkdir -p ./GGERPTTESTINGSANDBOX/target_folder/

touch ./GGERPTTESTINGSANDBOX/source_folder/file1.txt
touch ./GGERPTTESTINGSANDBOX/source_folder/file2.txt
touch ./GGERPTTESTINGSANDBOX/source_folder/file3.txt

statement="/usr/bin/rsync -avzh --progress ./GGERPTTESTINGSANDBOX/source_folder/ ./GGERPTTESTINGSANDBOX/target_folder/"
$statementResult=$($statement) # the error points to this line. 

正如我上面所说,当我运行这个脚本时,rsync工作正常。我已经把命令拉出来并直接在终端中解决它并且工作正常。

起初我没有脚本中rsync命令的完整路径所以我添加了它认为从我的路径变量中拉出命令可能是问题,但它仍然抛出错误。

我也尝试将语句直接放入$()字符,而不是将其传递给via变量,错误仍然存​​在。

我缺少什么想法?

1 个答案:

答案 0 :(得分:4)

摆脱领先的美元符号。

statementResult=$($statement)

我还鼓励您将命令存储在函数中而不是变量中。

statement() {
    rsync -avzh --progress ./GGERPTTESTINGSANDBOX/source_folder/ ./GGERPTTESTINGSANDBOX/target_folder/
}

statementResult=$(statement)

函数可以接受参数,从而可以轻松地使用不同的参数调用预定义的命令。当他们的参数被正确引用时,他们可以处理带有空格和其他不寻常但允许的字符的文件名。

例如,您可以参数化您的函数,以便它只执行rsync并将路径名留给调用者:

synchronize() {
    local dir=$1
    local src=$2
    local dest=$3

    rsync -avzh --progress "$dir/$src/" "$dir/$dest/"
}

result=$(synchronize ./GGERPTTESTINGSANDBOX source_folder target_folder)
result=$(synchronize ./GGERPTTESTINGSANDBOX 'from here' 'to here')

请注意这是如何接受包含空格(from hereto here)的目录名称。对于保存相同代码的变量,这将非常困难。