标签: expansion

Bash参数扩展

我有一个使用以下逻辑的脚本:

if [ ! -z "$1" ]; then         # if any parameter is supplied
    ACTION=                    # clear $ACTION
else
    ACTION=echo                # otherwise, set it to 'echo'
fi
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作.但是,在阅读本手册的Shell参数扩展部分时bash,似乎应该可以在一个步骤中完成.但是,我无法完全理解如何做到这一点.

我试过了:

ACTION=${1:-echo}              # ends up with $1 in $ACTION

ACTION=${1:+}
ACTION=${ACTION:-echo}         # ends up always 'echo'
Run Code Online (Sandbox Code Playgroud)

还有几种嵌套方法,但据我所知,嵌套似乎是不允许的.

我意识到我已经有了一个有效的解决方案,但现在我真的很好奇,如果可能的话.对于三元运算符来说,它是直截了当的,但我不认为bash有一个.

如果这是可能的,我希望看到这样做的逻辑似乎是两步过程,没有if/else结构,但只使用Shell参数扩展功能的任意组合.

谢谢.


编辑 elderarthis:

脚本的其余部分只是:

find . -name "*\?[NMSD]=[AD]" -exec ${ACTION} rm -f "{}" +
Run Code Online (Sandbox Code Playgroud)

我只想ACTION=echo对自己进行一次健全检查,因此,传递任何参数都会实际删除(通过使$ {ACTION}无效,而传递没有args会在那里留下回声.

我知道TIMTOWTDI; 我想看看它是否只能通过Shell参数扩展部分中的内容来完成:-)


编辑 Mikel:

$ cat honk.sh …
Run Code Online (Sandbox Code Playgroud)

parameters bash shell expansion

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

Scala案例类映射扩展

在groovy中可以做到:

class Foo {
  Integer a,b
}
Map map = [a:1,b:2]
def foo = new Foo(map) // map expanded, object created
Run Code Online (Sandbox Code Playgroud)

据我所知,Scala对Groovy这个词没有任何意义,但我想知道在这种情况下是否支持地图扩展

简单地说,我试过并失败了:

case class Foo(a:Int, b:Int)
val map = Map("a"-> 1, "b"-> 2)
Foo(map: _*) // no dice, always applied to first property
Run Code Online (Sandbox Code Playgroud)

一个相关的线程,显示问题的可能解决方案.

现在,从我能够挖掘的内容来看,至少从Scala 2.9.1开始,关于案例类的反思基本上是无操作的.然后,净效应似乎是强制进入某种形式的手动对象创建,考虑到Scala的强大功能,这有点具有讽刺意味.

我应该提一下,用例涉及servlet请求参数映射.具体来说,使用Lift,Play,Spray,Scalatra等,我想采用已清理的params映射(通过路由层过滤)并将其绑定到目标案例类实例,而无需手动创建对象,也不指定其类型.这将需要"可靠"的反射,并且需要像"str2Date"那样来处理类型转换错误.

或许在2.10中使用新的反射库,实现以上将是蛋糕.进入斯卡拉只有2个月,所以只是刮擦表面; 我没有看到任何直接的方法来解决这个问题(对于经验丰富的Scala开发人员,可能是可行的)

scala dynamic object map expansion

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

带有嵌入式引号的bash中的字符串扩展

问题:

以下shell脚本代码不会产生预期的结果:

# MYSQL, MyUSER MyHost etc ... all defined above as normal

TARG_DB="zztest";
DB_CREATE="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'create database $TARG_DB')";
Run Code Online (Sandbox Code Playgroud)

预期结果:

使用名称创建的新数据库 zztest

实际结果:

使用名称创建的新数据库 $TARG_DB

题:

如何更改此示例代码以进行$TARG_DB插值或扩展,从而产生预期结果?

bash shell expansion subshell

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

Bash子串扩展数组

我有一组带有给定后缀的文件.例如,我有一组带后缀的pdf文件.pdf.我想使用子字符串扩展获取没有后缀的文件的名称.

对于我可以使用的单个文件:

file="test.pdf"
echo ${file:0 -4}
Run Code Online (Sandbox Code Playgroud)

为了对所有文件执行此操作,我现在尝试:

files=( $(ls *.pdf) )
ff=( "${files[@]:0: -4}" )
echo ${ff[@]}
Run Code Online (Sandbox Code Playgroud)

我现在得到一个错误说substring expression < 0...

(我想避免使用for循环)

arrays bash substr expansion

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

循环时避免扩展:对于$ foo中的x

我必须计算目录中的可执行文件数.

我已经想出了一种不同的方法(通过写入文件然后搜索文件,但这有点难看).

首先来到我的解决方案是这个(第一个参数是目录路径):

#!/bin/bash

noe=0

files=`ls -F $1` # because the -F option appends an indicator
                 # to the file, for an executable it's an '*'
                 # so if there is an executable 'script.sh' in the dir
                 # the output will be like this: 'script.sh*'

for i in $files
do
    if [ `echo "$i" | grep '*$'` ] #should search for an '*' at the end...
    then
        let noe += 1
    fi
done

echo $noe
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为for循环中省略了'*'.

(for循环中的echo命令最后输出一个没有'*'的文件名,但是当参数在""中时,在for循环外正常工作)

有关于这一个类似的问题在这里,我已经成功地回答适应我的情况,但它没有解释为什么它不能与完成.+我不完全理解为什么 …

bash shell for-loop wildcard expansion

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

计算1 /(1 + exp(x))python时避免数值不稳定

我想为(可能很大)x计算1 /(1 + exp(x)).这是0和1之间表现良好的函数.我可以这样做

import numpy as np
1.0/(1.0+np.exp(x))
Run Code Online (Sandbox Code Playgroud)

但是在这个天真的实现中,np.exp(x)很可能只返回0或大于x的无穷大,具体取决于符号.python中是否有可以帮助我的功能?

我正在考虑实施一系列扩展和系列加速,但我想知道这个问题是否已经解决了.

python floating-point numpy expansion scipy

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

像宏这样的函数是否需要强制括号?在参考GCC cpp手册后我很困惑

这让我感到困惑:

要定义类似函数的宏,可以使用相同的'#define'指令,但是在宏名称后面紧跟一对括号.

我相信这是为了让代码脱颖而出,而不是该程序的作者.像宏名称的其他CAPS规则一样.但以下是我感到困惑的地方:

类似函数的宏只有在其名称后面带有一对括号时才会展开.如果你只是写下这个名字,那就不管它了.

我读完之后立刻就不同意了.并且gcc -E验证了以下代码

#define FUNC display()

void display()
  {
    printf("Display\n");
  }

int main()
  {
    FUNC;
    return 0;
   }
Run Code Online (Sandbox Code Playgroud)

预处理的输出按预期显示main()函数的内容:

int main()
  {
    display();
    return 0;
  }
Run Code Online (Sandbox Code Playgroud)

那我在这里错过了什么?预处理器用于标记源,宏扩展是一个标记,上面的代码以这种方式处理,预处理器不应该检查任何东西或验证任何东西,它只是转储令牌.在那种情况下,gcc手册试图传达什么.

我正在学习C编程,所以我可能会经常发生误解,我搜索了一个正确的解释,最后在这里求助.请帮我解决一下这个.

c macros gcc expansion c-preprocessor

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

如何在Flutter中为ExpansionPanel添加背景颜色

我试图在Flutter中设置ExpansionPanel的样式,但颜色不适用于整个面板.我已经尝试过Container和Card小部件,颜色没有更新.有任何想法吗?我想添加背景颜色以覆盖整个ExpansionPanel.有没有办法将父主题添加到ExpansionPanel.

Card(
  elevation: 2.0,
  color: Theme.of(context).primaryColor,
  margin: EdgeInsets.only(left: 10.0,right: 10.0,top: 10.0),
  child: ExpansionPanelList(
    expansionCallback: (int index, bool isExpanded) {
      setState(() {
        _items[index].isExpanded = !_items[index].isExpanded;
        Timer(Duration(milliseconds: 200), () {
          setState(() {
            _reconfigureFAB();
          });
        });
      });
    },
    children: _items.map((IncludedItem item) {
      return ExpansionPanel(
        headerBuilder: (BuildContext context, bool isExpanded) {
          return Container(
            padding: EdgeInsets.only(left: 18.0),
            child: Row(children: [
              Text(
                "What's included",
                textAlign: TextAlign.start,
                style: TextStyle(
                    fontFamily: 'Bold',
                    fontSize: 33.0,
                    color: Theme.of(context).backgroundColor),
              ),
            ]),
          );
          ;
        },
        isExpanded: item.isExpanded,
        body: Container(
          child: Text("body"), …
Run Code Online (Sandbox Code Playgroud)

expansion flutter flutter-layout

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

从8位复制到32位

我正在尝试将8位值复制到32位,并想问问是否有可能编写单行算法来复制位值。

例如:

1100 1011 -> 1111 1111 0000 0000 1111 0000 1111 1111
Run Code Online (Sandbox Code Playgroud)

如果有可能,我想了解其背后的逻辑。

c bit-manipulation duplicates expansion

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

如何在 C++ 预处理器中扩展布尔表达式?

以下代码不扩展布尔表达式,另请参见https://godbolt.org/z/YqbazT3eo

#define EXPAND(x) x

#define SWITCH false
EXPAND(SWITCH || defined(_DEBUG))
Run Code Online (Sandbox Code Playgroud)

我该如何正确地做才能做到

#define FLAG EXPAND(SWITCH || defined(_DEBUG))
Run Code Online (Sandbox Code Playgroud)

(或类似)并且FLAG不会依赖于以后的更改SWITCH

c++ macros preprocessor expansion

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