如何正确测试命令作为包含空格的变量?

如何正确测试命令作为包含空格的变量?

我正在尝试创建一个测试,而逻辑是

If mkdir command is successfully executed perform the next actions

我拥有的是:

FILEPATH=/home/Documents/projectDirectory
CREATE_DIRECTORY=mkdir $FILEPATH

和测试命令:

if [ -e $FILEPATH ]; then
    echo "${FILEPATH} exists.."
    else 
        #Create the folder: Test it if is created , else exit gracefully.
        if [ -e "${CREATE_COMMAND}" ]; then
        echo "File created ${FILEPATH}"
        else
            echo "Error creating the filePath..exiting.."
            error_exit "Error creating the filePath..exiting.."
        fi
fi

答案1

我不确定你为什么想要这样做,但这是一个可行的解决方案:

FILEPATH=/home/Documents/projectDirectory
CREATE_DIRECTORY="mkdir $FILEPATH 2>/dev/null"
eval $CREATE_DIRECTORY
if [[ $? -eq 0 ]]; then
 echo "Directory created"
else
 echo "Directory already exists"
fi

这将尝试创建文件夹并将任何错误消息通过管道传输到 /dev/null (不显示它)。然后它会检查 if 语句中前一个命令的状态,如果成功 (0),则会告诉您。

答案2

您当前的代码有以下缺陷:

  • CREATE_DIRECTORY=mkdir $FILEPATH:
    1. 由于 周围没有引号mkdir $FILEPATHCREATE_DIRECTORY因此仅保留mkdir其值。
    2. $FILEPATH是分词的主题。
    3. 如果这种扩展的第一个标记是外部命令,则可以将变量CREATE_DIRECTORY导出到所得到的扩展的环境。$FILEPATH
  • [ -e "${CREATE_COMMAND}" ]:
    1. CREATE_COMMAND据我们所知,该变量没有任何值。我猜你是想写CREATE_DIRECTORY
    2. 它不测试是否mkdir成功。

此外,if复合命令可用于测试命令是否成功:

if command; then
  # Code to execute if command succeeded
else
  # Code to execute if command failed
fi

所以你的代码可以重写为:

FILEPATH=/home/Documents/projectDirectory

if [ -e "${FILEPATH}" ]; then
    echo "${FILEPATH} exists..."
else
    if mkdir "${FILEPATH}"; then
        echo "File created ${FILEPATH}"
    else
        echo "Error creating the filePath..exiting.."
        error_exit "Error creating the filePath..exiting.."
    fi
fi

注意:

  1. CREATE_DIRECTORY不需要该变量。
  2. [ -e "${CREATE_COMMAND}" ]被替换为mkdir "${FILEPATH}".

答案3

我真的不明白为什么你不能这样做

dir='/home/Documents/projectDirectory'

if ! mkdir "$dir"; then
    printf 'Something went wrong when trying to create "%s"\n' "$dir" >&2
    exit 1
fi

printf '"%s" created, now doing other things...\n' "$dir"

mkdir如果$dir已经存在,则调用将失败。

如果您需要允许目录存在并且仅在mkdir创建失败时才退出,请添加-pmkdir上面的调用中,或者对目录是否存在进行显式测试:

dir='/home/Documents/projectDirectory'

if [ ! -d "$dir" ]; then
    if ! mkdir "$dir"; then
        printf 'Something went wrong when trying to create "%s"\n' "$dir" >&2
        exit 1
    fi

    printf '"%s" created\n' "$dir"
fi

echo 'now doing other things...'

我在这里使用-d测试来测试是否$dir可能是一个目录。我这样做是因为我认为脚本的其余部分将要求名称不仅仅是存在但它指的是一个实际的目录。


不要尝试将命令存储在变量中,这很少是您需要做的。这不是节省打字时间的好方法。如果您需要在 shell 脚本中以更短的方式执行操作,请为其创建一个 shell 函数。

另外,养成这样的习惯总是双引号你的变量扩展。这样,您的 shell 脚本将始终正确处理包含空格的文件名,并且永远不会意外调用文件名通配。

有关的:


其他事情:

CREATE_DIRECTORY=mkdir $FILEPATH

这将在其环境中$FILEPATH作为命令运行。CREATE_DIRECTORY=mkdir它将失败,因为$FILEPATH它是一个目录(如果存在)或至少不是一个命令。

要创建值中包含空格的变量,请引用该值。

线路

if [ -e "${CREATE_COMMAND}" ]; then

将要不是创建一个目录。它将测试 in 中的值是否$CREATE_COMMAND对应于文件层次结构中的名称。

我不知道是什么,但它可能是简单的and或similar的error_exit简写,对吧?echoexit 1

相关内容