我正在构建一些小的测试文件来开始学习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 here
和 to here
)的目录名。对于持有相同代码的变量来说,这将非常困难。