我正在尝试传递一个动态命令,该命令将ls
作为字符串执行,该字符串列出了包含空格的目录文件。但是,无论我做什么,我的ls
命令总是将我的包含空格的目录解释为多个目录。
考虑以下简化版的Shell脚本:
#!/bin/sh
export WORK_DIR="/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work"
echo "WORK_DIR=$WORK_DIR"
export LS_CMD="ls -A \"$WORK_DIR/dependencies/apache-tomcat-8.0.45/logs\""
echo "LS_CMD=$LS_CMD"
if [ -n "$($LS_CMD)" ]
then
echo "### Removing all logs"
sudo rm "$WORK_DIR/dependencies/apache-tomcat-8.0.45/logs/*"
else
echo "### Not removing all logs"
fi
此脚本产生以下输出:
WORK_DIR=/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work
LS_CMD=ls -A "/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work/dependencies/apache-tomcat-8.0.45/logs"
ls: "/Users/jthoms/Dropbox: No such file or directory
ls: (My: No such file or directory
ls: Company)/backup-jthoms/Work/dependencies/apache-tomcat-8.0.45/logs": No such file or directory
### Not removing all logs
如何正确地转义我的shell变量,以便ls
命令将目录解释为包含空格而不是多个目录的单个目录?
我最近更改了此脚本,该脚本过去对于在不包含空格的目录中都可以正常使用,但现在不适用于这种新情况。我正在MacOSX上开发Bash。我曾尝试过各种形式的转义,各种Google搜索以及在此处搜索类似问题的方法,但均无济于事。请帮助。
变量用于数据。函数用于代码。
# There's no apparent need to export this shell variable.
WORK_DIR="/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work"
echo "WORK_DIR=$WORK_DIR"
ls_cmd () {
ls -A "$1"/dependencies/apache-tomcat-8.0.45/logs
}
if [ -n "$(ls_cmd "$WORK_DIR")" ]; then
then
echo "### Removing all logs"
sudo rm "$WORK_DIR/dependencies/apache-tomcat-8.0.45/logs/"*
else
echo "### Not removing all logs"
fi
但是,您根本不需要ls
(通常,您应该avoid parsing the output of ls
)。例如,
ls