shell脚本中的变量赋值

时间:2014-11-07 13:48:35

标签: shell variable-assignment

我们的目录结构类似于

/long/dir/name/bin/exec.sh
/long/dir/name/logs
/long/dir/name/input
/long/dir/name/output.

在exec.sh中我想检索根目录(在这种情况下为/long/dir/name),将其存储在变量中,以便我可以使用它来引用$DIR/output$DIR/input等。

我到[exec.sh]:

#!/bin/sh
export DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" | sed -e 's,/*[^/]\+/*$,,'
echo "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" | sed -e 's,/*[^/]\+/*$,,'
echo "My Dir: '$DIR'"

输出:

/long/dir/name   <-- Which is what I want
My Dir: ''

将它分配给DIR变量时会出现什么问题?

2 个答案:

答案 0 :(得分:3)

回答&#34;出了什么问题&#34;问题

您将管道粘贴到<{1}} 外部子区域以进行分配(从技术上讲,sed不是一项调用export var=...的分配(请参阅ksh get exit status in assignment作为示例)。

无论如何,第一行发生的事情就是shell看到

export export DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |

(注意管道周围的空白)。并且管道在子shell中执行,因此您的sed -e 's,/*[^/]\+/*$,,'发生在su-shell中,然后丢失。

export粘贴在子shell中,然后解决问题。

sed

答案 1 :(得分:2)

我想你想要这个:

DIR=${BASH_SOURCE%/*/*}

也就是说,从脚本自己的路径中删除最后两个路径部分,并使用它。如果您需要获得规范路径,请通过realpathreadlink -f运行。