我在shell脚本中有以下代码。一切正常。
#!/bin/bash
baseDirPath = '/stackoverflow/question'
newDir = '/stackoverflow/question/answers'
# first check some business condition
if [[ some condition here ]]
then
# check if base Directory path already exit
if [ -d $baseDirPath ];then
# check if new Directory exits or not, if not create one
if [ ! -d $newDir ];then
mkdir $newDir
if [ $? -ne 0 ] ; then
echo "error occurred while creating directory "
fi
fi
else
exit 1;
fi
fi
这是非常令人困惑的,我觉得代码不是很干净。 我对编程很陌生,所以不确定它是如何干净的。
我很好奇,如果它可以变得更简单,或者有其他方法可以做到这一点。
(上面没有显示完整的shell脚本,只是说明了复杂的if-else部分。)
答案 0 :(得分:4)
#!/bin/bash
die(){ >&2 printf '%s\n' "$@"; exit 1; }
#Can't have spaces here
baseDirPath='/stackoverflow/question'
newDir='/stackoverflow/question/answers'
# first check some business condition
if [ some condition here ]; then
# check if base Directory path already exit
mkdir -p "$newDir" || die 'error occured while creating directory'
fi
这稍微改变了语义 - 如果newDirs
的创建因任何原因失败,它将退出 - baseDirPath
不是目录或baseDirPath
是目录而{{1} }无法创建。
您也可以删除该错误消息。如果由于某种原因失败,newDir
已经在stderr上给你一个错误:
mkdir
如果你的大多数命令都应该像这样工作(即成功或者整个脚本完成),那么你最好设置mkdir -p "$newDir" || exit 1
(当命令以非零返回时退出状态)然后只是做:
set -e
答案 1 :(得分:1)
这可以非常简化:
#!/bin/bash
baseDirPath='/stackoverflow/question'
newDir='/stackoverflow/question/answers'
# first check some business condition
if [[ some condition here ]]; then
if ! mkdir -p "${newDir}"; then
echo "Unable to create directory ${newDir}. Aborting."
exit 1
fi
# Proceed as normal
fi
如果您确实需要存在baseDirPath
,那么肯定会将其添加为条件:
if [[ ! -d "${baseDirPath}" ]] || ! mkdir -p "${newDir}"; then