在" export var =`echo $ {var1} / ...`"?

时间:2018-01-19 20:21:53

标签: linux bash shell

此查询涉及如何在环境设置文件viz environment_var.sh中声明Linux中的环境变量。这个文件有一堆导出命令(如下所示) -

echo "Input Variable: "$1
if [ $1 = "value1" ]; then
variable1=""
else
variable1=$1
fi  

export variable2=app_name${variable1}.subcategory2
export variable3=`echo ${variable1}/subfolder1/`

我的查询与第二个导出语句有关,其中echo已用于变量3.是否有任何特定原因使用echo或者它是否已声明如下,而无需使用反引号和回声 -

export variable3=${variable1}/subfolder1/

感谢您在这方面的投入。

1 个答案:

答案 0 :(得分:3)

echo 比无用更糟糕。对于echo,您的目录名称受路径名扩展分词的约束。

例如,考虑一个包含这些子目录的目录:

$ find . -name 'subfolder1'
./dir1/subfolder1
./dir*/subfolder1
./dir2/subfolder1

现在,让我们用echo执行命令:

$ var1='dir*'
$ var3=`echo ${var1}/subfolder1/`

要显示var3的精确值,请使用declare -p

$ declare -p var3
declare -- var3="dir1/subfolder1/ dir2/subfolder1/ dir*/subfolder1/"

由于路径名扩展var3会因人们的期望而改变。

现在,让我们在没有echo的情况下再试一次:

$ var1='dir*'
$ var3=${var1}/subfolder1/
$ declare -p var3
declare -- var3="dir*/subfolder1/"

在这种情况下,没有执行路径名扩展,而var3正是我们指定的那样。

结论:除非您明确要路径名扩展分词,否则请勿使用echo表单。 < / p>

正如Charles Duffy指出的那样,如果您确实需要路径名扩展,那么您可能还想使用数组,而不是echo。观察:

$ var1='dir*'
$ arr3=(${var1}/subfolder1/)
$ declare -p arr3
declare -a arr3=([0]="dir1/subfolder1/" [1]="dir2/subfolder1/" [2]="dir*/subfolder1/")

此处,所有三个目录名称都正确显示为arr3中的单独条目。

echo

还有更多问题

使用bash,观察:

$ var1='-n dir'
$ var3=`echo ${var1}/subfolder1/`
$ declare -p var3
declare -- var3="dir/subfolder1/"

在这种情况下,我们将var1分配给了-n dir,但在var3中,-n消失了。这是因为它被解释为不是要打印的参数,而是echoecho的一个选项。