命令前的 Bash 变量赋值

kma*_*729 4 bash environment-variables

前几天我遇到一个命令

AWS_ACCESS_KEY="foo" AWS_SECRET_KEY="bar" aws list iam
Run Code Online (Sandbox Code Playgroud)

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

#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
Run Code Online (Sandbox Code Playgroud)

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

$ dname=$(date +%d_%m_%y) mkdir ${dname} && cd ${dname}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

mkdir: missing operand
Try 'mkdir --help' for more information.
Run Code Online (Sandbox Code Playgroud)

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

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

cod*_*ter 5

Shell 在运行里面的命令之前会替换你的变量$()。您可以使用&&它来让它为您工作:

dname=$(date +%d_%m_%y) && mkdir ${dname} && cd ${dname}
Run Code Online (Sandbox Code Playgroud)

或者,当然:

dname=$(date +%d_%m_%y); mkdir ${dname} && cd ${dname}
Run Code Online (Sandbox Code Playgroud)

但是,如果要获取内部的环境变量,则dname可以使用。mkdir

假设我们有一个脚本test.sh,里面只有一条语句echo $dname。然后:

dname=$(date +%d_%m_%y) ./test.sh
Run Code Online (Sandbox Code Playgroud)

会产生:

07_03_17
Run Code Online (Sandbox Code Playgroud)

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


类似的帖子: