Linux 简化bash代码

Linux 简化bash代码,linux,bash,shell,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 [

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

这稍微改变了语义——如果由于任何原因,
newDirs
的创建失败,
baseDirPath
不是目录,或者
baseDirPath
是目录,并且无法创建
newDir
,则会退出

您可能也可以删除该错误消息
mkdir
如果由于某种原因失败,则会在stderr上显示错误:

mkdir -p "$newDir" || exit 1
如果大多数命令都是这样工作的(即,要么成功,要么关闭整个脚本),那么最好设置
set-e
(~exit,当命令以非零状态返回时),然后执行以下操作:

mkdir -p "$newDir"
这稍微改变了语义——如果由于任何原因,
newDirs
的创建失败,
baseDirPath
不是目录,或者
baseDirPath
是目录,并且无法创建
newDir
,则会退出

您可能也可以删除该错误消息
mkdir
如果由于某种原因失败,则会在stderr上显示错误:

mkdir -p "$newDir" || exit 1
如果大多数命令都是这样工作的(即,要么成功,要么关闭整个脚本),那么最好设置
set-e
(~exit,当命令以非零状态返回时),然后执行以下操作:

mkdir -p "$newDir"

这可以完全简化:

#!/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

这可以完全简化:

#!/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

仅供参考,shell脚本不一定是perl脚本。这个特定的shell脚本是bash,如顶部的shebang(the
#!
)所示。Perl是一种独立的编程语言,看起来与bash脚本类似,但功能更强大、功能更全面。正如@mwp所指出的,这不是Perl。我修改了标题以反映这一点,并做了一些其他编辑以修复代码格式和语法。如果您不喜欢我所做的,请随意选择或回滚(以及编辑页面上的选项)。您的意思是没有空格的
baseDirPath='/stackoverflow/question'
?如果等号周围有空格,那么赋值就不起作用。另外,在这里提问之前,请先把它通读一遍……不过,一般来说,有关代码的堆栈溢出问题需要特定的问题或错误,以及产生该问题的最小复制器。这不符合条件。仅供参考,shell脚本不一定是perl脚本。这个特定的shell脚本是bash,如顶部的shebang(the
#!
)所示。Perl是一种独立的编程语言,看起来与bash脚本类似,但功能更强大、功能更全面。正如@mwp所指出的,这不是Perl。我修改了标题以反映这一点,并做了一些其他编辑以修复代码格式和语法。如果您不喜欢我所做的,请随意选择或回滚(以及编辑页面上的选项)。您的意思是没有空格的
baseDirPath='/stackoverflow/question'
?如果等号周围有空格,那么赋值就不起作用。另外,在这里提问之前,请先把它通读一遍……不过,一般来说,有关代码的堆栈溢出问题需要特定的问题或错误,以及产生该问题的最小复制器。这不符合条件。为什么要用花括号?这些扩展都没有被参数化,而且在任何情况下都不会消除变量名的歧义;这也意味着我在将变量嵌入其他文本时不必做任何事情(例如,
${varname}\u ext
,它在语义上不同于
$varname\u ext
)。由于始终使用卷曲比异常更符合规则,因此它使语法更加一致。这也是为什么我总是使用
[[]]
对,即使
[]
在技术上可以工作。为什么要用花括号?这些扩展都没有被参数化,而且在任何情况下都不会消除变量名的歧义;这也意味着我在将变量嵌入其他文本时不必做任何事情(例如,
${varname}\u ext
,它在语义上不同于
$varname\u ext
)。由于始终使用卷曲比异常更符合规则,因此它使语法更加一致。这也是我总是使用
[[]]
对的原因,即使
[]
在技术上可以工作。