简化bash代码

时间:2015-11-13 18:06:22

标签: linux bash shell

我在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部分。)

2 个答案:

答案 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