标签: variable-expansion

Shell参数扩展:如何在没有目录部分的情况下获取文件名?

我正在写一个makefile,并假设我有以下内容;

FILES = file1.py \
    folder1/file2.py \
    folder2/file3.py
Run Code Online (Sandbox Code Playgroud)

我有以下for循环:

    -@for file in $(FILES); do \
           echo $${file/folder1\/}; \
    done
Run Code Online (Sandbox Code Playgroud)

以上将打印:

file1.py
file2.py
folder2/file3.py
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

file1.py
file2.py
file3.py
Run Code Online (Sandbox Code Playgroud)

我查看了一些关于shell扩展的文档,但还没有找到解决这个问题的方法.我可以知道如何更改代码以获得正确的输出吗?任何帮助将非常感谢.

编辑:语法

shell makefile variable-expansion

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

在subst命令中删除Trailing \

我已经通过HKCR\Drive\shell\MapLocalDriveHere \命令中的注册表向我的上下文菜单添加了一个命令,这样当我右键单击一个驱动器时.我希望它能给我一个右键单击的驱动器名称"C:"而不是"C:\",因为这会导致我正在尝试运行的命令出现问题.

cmd /c subst %1 /D
Run Code Online (Sandbox Code Playgroud)

这扩展到:

cmd /c subst C:\ /D
Run Code Online (Sandbox Code Playgroud)

命令失败(它预期subst C: /D).如何在没有尾随\的情况下获取参数,或者将其删除?%~d1并且%~1不要从注册表项扩展,键入REG_EXPAND_SZ.

您可以通过查看位于https://github.com/Ehryk/ContextMenuTools的项目来源(尤其是此文件:https://github.com/Ehryk/ContextMenuTools/blob)更好地了解我正在尝试做的事情./master/Custom%20Installs/Map%20Local%20Drive%20Here/MapLocalDriveHere.inf)

windows batch-file variable-expansion

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

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

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

powershell remote-execution variable-expansion

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

Bash:为带空格的字符串添加额外的单引号

当我尝试将参数作为变量传递给bash中的任何命令时,如果变量值有空格,我可以看到由bash添加的额外引号.

我正在创建一个文件"some file.txt"并将其添加到变量$ file.我使用$ file并将其存储在另一个变量$ arg中,并在$ file上加引号.我希望通过bash进行可变扩展后的命令是

find . -name "some text.txt"
Run Code Online (Sandbox Code Playgroud)

但我收到错误,实际执行的文件是,

find . -name '"some' 'file.txt"
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?在这种情况下,bash变量expanson如何工作?

$ touch "some file.txt"
$ file="some file.txt"
$ arg=" -name \"$file\""

$ find . $arg
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

$ set -x
$ find . $arg
+ find . -name '"some' 'file.txt"'
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

bash variable-expansion

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

使用Groovy在Java属性中进行变量扩展

我经常使用标准的Java属性文件来配置我的Groovy应用程序.我缺少的一个功能是能够将变量用作属性值的一部分,因此可以在使用期间动态扩展它们.我以为我可以使用以下设计提供此功能:

  1. 使用特殊格式注释应扩展的属性.我选择将这些模板包含在双惊叹号(!!)中.这些属性值本质上是一个用局部变量扩展的模板
  2. 在使用应用程序中的属性之前,使用groovy'alcome'方法在模板中展开应用程序变量
  3. 使用前将原始属性键重新分配给新值

所以,如果我有一个属性文件config.properties,其属性如下:

version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!
Run Code Online (Sandbox Code Playgroud)

local_lib属性将从扩大GROOVY_HOME环境变量和版本属性值.

在我的应用程序中,我将其编码如下:

//Load the environment variables and configuration file
env=System.getenv()
configFile=new File('config.properties')
configProps= new Properties()
configProps.load(configFile.newDataInputStream())

//Replace configuration property values with their expanded equivalent
configProps.each{
  //if a property value is a template we evaluate it
  if (it.value.startsWith('!!')){
    valTemplate=it.value.replace('!!','"')
    it.value=evaluate(valTemplate)
  }
}

 //then we use the expanded property values 
Run Code Online (Sandbox Code Playgroud)

这似乎有效.当我做

println configProps
Run Code Online (Sandbox Code Playgroud)

我看到该值被扩展而不是null

但是,展开属性的getProperty方法返回null.

assert configProps.getProperty('local_lib')=='C:\\DEVTOOLS\\groovy-2.4.7/2.3/lib'
   |           |                       |
   |           null                    false
   [local_lib:C:\DEVTOOLS\groovy-2.4.7/2.3/lib, version:2.3] …
Run Code Online (Sandbox Code Playgroud)

java groovy variable-expansion properties-file

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

在Bash中,有没有办法用双引号扩展变量两次?

为了调试我的脚本,我想在每个输出的开头添加内部变量$ FUNCNAME和$ LINENO,所以我知道输出发生在哪个函数和行号上.

foo(){
    local bar="something"
    echo "$FUNCNAME $LINENO: I just set bar to $bar"
}
Run Code Online (Sandbox Code Playgroud)

但是由于会有很多调试输出,如果我可以执行以下操作,它会更清晰:

foo(){
    local trace='$FUNCNAME $LINENO'
    local bar="something"
    echo "$trace: I just set bar to $bar"
}
Run Code Online (Sandbox Code Playgroud)

但上面的字面输出:"$ FUNCNAME $ LINENO:我只是设置了一些东西"我认为这样做是因为双引号只扩展了一次内部的变量.

是否有一种语法上干净的方法在同一行中扩展变量两次?

linux bash parameter-passing variable-expansion parameter-expansion

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

单引号字符串中的 Powershell 变量扩展


我需要构建一个 JSON 变量,其中包含另一个 JSON 格式的内容,该内容应格式化为字符串。我将内部 JSON 放入单引号中,这样它就不会与外部 JSON 一起被解析。内部 JSON 包含一个应该扩展的变量。不幸的是,单引号阻止了这一点。
例子:

$link = "http://www.google.de"
$event = @{
   var1 = "sys"
   var2 = "yadda"
   inner_json = '"System": {"link":"$link"}}'
}
$json = $event | ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)

变量 $inner_json 必须作为字符串嵌入。有没有办法强制在单引号内扩展 $link ?还有其他想法如何解决这个问题吗?任何帮助表示赞赏。
编辑:我期待这样的inner_json:

{"var1":"sys", "var2":"yadda", "inner_json": "{\"System\": {\"link\":\"google.de\"}}"}
Run Code Online (Sandbox Code Playgroud)

powershell json variable-expansion single-quotes

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

仅当设置了值时才扩展为标志

我有一些逻辑,例如:

if [[ -n "$SSH_CLIENT" ]]
then
    sflag="-s $(echo "$SSH_CLIENT" | awk '{ print $1}')"
else
    sflag=''
fi

iptables -A MY_RULE "$sflag" -p tcp -m tcp --dport 9999 -m conntrack -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

换句话说,我想模仿仅将-s标志传递给iptablesifSSH_CLIENT已设置。实际发生的情况是无意中传递了空字符串。

我感兴趣的是是否有可能,为了不重复两个相当长的iptables调用,扩展标志name 和 value。例如上面的命令应该扩展为

  • iptables -A MY_RULE -s 10.10.10.10 -p tcp -m tcp ..., 或者
  • iptables -A MY_RULE -p tcp -m tcp ...

问题是在第二种情况下,展开实际上变成:

iptables -A MY_RULE '' -p tcp -m tcp
Run Code Online (Sandbox Code Playgroud)

并且有一个额外的空字符串被视为位置参数。我怎样才能正确地实现这一目标?

bash sh variable-expansion

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

bash 参数扩展中不带冒号的等号/减号

我最近在 Bash 脚本中发现了这样的片段:

$ echo ${A=3}
Run Code Online (Sandbox Code Playgroud)

现在,我知道如果是“falsy”,${A:=3}则会设置变量,或者如果是“falsy”,则会返回 3 。不过,我从未见过这些类似的不带冒号的表达式,而且我在Bash 文档中找不到这些不带冒号的表达式的解释。AA${A:-3}A

这里发生了什么?

bash environment-variables variable-expansion

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

在文本文件中使用整数算术扩展 C 预处理器宏?

在我的系统上,我有一个/usr/include目录,curl/options.h其中有一个文件,其中包含 CURLOT_FLAG_ALIAS 的预处理器定义。

如果我有以下 test.txt:

#include "curl/options.h"

curlot flag alias is: CURLOT_FLAG_ALIAS
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做来扩展文本文件中的宏:

$ gcc -E -P -x c -I/usr/include test.txt
typedef enum {
  CURLOT_LONG,
  CURLOT_VALUES,
  CURLOT_OFF_T,
  CURLOT_OBJECT,
  CURLOT_STRING,
  CURLOT_SLIST,
  CURLOT_CBPTR,
  CURLOT_BLOB,
  CURLOT_FUNCTION
} curl_easytype;
struct curl_easyoption {
  const char *name;
  CURLoption id;
  curl_easytype type;
  unsigned int flags;
};
CURL_EXTERN const struct curl_easyoption *
curl_easy_option_by_name(const char *name);
CURL_EXTERN const struct curl_easyoption *
curl_easy_option_by_id(CURLoption id);
CURL_EXTERN const struct curl_easyoption *
curl_easy_option_next(const struct curl_easyoption *prev);
curlot flag alias …
Run Code Online (Sandbox Code Playgroud)

c macros variable-expansion c-preprocessor

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