命令之前的Bash变量赋值

时间:2017-03-07 20:48:52

标签: bash environment-variables

几天前,我遇到了一个命令

AWS_ACCESS_KEY="foo" AWS_SECRET_KEY="bar" aws list iam

我看到在命令之前设置变量会在命令的环境中添加这些变量:

#make sure there is no environment variable "foo"
$ echo $foo

#mimic-ing above command
$ foo=bar printenv | grep foo
foo=bar

#or trying from python environment
$foo=bar python -c "import os; print(os.getenv('foo', None))"
bar

#foo is destroyed now
$ echo $foo  
#<<NOTHING

我试图使用这个技巧根据今天的日期动态创建一个新目录:

$ dname=$(date +%d_%m_%y) mkdir ${dname} && cd ${dname}

但我收到了以下错误:

mkdir: missing operand
Try 'mkdir --help' for more information.

即。 dname=$(date +%d_%m_%y) echo $dname返回空!

我做错了什么?如何在bash的同一行动态创建和使用变量?

2 个答案:

答案 0 :(得分:3)

$()内运行命令之前,Shell正在替换您的变量。您可以使用&&使其适用于您:

dname=$(date +%d_%m_%y) && mkdir ${dname} && cd ${dname}

或者,当然:

dname=$(date +%d_%m_%y); mkdir ${dname} && cd ${dname}

但是,dname可以mkdir用于获取内部的环境变量。

假设我们有一个脚本test.sh,里面有一个声明echo $dname。然后:

dname=$(date +%d_%m_%y) ./test.sh

会产生:

07_03_17

这与您的aws命令行的工作方式一致。

类似帖子:

答案 1 :(得分:0)

在下面的mkdir是您想要的完整陈述之前,您缺少&&

dname=$(date +%d_%m_%y) && mkdir ${dname} && cd ${dname}

此外,如果没有必要声明dname你可以这样做: mkdir $(date +%d_%m_%y) && cd ${dname}两者都会给出相同的答案