bash "command not found"错误,即使命令触发



我正在构建一些小的测试文件来开始学习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 命令的完整路径,所以我添加了它,认为从我的路径变量中提取命令可能是问题所在,但它仍然会引发错误。

我还尝试将语句直接放入$()字符中,而不是通过变量传递它,但错误仍然会发生。

对我错过了什么有什么想法吗?

去掉前导美元符号。

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 )的目录名。对于持有相同代码的变量来说,这将非常困难。

相关内容

  • 没有找到相关文章

最新更新