标签: expansion

Base64:空间使用量增幅最大的是什么?

如果服务器收到base64字符串并希望在转换之前检查它的长度,那么它说它总是允许最终字节数组为16KB.转换为Base64字符串时,可能会有多大的16KB字节数组(假设每个字符一个字节)?

base64 expansion

156
推荐指数
4
解决办法
8万
查看次数

为什么shell忽略通过变量传递给它的参数中的引号?

这与宣传的一样:

# example 1
#!/bin/bash
grep -ir 'hello world' .
Run Code Online (Sandbox Code Playgroud)

这不是:

# example 2
#!/bin/bash
argumentString="-ir 'hello world'"
grep $argumentString .
Run Code Online (Sandbox Code Playgroud)

尽管'hello world'在第二个例子中被引号括起来,但grep解释'hello为一个参数和world'另一个参数,这意味着,在这种情况下,'hello将是搜索模式world'并将成为搜索路径.

同样,这仅在从argumentString变量扩展参数时发生.grep 'hello world'在第一个示例中正确解释为单个参数.

谁能解释为什么会这样?有没有一种正确的方法来扩展一个字符串变量,它将保留每个字符的语法,以便shell命令正确解释它?

variables syntax bash quoting expansion

33
推荐指数
3
解决办法
6094
查看次数

C预处理器宏是否可以包含预处理程序指令?

我想做相同的以下内容:

#define print_max(TYPE) \
#  ifdef TYPE##_MAX \
     printf("%lld\n", TYPE##_MAX); \
#  endif

print_max(INT);
Run Code Online (Sandbox Code Playgroud)

现在#ifdef,就我在函数宏中看到的那样,不允许使用任何嵌套的预处理程序指令.有任何想法吗?

更新:所以看起来这是不可能的.即使是在运行时检查的黑客也无法实现.所以我想我会选择以下内容:

#ifndef BLAH_MAX
#  define BLAH_MAX 0
#endif
# etc... for each type I'm interested in

#define print_max(TYPE) \
    if (TYPE##_MAX) \
       printf("%lld\n", TYPE##_MAX);

print_max(INT);
print_max(BLAH);
Run Code Online (Sandbox Code Playgroud)

c macros nested expansion c-preprocessor

31
推荐指数
3
解决办法
4万
查看次数

如何使bash扩展变量中的通配符?

我正在尝试达到与打字相同的效果

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/  
Run Code Online (Sandbox Code Playgroud)

在命令行,从bash脚本内部.我有:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"
Run Code Online (Sandbox Code Playgroud)

运行时,它会发出意外错误:

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
No such file or directory
Run Code Online (Sandbox Code Playgroud)

引用所有这些的正确方法是什么,以便mv实际进行所需的扩展?(是的,有很多文件与模式匹配./images/.)

bash scripting expansion

28
推荐指数
3
解决办法
3万
查看次数

好奇的C#使用语句扩展

我跑ildasm发现这个:

    using(Simple simp = new Simple())
    {
        Console.WriteLine("here");
    }
Run Code Online (Sandbox Code Playgroud)

生成与此等效的IL代码:

    Simple simp = new Simple();
    try
    {
        Console.WriteLine("here");
    }
    finally
    {
        if(simp != null)
        {
            simp.Dispose();
        }
    }
Run Code Online (Sandbox Code Playgroud)

而问题是为什么它会在最后检查null?只有在执行try块时才会执行finally块,并且只有在Simple构造函数成功时才会执行try块(即不抛出异常),在这种情况下simp将为非null.(如果担心在Simple构造函数和try块的开头之间可能会出现一些干预步骤,那么这确实是一个问题,因为可能会抛出一个异常,阻止finally块执行.)那么,为什么地狱?

暂且不谈(请)使用声明是否比try-finally更好的论点,我将try-finally块写成:

    Simple simp = new Simple();
    try
    {
        Console.WriteLine("here");
    }
    finally
    {
        simp.Dispose();
        simp = null;        // sanity-check in case I touch simp again
                            // because I don't rely on all classes
                            // necessarily throwing
                            // ObjectDisposedException
    }
Run Code Online (Sandbox Code Playgroud)

c# using finally try-catch expansion

26
推荐指数
2
解决办法
3385
查看次数

如何在zsh中一次遍历字符串一个单词

如何修改以下代码,以便在zsh中运行时,它会一次扩展$things并遍历它们?

things="one two"

for one_thing in $things; do
    echo $one_thing
done
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

one 
two
Run Code Online (Sandbox Code Playgroud)

但如上所述,它输出:

one two
Run Code Online (Sandbox Code Playgroud)

(我正在寻找在bash中运行上述代码时获得的行为)

bash zsh while-loop expansion

23
推荐指数
3
解决办法
4万
查看次数

bash变量扩展$ {var:+"..."}在这里 - 文档删除双引号?

我试图理解为什么Bash在使用${parameter:+word}(使用备用值)进行变量扩展时,在here-document中删除双引号(但不是单引号),例如:

% var=1
% cat <<EOF
> ${var:+"Hi there"}
> ${var:+'Bye'}
> EOF
Hi there
'Bye'
Run Code Online (Sandbox Code Playgroud)

根据手册,后面的"单词" :+用波浪扩展,参数扩展,命令替换和算术扩展处理.这些都不应该做任何事情.

我错过了什么?如何在扩展中获得双引号?

bash heredoc quoting expansion

23
推荐指数
2
解决办法
1603
查看次数

Makefile四个美元符号

我正在阅读GNU Make的文档.这是一个例子

%.d:%.c

    @set -e; rm -f $@; \

     $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \

     sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \

     rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)

我在C++程序上尝试了这个,并得到了文件列表

init3d.d init3d.d.18449 input.d input.d.18444 main.d main.d.18439

这是我发现但在同一文档中不明白的内容

如果您已启用二级扩展并且您希望在先决条件列表中使用文字美元符号,则必须实际写入四个美元符号('$$$$').

我想知道四个美元符号"$$$$"究竟是什么意思?他们如何18449,18444或18439?

感谢致敬!

makefile expansion dollar-sign

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

为什么$'\ 0'或$'\ x0'是一个空字符串?应该是空字符,不是吗?

允许扩展.我说:$'string'man bash

表格的字是特别对待的.单词扩展为,使用ANSI C标准指定的反斜杠转义字符替换.反斜杠转义序列(如果存在)按如下方式解码: alert(bell) 退格 转义字符 换页 新行 回车 水平制表符 垂直制表符 反斜杠 单引号 双引号 八位字符,其值为八进制值(一到三个)数字) 八位字符,其值为十六进制值$'string'string
\a
\b
\e
\E
\f
\n
\r
\t
\v
\
\'
\"
\nnnnnn
\xHHHH(一个或两个十六进制数字) 一个控制字符
\cxx

扩展结果是单引号,好像美元符号不存在一样.

为什么不能转化$'\0'$'\x0'成空字符?
有记录吗?有原因吗?(这是一个功能或限制,甚至是一个错误吗?)

$ hexdump -c <<< _$'\0'$'\x1\x2\x3\x4_'
0000000   _ 001 002 003 004   _  \n
0000007
Run Code Online (Sandbox Code Playgroud)

echo 给出了预期的结果:

> hexdump -c < <( …
Run Code Online (Sandbox Code Playgroud)

string bash echo expansion dollar-sign

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

以冒号作为分隔符的全局/路径名扩展

如何转换包含glob字符的字符串,如

/var/lib/gems/*/bin
Run Code Online (Sandbox Code Playgroud)

到一个冒号分隔的文件名字符串(即PATH兼容)匹配模式?

echo /var/lib/gems/*/bin会返回

/var/lib/gems/1.8/bin /var/lib/gems/1.9.1/bin
Run Code Online (Sandbox Code Playgroud)

我想要

/var/lib/gems/1.8/bin:/var/lib/gems/1.9.1/bin 
Run Code Online (Sandbox Code Playgroud)

代替.

显而易见的方法是简单地用':'via替换空格字符tr,但是如果文件名本身包含空格字符则不起作用.

bash shell glob path expansion

19
推荐指数
3
解决办法
4470
查看次数