标签: variable-expansion

替换文本中的变量:建议?

我正在寻找一个很好的模板引擎或一小段代码来在Java中的字符串中扩展类似Ant的变量.例:

String result = expand ("${firstName} ${familyName}", map);
Run Code Online (Sandbox Code Playgroud)

它至少应该支持,java.util.Map但是也可以使用能够处理bean或递归查找或查找地图/对象列表的东西.

建议?

[编辑]回复TofuBeer:没有嵌套,只有有效的Java标识符{}.除了之外的任何内容都${}应该逐字复制.$$应该成为$``. If that's not possible ${dollar}应该扩展到单一$(所以你可以表达15.00 $).

java string variable-expansion

2
推荐指数
1
解决办法
1475
查看次数

ipython 变量扩展如何工作?

我不明白${}第四个和第六个提示符在做什么,我找不到任何关于此的文档,这本书Python for Unix and Linux System Administrator有一个类似于第六个提示符中的示例,其中变量不仅是前缀,而且$是也包含在{}以便将字符串嵌入另一个字符串中,如果我引用完整的表达式,它就会起作用,但是 [4 & 6] 中发生了什么?:

In [1]: test = 'TEST TEST TEST!!!'                                                                                          

In [2]: !echo test
test                                                                                                                         

In [3]: !echo $test                                                                                                         
TEST TEST TEST!!!                                                                                                            

In [4]: !echo ${test}   # Don't understand this one.                                                                                                
TEST TEST!!!  

In [5]: !echo {test}                                                                                                       
TEST TEST TEST!!!

In [6]: !echo ${test}TEST!!!   # Nor this one either.
TEST TEST!!!TEST!!!

In [7]: !echo '${test}TEST!!!'
$TEST TEST TEST!!!TEST!!!
Run Code Online (Sandbox Code Playgroud)

ipython variable-expansion

2
推荐指数
1
解决办法
733
查看次数

使用引号"$ {parameter:-word}"参数扩展

${parameter:-word}如果未设置变量,使用参数扩展的形式评估为默认值时,引号的最佳做法是什么?

例如,假设带有-uset 的Bash shell脚本(在计算未定义或未设置的变量时生成错误),以测试变量是否具有值,写入等效的最佳方法是if [[ -z "$FOO" ]]什么?

if [[ -z "${FOO:-}" ]]
Run Code Online (Sandbox Code Playgroud)

要么

if [[ -z ${FOO:-""} ]]
Run Code Online (Sandbox Code Playgroud)

或者是其他东西?

bash shell quotes variable-expansion

2
推荐指数
1
解决办法
231
查看次数

POSIX规范说这是避免歧义所必需的,这意味着什么?

在回复此评论时

现在,我得到了两个“:”是独立的,这就是为什么我找不到关于它们的任何文档的原因。在这种情况下是否需要第一个?

我是第一次在规范中注意到这一段:

在前面显示的参数扩展中,使用格式中的<colon>将导致测试未设置或为null的参数。省略<colon>将导致测试仅未设置的参数。如果参数为“#”并且省略了冒号,则应用程序应确保指定了单词(这是避免字符串长度扩展引起歧义的必要条件)。

我已经在bash参考手册中看到了匹配的解释:

当不执行子字符串扩展时,使用下面描述的形式(例如,“:-”),Bash测试未设置或为null的参数。省略冒号只会对未设置的参数进行测试。换句话说,如果包含冒号,则运算符会测试参数是否存在以及其值是否不为null;如果省略了冒号,则运算符仅测试是否存在。

之前,我了解这些扩展的冒号版本有何区别。

刚才让我感到困惑的是规范中的这句话:

如果参数为“#”并且省略了冒号,则应用程序应确保指定了单词(这是避免字符串长度扩展引起歧义的必要条件)。

我不明白,如果word未指定,这里可能有什么歧义。

没有任何扩展信号在shell变量名称中有效,因此它们可能无法以单字符变量名称开头。如果他们可以然后使用parameterof,#那么在没有冒号的情况下总是模棱两可的,因为您永远无法确定${#+foo}变量的长度foo或对#等的扩展。

我在这里想念什么?需要确保word存在哪些歧义?(我的意思是,没有word参加这种扩张显然没有用,但这不是同一回事。)

bash shell sh variable-expansion

2
推荐指数
1
解决办法
72
查看次数

在expect命令中使用Bash数组变量扩展

这个问题的扩展: Bash:为带空格的字符串添加额外的单引号

将命令参数存储为bash数组后

touch "some file.txt"
file="some file.txt"
# Create an array with two elements; the second element contains whitespace
args=( -name "$file" )
# Expand the array to two separate words; the second word contains whitespace.
find . "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

然后将整个命令存储在一个数组中

finder=( find . "${args[@]}" )
Run Code Online (Sandbox Code Playgroud)

在bash中我可以运行如下命令:

"${finder[@]}"
./some file.txt
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用expect时,我收到了错误

expect -c "spawn \"${finder[@]}\""
missing "
   while executing
"spawn ""
couldn't read file ".": illegal operation on a directory
Run Code Online (Sandbox Code Playgroud)

为什么bash变量扩展不会发生在这里?

bash expect variable-expansion

2
推荐指数
1
解决办法
413
查看次数

为什么这个Bash路径名扩展不会发生?

我正在努力与Bash变量扩展.请参阅以下代码:

~/tmp 689$ a=~/Library/Application\ *; echo $a
/Users/foo/Library/Application *

~/tmp 690$ echo ~/Library/Application\ *
/Users/foo/Library/Application Scripts /Users/foo/Library/Application Support
Run Code Online (Sandbox Code Playgroud)

由于扩展的顺序是brace-> tilde-> parameter - > ....-> pathname,为什么路径名扩展不应用于$a第二个命令中的相同方式?

[添加]

空格逃逸是否隐藏了以下输出的行为?

~/tmp 705$ a=~/Library/Application*; echo $a
/Users/foo/Library/Application Scripts /Users/foo/Library/Application Support
Run Code Online (Sandbox Code Playgroud)

bash variable-expansion pathname

1
推荐指数
1
解决办法
373
查看次数

在传递给 docker run 命令的变量中转义 $

从 makefile 执行命令时,我不知道如何转义美元符号以访问在 docker 环境中定义的变量。

这是我的设置的最小表示,我正在尝试回应 /mypath

define create-test
so-test-$1:
    docker run \
        --rm \
        -t \
        --env SRC="/mypath" \
        ubuntu:xenial \
        /bin/bash -c "$2"
endef


$(eval $(call create-test,1,echo $SRC ))
$(eval $(call create-test,2,echo $$SRC ))
$(eval $(call create-test,3,echo $$$$SRC ))
$(eval $(call create-test,4,echo $$$$$$$$SRC ))
Run Code Online (Sandbox Code Playgroud)

输出是

$ make so-test-1
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo RC "
RC
$ make so-test-2
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo RC "
RC
$ …
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make variable-expansion docker

1
推荐指数
1
解决办法
5915
查看次数

bash中花括号内的感叹号和哈希

我正在尝试理解bash 脚本,但在使用以下行时遇到了问题:

result=${!#}
Run Code Online (Sandbox Code Playgroud)

!这里找到了部分解决方案(内${}):

如果参数的第一个字符是感叹号 (!),则它引入了一个变量间接级别。Bash 使用由参数的其余部分形成的变量的值作为变量的名称;这个变量然后被扩展,并且该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展。

解决方案的另一部分(#${})在这里

参数的扩展值的字符长度被替换。如果参数是“ ”或“@”,则替换的值是位置参数的数量。如果参数是一个以“ ”或“@”下标的数组名称,则替换的值是数组中的元素数。如果参数是一个下标为负数的索引数组名称,则该数字被解释为相对于大于参数的最大索引的一个,因此负索引从数组的末尾开始计数,并且索引 -1 引用最后一个元素。

但我不知道这两个是如何组合成result. 这条线有什么作用?

bash variable-expansion

1
推荐指数
1
解决办法
591
查看次数

使用字典在python中进行变量扩展

我面临以下问题;

我的脚本里面的某个地方我定义了一个函数

def lookup(type, value): 
    doctors = {'doctor1':"Smith", 'doctor2':"Rogers"}
    supervisors = {'super1': "Steve", 'super2': "Annie"}
    print type['value']
Run Code Online (Sandbox Code Playgroud)

我从我的脚本末尾调用这个函数,如下所示:

myDoc = 'super1'
lookup('supervisors', myDoc)
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

TypeError: string indices must be integers, not str
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该如何解决?

谢谢大家!

python dictionary function variable-expansion string-substitution

0
推荐指数
1
解决办法
463
查看次数

如何扩展包含文本和其他变量混合的变量?

我正在编写一个脚本,我需要找到当前用户的桌面文件夹。我希望它与语言无关,所以我发现在 Ubuntu 上,您可以在~/.config/user-dirs.dirs以标记开头的行中找到桌面的路径(独立于系统语言)XDG_DESKTOP_DIR

我可以轻松地使用DESK=$(more ~/.config/user-dirs.dirs | grep "XDG_DESKTOP_DIR" | cut -d '"' -f2)并获取桌面的路径来捕获此信息,但问题是我获取了如下内容:$HOME/Desktop并且我需要扩展 $HOME 变量。

我正在这样做,eval但我知道这是糟糕的编码,所以我决定改变它。

所以基本上我试图扩展包含文本和变量混合的变量内的变量。我想为此提供一个不是针对$HOME变量硬编码的解决方案,因为这不是我第一次发现这个问题。

我已经尝试过${!DESK}${${DESK}}(我可以想象为什么这不起作用),[[ ${escri} ]]以及其他与echo -e.

如果有人能帮助我解决这个问题,我将不胜感激,因为我记得我第一次编写代码时就已经遇到了这个问题,这就是我放弃并使用 wicked 的原因eval

bash shell ubuntu environment-variables variable-expansion

0
推荐指数
1
解决办法
56
查看次数

从bash中的“key1='val1' key2='val2'”字符串中解析变量而不使用eval

我有一个特定于项目的命令,它以以下形式生成输出:

Parameter1='value1' Parameter2='Value2' ... #变量的单引号值。

但我想明确分配该值并需要打印必须显示相应值的参数。

这里xtc_cmd get是项目特定的 cmd

root@renway:~# FOO=`xtc_cmd get lan_ifname lan_ipaddr lan_netmask`
root@renway:~#
root@renway:~# echo $FOO
SYSCFG_lan_ifname='br1' SYSCFG_lan_ipaddr='10.0.0.1' SYSCFG_lan_netmask='255.255.255.0'
root@renway:~#
root@renway:~# echo $SYSCFG_lan_ifname

root@renway:~# echo $SYSCFG_lan_ipaddr

root@renway:~# echo $SYSCFG_lan_netmask
Run Code Online (Sandbox Code Playgroud)

但是,在变量打印它们的值之后,我尝试了“ eval $FOO ”。由于安全原因,我想跳过'eval'。

分享脚本执行的输出:

root@renway:~# /tmp/test.sh
++ xtc_cmd get lan_ifname lan_ipaddr lan_netmask
+ FOO='SYSCFG_lan_ifname='\''br1'\''
SYSCFG_lan_ipaddr='\''10.0.0.1'\''
SYSCFG_lan_netmask='\''255.255.255.0'\'''
+ echo 'SYSCFG_lan_ifname='\''br1'\''' 'SYSCFG_lan_ipaddr='\''10.0.0.1'\''' 'SYSCFG_lan_netmask='\''255.255.255.0'\'''
SYSCFG_lan_ifname='br1' SYSCFG_lan_ipaddr='10.0.0.1' SYSCFG_lan_netmask='255.255.255.0'
Run Code Online (Sandbox Code Playgroud)

如何实际分配值并打印这些变量。

输入感兴趣的字符串

FOO='SYSCFG_lan_ipaddr='\''10.0.0.1'\'' SYSCFG_sysdate='\'''\''$(date>> /tmp/date.txt)0'\'''\'' SYSCFG_lan_pd_interfaces='\''brlan0 brlan19 brlan20'\'''
Run Code Online (Sandbox Code Playgroud)

预期输出:

foo_SYSCFG_lan_ipaddr=10.0.0.1
foo_SYSCFG_sysdate='$(date>> /tmp/date.txt)0' #single quoted value
foo_SYSCFG_lan_pd_interfaces=brlan0 brlan19 brlan20 #whitespace separated string …
Run Code Online (Sandbox Code Playgroud)

linux bash shell variable-expansion single-quotes

0
推荐指数
1
解决办法
165
查看次数

如何在perl系统函数中使用两个管道并防止shell扩展?

如果将多个参数传递给perl的系统函数,则shell扩展将不起作用:

# COMMAND
$ perl -e 'my $s="*"; system("echo", "$s" )'

# RESULT
*
Run Code Online (Sandbox Code Playgroud)

如果命令作为一个参数传递,那么扩展将起作用:

# COMMAND
$ perl -e 'my $s="echo *"; system("$s")'

# RESULT
Desktop Documents Downloads
Run Code Online (Sandbox Code Playgroud)

系统功能还允许使用多个命令并使用管道连接它们.这仅在参数作为一个命令传递时有效:

# COMMAND
$ perl -e 'my $s="echo * | cat -n"; system("$s")'

# RESULT
1 Desktop Documents Downloads
Run Code Online (Sandbox Code Playgroud)

如何组合提到的命令并使用两个管道并防止shell扩展?

我试过了:

# COMMAND
$ perl -e 'my $s="echo"; system("$s", "* | cat -n")'

# RESULT
* | cat -n
Run Code Online (Sandbox Code Playgroud)

但由于我上面描述的原因(多个参数未扩展),这不起作用.我想要的结果是:

1 *
Run Code Online (Sandbox Code Playgroud)

编辑:我实际面临的问题是当我使用以下命令时:

system("echo \"$email_message\" | mailx -s \"$email_subject\" $recipient");
Run Code Online (Sandbox Code Playgroud)

然后扩展$ …

shell perl system pipe variable-expansion

-1
推荐指数
1
解决办法
236
查看次数