linux-如何在bash -c命令中插入变量

“ bash”命令启动一个子进程,其父进程是您当前的bash会话.

要在父进程中定义变量并在子进程中使用它,必须将其导出.

先看一个简单例子:
$FOO="text"
$echo $FOO
$text

$FOO="text"
$bash -c 'echo $FOO'
$# return nothing


$export FOO="text"
$bash -c 'echo $FOO'

要点:
1、 Subshells will have access to all variables from the parent, regardless of their exported state.
2、 Subprocesses will only see the exported variables.
What is common in these two constructs is that neither can pass variables back to the parent shell.
看下面的例子。
$ noexport=noexport; export export=export; (echo subshell: $noexport $export; subshell=subshell); bash -c 'echo subprocess: $noexport $export; subprocess=subprocess'; echo parent: $subshell $subprocess
subshell: noexport export
subprocess: export
parent:
$ noexport=noexport; export export=export; exec bash -c 'echo execd process: $noexport $export; execd=execd'; echo parent: $execd
execd process: export

上面解释的很清楚了,再来看下面的一个例子和解释:
如果我们创建一个普通变量和一个数组变量,
a=apple # a simple variable
arr=(apple) # an indexed array with a single element

and then echo the expression in the second column, we would get the result / behavior shown in the third column. The fourth column explains the behavior.

| Expression | Result(echo) | Comments

---+-------------+-------------+--------------------------------------------------------------------
1 | "$a" | apple | variables are expanded inside ""
2 | '$a' | $a | variables are not expanded inside ''
3 | "'$a'" | 'apple' | '' has no special meaning inside ""
4 | '"$a"' | "$a" | "" is treated literally inside ''
5 | ''' | invalid | can not escape a ' within ''; use "'" or $''' (ANSI-C quoting)
6 | "red$arocks"| red | $arocks does not expand $a; use ${a}rocks to preserve $a
7 | "redapple$" | redapple$ | $ followed by no variable name evaluates to $
8 | '"' | " | \ has no special meaning inside ''
9 | "'" | ' | ' is interpreted inside "" but has no significance for '
10 | """ | " | " is interpreted inside ""
11 | "*" | * | glob does not work inside "" or ''
12 | "\t\n" | \t\n | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting
13 | "echo hi" | hi | and $() are evaluated inside "" 14 | '`echo hi`' | `echo hi` | and $() are not evaluated inside ''
15 | '${arr[0]}' | ${arr[0]} | array access not possible inside ''
16 | "${arr[0]}" | apple | array access works inside ""
17 | $'$a'' | $a' | single quotes can be escaped inside ANSI-C quoting
18 | "$'\t'" | $'\t' | ANSI-C quoting is not interpreted inside ""
19 | '!cmd' | !cmd | history expansion character '!' is ignored inside ''
20 | "!cmd" | cmd args | expands to the most recent command matching "cmd"
21 | $'!cmd' | !cmd | history expansion character '!' is ignored inside ANSI-C quotes
---+-------------+-------------+--------------------------------------------------------------------

posted @ 2020-04-28 14:28  taowang2016  阅读(2565)  评论(0编辑  收藏  举报