得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

shell 那个 eval

有个东西叫复杂变量,一次搞不定,需要两次才能搞定的变量就很复杂,所以就叫它复杂变量

那复杂变量要怎么被使用呢?看下文的例子

例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 现在有一堆输入,想要获取到最后一个输入
$ set 1 3 5 6

# 如果知道有几个输入,那事情就变得简单了
$ echo $4
6

# 可是如果并不知道有多少个输入呢?写个循环?想要知道输入了几个很简单吧
$ echo $#
4
# 如果可以直接使用这个 $# 事情是不是就变得简单多了
$ echo $$#
6178# # 这是啥?
$ echo ${$#}
6178 # 这又是啥?
$ echo ${${#}}
bash: ${${#}}: bad substitution # 居然报错了
$ echo \$$#
$4 # 要是可以再 echo 一次是不是就可以了
$ echo $(echo $#)
4 # 这不应该是 6 吗?

# 让 eval 来
$ eval echo \$$#
6 # 可以了

例2:

1
2
3
4
5
6
7
8
9
10
11
$ $( echo VAR=value )
bash: VAR=value: command not found
$ echo $VAR # 什么都没有
$ eval $( echo VAR=value ) # 没有报错
$ echo $VAR
value # 居然还赋值成功了
$ eval echo VAR=value
VAR=value
# 那么 eval $( echo VAR=value ) 是怎么执行的呢?
# $( echo VAR=value ) output: VAR=value
# eval VAR=value 变量赋值

语法:eval cmdLine

eval 会对后面的 cmdLine 进行两遍扫描,如果第一遍扫描后,cmdLine 是个普通命令,则执行此命令;如果 cmdLine 中含有变量的间接引用,则保证间接引用的语义

be yourself, everyone else is already taken.