我正在尝试创建一个测试,而逻辑是
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
:- 由于 周围没有引号
mkdir $FILEPATH
,CREATE_DIRECTORY
因此仅保留mkdir
其值。 $FILEPATH
是分词的主题。- 如果这种扩展的第一个标记是外部命令,则可以将变量
CREATE_DIRECTORY
导出到所得到的扩展的环境。$FILEPATH
- 由于 周围没有引号
[ -e "${CREATE_COMMAND}" ]
:CREATE_COMMAND
据我们所知,该变量没有任何值。我猜你是想写CREATE_DIRECTORY
。- 它不测试是否
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
注意:
CREATE_DIRECTORY
不需要该变量。[ -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
创建失败时才退出,请添加-p
到mkdir
上面的调用中,或者对目录是否存在进行显式测试:
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
简写,对吧?echo
exit 1