几天前,我遇到了一个命令
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的同一行动态创建和使用变量?
答案 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}
两者都会给出相同的答案