我有一个使用以下逻辑的脚本:
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) 在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开发人员,可能是可行的)
问题:
以下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插值或扩展,从而产生预期结果?
我有一组带有给定后缀的文件.例如,我有一组带后缀的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循环)
我必须计算目录中的可执行文件数.
我已经想出了一种不同的方法(通过写入文件然后搜索文件,但这有点难看).
首先来到我的解决方案是这个(第一个参数是目录路径):
#!/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循环外正常工作)
有关于这一个类似的问题在这里,我已经成功地回答适应我的情况,但它没有解释为什么它不能与完成.+我不完全理解为什么 …
我想为(可能很大)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中是否有可以帮助我的功能?
我正在考虑实施一系列扩展和系列加速,但我想知道这个问题是否已经解决了.
这让我感到困惑:
要定义类似函数的宏,可以使用相同的'#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编程,所以我可能会经常发生误解,我搜索了一个正确的解释,最后在这里求助.请帮我解决一下这个.
我试图在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) 我正在尝试将8位值复制到32位,并想问问是否有可能编写单行算法来复制位值。
例如:
1100 1011 -> 1111 1111 0000 0000 1111 0000 1111 1111
Run Code Online (Sandbox Code Playgroud)
如果有可能,我想了解其背后的逻辑。
以下代码不扩展布尔表达式,另请参见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?