问题标签 [variable-expansion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
871 浏览

command - 用于构建复杂命令语法的 bash 脚本,先打印然后执行 - 变量扩展问题

我想创建 scipt 以促进从 Hive 生成​​本地文本文件提取。这基本上是执行如下命令:

虽然上面的工作就像一个魅力,但我发现通过参数化的以下脚本(非常简化)实现它非常有问题:

运行时我得到:Exception in thread "main" java.lang.NumberFormatException: For input string: "e"

我知道您可以打印文本或执行命令的方式有很多种。例如,该行echo $SQL打印了我目录中的文件列表:

SELECT file1.txt file2.txt file3.txt file4.txt FROM dropme

而下一个:echo "SQL: $SQL"给出了我想要的:SQL: SELECT * FROM dropme

echo "CMD: $EXTRACMD"打印(几乎)要执行的命令。几乎,正如我\t在 perl 代码中看到的那样:

CMD: hive -e "SET hive.cli.print.header=true;SELECT * FROM dropme"|perl -pe 'BEGIN{if(defined($_=<ARGV>)){s\w+\.//g;print}}s/(?: |^)\KNULL(?= |$)//g'>extract/outbound/dropme.txt

也许这仍然可以,但我想要的是能够将此命令复制并粘贴到(其他)终端并按照我放在顶部的命令执行。理想情况下,我希望该命令完全相同(所以在\t那里)

当我尝试执行它时,我遇到的最大问题是(${EXTRACMD}行)。我收到错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "e"…等等,因为 bash 在这里将每个“单词”都视为单个命令,这与此无关。我假设我什至不知道真正尝试运行的是什么(之前的打印尝试显然没有帮助)

我知道我有多种选择,例如:

  • 转义命令定义字符串中的特殊字符(就像我对双引号所做的那样)
  • 试验 echo 和$VAR,'$VAR'"$VAR"
  • 试验“${EXTRACMD}”或通过评估eval "${EXTRACMD}"
  • 试验shopt -s extglobset -f

但是由于组合的数量非常多,并且以我的小 bash 经验,我觉得最好在这里寻求良好的做法,所以我的问题是:

有没有办法先打印(复杂/复合外壳)命令,然后能够执行它(完全按照打印输出)?在这种情况下,它将从顶部打印确切的命令,然后以与手动将该输出复制到终端提示符并按相同的方式执行它Enter

0 投票
1 回答
1098 浏览

ant - 如何在 Launch4j 配置文件中使用属性扩展

我使用 Launch4j 并将${dist}在其配置中使用一个属性。

当任务和它的参数直接在build.xml文件中时,它可以工作:

然而,Launch4j 可以使用它自己的 xml 配置文件,<launch4jConfig>作为根元素:

在 ant.xml 中:

在 my_launch4j_config.xml 中:

在这种情况下,${dist}没有扩展,也没有%dist%我尝试过的所有内容......是否存在使用 launch4j 配置文件中的属性的解决方案?

0 投票
2 回答
258 浏览

bash - 防止`~`的扩展

我有一个脚本,它与远程主机同步一些文件。我要发出的命令的形式是

我的脚本如下所示:

但是~总是被扩展,事实上我调用了命令

而不是上面那个。但是主目录的路径在本地不一定与服务器上的相同。我可以使用 egsed来替换这部分,但是对于具有所有不同路径的多个服务器执行此操作非常繁琐。有没有一种方法可以~在脚本运行时不扩展它的情况下使用,但仍然rsync理解主目录的含义~

0 投票
2 回答
1453 浏览

bash - 如何强制 bash 对字符串进行变量扩展?

我已经从文件中读取了一行 bash 代码,我想将它发送到日志中。为了使它更有用,我想发送该行的可变扩展版本。

我只想扩展 shell 变量。我不想解释管道,也不想产生任何副进程,比如用$( rm -r /).

我知道变量扩展深深地融入了 bash。我希望有一种方法可以执行扩展,而不会产生任何副作用,这将来自管道、外部程序和——也许——here-documents。

也许有类似的东西eval

我想要一种仅扩展 shell 变量的方法。如果x=aa="example"那么我想要以下扩展:

echo $x应该是echo a

echo ${a}应该echo example

touch ${!x}.txt应该touch example.txt

if [ (( ${#a} - 6 )) -gt 10 ]; then echo "Too long string"应该if [ 1 -gt 10 ]; then echo "Too long string"

echo "\$a and \$x">/dev/null应该echo "\$a and \$x>dev/null"

0 投票
2 回答
316 浏览

for-loop - cmd for loop mass 再次重命名 oneliner

我对此感到头疼-已经花了太多时间搜索-显然我不了解CMD变量等的基础知识-它总是让我头疼

为什么这行不通?

for %a in (*) do ( set tmpx=%a & echo %tmpx% )

上面的代码在其他范围内输出 %tmpx% 的值 - 它始终是常量

是的,我运行 setlocal ENABLEDELAYEDEXPANSION

基本上我需要将文件夹中的所有文件从constantstring_somenameXX.tif简单重命名为somenameXX.tif,即constantstring=0000000005

我不得不使用 set 因为其他帖子正确地表明 for 循环中的 %a 具有特殊行为,并且替换不会照原样工作。

我宁愿不使用脚本和/或 powershell - 除非不使用它们是不可能的

谢谢你

0 投票
2 回答
2768 浏览

powershell - 展开通过 Powershell 中的单引号存储的字符串变量

我有一个场景,我需要将 powershell 路径构建为$RemotePath = '$($env:USERPROFILE)\Desktop\Shell.lnk'. 该变量被传递到需要执行的远程机器。远程机器将其作为字符串变量接收。如何扩展字符串以进行评估$env:USERPROFILE

0 投票
1 回答
518 浏览

bash - 为什么这个 Bash 路径名扩展没有发生?

我正在为 Bash 变量扩展而苦苦挣扎。请看以下代码:

由于扩展的顺序是大括号->波浪号->参数->....->路径名,为什么路径名扩展不像$a第二个命令那样适用?

[添加]

空格转义是否对以下输出有隐藏行为?

0 投票
1 回答
59 浏览

java - 如何通过字符串访问(声明/赋值/获取值)变量?

如何在 Java 中使用字符串指定名称?

有什么可能的方法我可以做这样的事情吗?

0 投票
1 回答
279 浏览

sql - 使用 PERL 的 SQL 方言翻译

我有一个紧急工作,要在 PostGre 和 Amazon 的 RedShift 上工作的 SQL 产品,并将其移植到 Oracle 上工作。(请注意,“工作”目前并不意味着“最佳”,而是“正确”。)

我们所有的表都是使用 ORM (DBI) 定义的,但我们所有的视图当前都存储为内联 SQL。

我希望有一种相对简单的方法来运行以一种通用的方式封装 SQL,并使用一些现有的工具将其转换为特定方言的 SQL。


简单的例子:

  • SELECT CAST(x AS DECIMAL(16,4)) AS foo FROM bah
    =>
  • SELECT CAST(x AS NUMBER(16,4)) AS foo FROM bah

那很简单。我们在部署时有一个“查找和替换阶段”。SQL 存储为CAST(x AS #DECIMAL#(16,4)),然后我们#DECIMAL#根据部署到的方言替换为新字符串。


令人沮丧的例子:

  • SELECT x % y AS modulo FROM foo
    =>
  • SELECT MOD(x, y) AS modulo FROM foo

和...

  • SELECT x / y AS int_div FROM foo
    =>
  • SELECT trunc(x / y) AS int_div FROM foo


我不是 PERL 专家,所以我正在寻找有关如何进行某种宏扩展的指针。
- SQL 将与字符串中的某种宏表达式一起存储
- 将使用包括“dialect”和“sql”在内的参数调用“处理器”
- “dialect”参数将指示宏扩展的输出

无方言 SQL:SELECT #DIV(x,y)# AS z FROM foo

方言:RedShift
输出:SELECT x / y AS z FROM foo

方言:Oracle11g
输出:SELECT floor(x / y) AS z FROM foo


它需要处理子查询等:

无方言 SQL:SELECT #MOD(x, (SELECT MAX(y) FROM bah))# AS z FROM foo

方言:RedShift
输出:SELECT x % (SELECT MAX(y) FROM bah) AS z FROM foo

方言:Oracle11g
输出:SELECT mod(x, (SELECT MAX(y) FROM bah)) AS z FROM foo


或者任何用于存储“通用”SQL 并能够将其转换为“特定方言”SQL 的可靠方法。

0 投票
3 回答
1441 浏览

bash - 从 xargs 获取原始返回值或模拟 xargs

我正在使用 bash。我有一个包含Java 程序命令行参数的文件F,我需要存储Java 程序的两个输出,即标准输出的输出和退出值。存储标准输出通过

但是 xargs 不允许访问 Java 程序的退出代码。好吧,我拆分它,运行程序两次,一次用于标准输出,一次用于退出代码 --- 但是获取退出代码并正确运行它似乎是不可能的。一个人可能会尝试

但如果 F 包含例如“”,即程序的一个命令行参数,它是一个空格,则这不起作用。问题是参数 $(cat F) 的扩展。

现在我没有办法解决这个问题?我不想要“$(cat F)”,因为我希望 $(cat F) 扩展为许多字符串 --- 但我不希望进一步扩展这些字符串。

另一方面,如果有更好的 xargs,可以访问原始退出值,那将解决问题,但我不知道这一点。