我正在写一个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扩展的文档,但还没有找到解决这个问题的方法.我可以知道如何更改代码以获得正确的输出吗?任何帮助将非常感谢.
编辑:语法
我已经通过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)
我有一个场景,我需要将 powershell 路径构建为$RemotePath = '$($env:USERPROFILE)\Desktop\Shell.lnk'. 这个变量被传递到需要执行的远程机器。远程机器将其作为字符串变量接收。如何扩展要评估的字符串$env:USERPROFILE?
当我尝试将参数作为变量传递给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)
为什么会这样?
我经常使用标准的Java属性文件来配置我的Groovy应用程序.我缺少的一个功能是能够将变量用作属性值的一部分,因此可以在使用期间动态扩展它们.我以为我可以使用以下设计提供此功能:
所以,如果我有一个属性文件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) 为了调试我的脚本,我想在每个输出的开头添加内部变量$ 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
我需要构建一个 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) 我有一些逻辑,例如:
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 脚本中发现了这样的片段:
$ echo ${A=3}
Run Code Online (Sandbox Code Playgroud)
现在,我知道如果是“falsy”,${A:=3}则会设置变量,或者如果是“falsy”,则会返回 3 。不过,我从未见过这些类似的不带冒号的表达式,而且我在Bash 文档中找不到这些不带冒号的表达式的解释。AA${A:-3}A
这里发生了什么?
在我的系统上,我有一个/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)