我正在寻找一个很好的模板引擎或一小段代码来在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 $).
我不明白${}第四个和第六个提示符在做什么,我找不到任何关于此的文档,这本书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) ${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)
或者是其他东西?
在回复此评论时:
现在,我得到了两个“:”是独立的,这就是为什么我找不到关于它们的任何文档的原因。在这种情况下是否需要第一个?
我是第一次在规范中注意到这一段:
在前面显示的参数扩展中,使用格式中的<colon>将导致测试未设置或为null的参数。省略<colon>将导致测试仅未设置的参数。如果参数为“#”并且省略了冒号,则应用程序应确保指定了单词(这是避免字符串长度扩展引起歧义的必要条件)。
我已经在bash参考手册中看到了匹配的解释:
当不执行子字符串扩展时,使用下面描述的形式(例如,“:-”),Bash测试未设置或为null的参数。省略冒号只会对未设置的参数进行测试。换句话说,如果包含冒号,则运算符会测试参数是否存在以及其值是否不为null;如果省略了冒号,则运算符仅测试是否存在。
之前,我了解这些扩展的冒号版本有何区别。
刚才让我感到困惑的是规范中的这句话:
如果参数为“#”并且省略了冒号,则应用程序应确保指定了单词(这是避免字符串长度扩展引起歧义的必要条件)。
我不明白,如果word未指定,这里可能有什么歧义。
没有任何扩展信号在shell变量名称中有效,因此它们可能无法以单字符变量名称开头。如果他们可以然后使用parameterof,#那么在没有冒号的情况下总是模棱两可的,因为您永远无法确定${#+foo}变量的长度foo或对#等的扩展。
我在这里想念什么?需要确保word存在哪些歧义?(我的意思是,没有word参加这种扩张显然没有用,但这不是同一回事。)
这个问题的扩展: 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变量扩展.请参阅以下代码:
~/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) 从 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) 我正在尝试理解bash 脚本,但在使用以下行时遇到了问题:
result=${!#}
Run Code Online (Sandbox Code Playgroud)
我!在这里找到了部分解决方案(内${}):
如果参数的第一个字符是感叹号 (!),则它引入了一个变量间接级别。Bash 使用由参数的其余部分形成的变量的值作为变量的名称;这个变量然后被扩展,并且该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展。
解决方案的另一部分(#内${})在这里:
参数的扩展值的字符长度被替换。如果参数是“ ”或“@”,则替换的值是位置参数的数量。如果参数是一个以“ ”或“@”下标的数组名称,则替换的值是数组中的元素数。如果参数是一个下标为负数的索引数组名称,则该数字被解释为相对于大于参数的最大索引的一个,因此负索引从数组的末尾开始计数,并且索引 -1 引用最后一个元素。
但我不知道这两个是如何组合成result. 这条线有什么作用?
我面临以下问题;
我的脚本里面的某个地方我定义了一个函数
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
我正在编写一个脚本,我需要找到当前用户的桌面文件夹。我希望它与语言无关,所以我发现在 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。
我有一个特定于项目的命令,它以以下形式生成输出:
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) 如果将多个参数传递给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)
然后扩展$ …