我正在尝试做一些常见的事情:在shell脚本中解析用户输入.如果用户提供了有效的整数,则脚本会执行一项操作,如果无效,则执行其他操作.麻烦的是,我还没有找到一种简单(而且相当优雅)的方式 - 我不想用char来区分char.
我知道这一定很容易,但我不知道如何.我可以用十几种语言来做,但不是BASH!
在我的研究中,我发现了这个:
其中有一个关于正则表达式的答案,但据我所知,这是C(以及其他)中可用的函数.尽管如此,它看起来像是一个很好的答案,所以我用grep尝试了它,但是grep不知道该怎么做.我试过-P在我的盒子上意味着把它当作PERL regexp - nada.Dash E(-E)也没有用.并且-F都没有.
为了清楚起见,我正在尝试这样的东西,寻找任何输出 - 从那里,我将破解脚本以利用我得到的任何东西.(IOW,我期待一个不合格的输入在有效行重复时不返回任何内容.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Run Code Online (Sandbox Code Playgroud)
有人请说明这是最容易做到的吗?
坦率地说,在我看来,这是TEST的缩影.它应该有这样的旗帜
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
Run Code Online (Sandbox Code Playgroud) 在处理不同的问题(与RMI相关)时,我使用"无限强度"策略文件升级了系统的"安全文件夹",现在我的应用程序以不同的方式失败.我得到一个很长的堆栈转储,其后面的位看起来是相关的:
Exception in thread "main" java.lang.ExceptionInInitializerError
[...crop...]
Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:86)
... 17 more
Caused by: java.lang.SecurityException: The jurisdiction policy files are not signed by a trusted signer!
[...crop...]
Run Code Online (Sandbox Code Playgroud)
嗯,WTF?唯一的变化是我将orignal jar文件放在一边,并在$ JAVA_HOME/lib/security中添加了无限制的文件.该目录现在看起来像这样:
$ ls
blacklist javaws.policy trusted.libraries
cacerts local_policy.jar US_export_policy.jar
java.policy local_policy.jar.strong US_export_policy.jar.strong
java.security local_policy.jar.unlimited US_export_policy.jar.unlimited
Run Code Online (Sandbox Code Playgroud)
当然,.strong和.unlimited版本都在那里,所以我可以快速切换回来.
方向简短明了,似乎只能设想替换这两个文件(local_policy.jar和US_exportpolicy.jar).
还需要做什么?
请注意,java和策略文件的版本是迄今为止最年轻的版本:1.7.0_03和jce_policy-6.
PS 这里发现的类似标题的文章根本没有任何帮助.
电话回家
每个人都想要时不时.......当软件成长并成为成熟产品时,它会怎样?难道不是成年人,安静地住在新家吗?或者,它是否应该表现出来自哪里?
我听说有些人说他们会在没有他们这么说的情况下尝试和沟通的任何部分从盘子中撕掉.我还注意到大量产品现在经常要求许可发送统计使用信息.中间有很多层次.
我坐在篱笆上.
有一段很长的段落解释了这个问题是怎么来的,但是对于我们所有的缘故,我写了然后删除了它.我只想说,我是首席科学家,该公司的高级人员和我们的发展努力的头; 这是一个非常重要的事情,我正在寻找编程社区的见解,因为我在这里没有得到任何有用的反馈......
对于PHONE HOME来说,最大的争议是有些人担心可能会有严重的欺骗合同的行为,如果该软件偶尔打电话回家,它将有助于发现作弊行为(对此有惩罚).
其他专业论点是,它可以提供使用情况统计信息,并可能检测何时更新是合适的.
反对的最大争议是它具有攻击性.
我也不知道如何构建这个.很明显,一直呼唤家的一切都不会飞.有六个主要产品,有些将运行24 X 7 X 365.24,有些将像frigen yo-yo一样上下,但是所有这些产品的一些数据都会很好 - 本地存储库?
然后是连接策略 - 一个邮件消息,虽然方便,可能是一个糟糕的呼叫,因为它可能更突兀(也许).然后,一个简单的TCP ssh调用可能也不是那么好.
那么,怎么样?如果你是专业人士,请告诉我原因.如果你反对,为什么呢."做得对吗?"的例子.您喜欢的合同文本 - 或者讨厌?
接下来,如果我们决定这样做,我们应该怎么做 - 你会怎么做?为什么?
坦率地说,我深刻地撕裂.我一般都讨厌这样的事情,但作为公司的一名官员,我必须承认我自己的感受,这里可能会有很多钱,被冒犯可能不是一个好的论据.
谢谢你的想法.
当我必须编写一个BASH脚本来处理任意目录树并查看任意文件并尝试确定它们之间的比较时,这一天到来了.我认为这将是一个简单的几个小时的上衣!过程 - 不是这样!
我的挂断是有时候一些白痴 - 唉! - 对不起,可爱的用户选择在目录和文件名中放置空格.这会导致我的脚本失败.
完美的解决方案,除了为那些坚持在这些地方使用空间的人威胁断头台(更不用说那些把它放在操作系统代码中的人!),可能是一个"逃避"文件和目录名称的例程我们,有点像cygwin如何将例程从unix转换为dos文件格式.在标准的Unix/Linux发行版中有这样的东西吗?
请注意,for file in *
当一个人试图比较目录树时,简单的构造不能很好地工作,因为它只能在"当前目录"上工作 - 而且,在这种情况下和许多其他目录一样,不断地CD到各个目录位置会带来它自己的问题.所以,在做我的作业时,我发现这个问题处理bash for for循环中的特殊字符,并且建议的解决方案挂起了目录名称中的空格,但可以简单地像这样克服:
dir="dirname with spaces"
ls -1 "$dir" | while read x; do
echo $x
done
Run Code Online (Sandbox Code Playgroud)
请注意:上面的代码并不是特别精彩,因为while循环中使用的变量在while循环之外是不可接受的.这是因为当ls命令的输出被管道传输时,会创建一个隐含的子shell.这是我查询的关键激励因素!
...好吧,上面的代码有助于许多情况,但"逃避"角色也会非常强大.例如,上面的dir可能包含:
dir\ with\ spaces
Run Code Online (Sandbox Code Playgroud)
这已经存在了吗?我一直在忽视它?
如果没有,有没有人有一个简单的建议写一个 - 也许与sed或lex?(我对两者都不太称职.)
我刚刚完成了Fedora 9 Linux最新版本(2008秋季版)的全新安装,我很困惑,它从来没有正确设置默认路由,即使是在这个操作系统的迷宫方式中,也没有明显的方法.
当然,很明显,人们可以像这样一次性地做到这一点:
route add default gw gw1 metric 0 eth0
Run Code Online (Sandbox Code Playgroud)
或者像这样:
ip route add to default via 192.168.2.1 protocol static
Run Code Online (Sandbox Code Playgroud)
但是,这些都不会重新启动.在阅读/etc/rc.d/init.d/network时,它会尝试从/ etc/sysconfig/static-routes中的文件中查找数据,但该文件从未存在过.所以,我尝试创建它并用数据填充它.麻烦的是脚本在一个我不确定如何处理的奇怪位置放置一个破折号(减号).
当然,人们可以编辑/etc/rc.d/init.d/network,但那将是非标准的.实际上,我唯一的其他办法似乎是编辑rc.local,但是在启动序列中并没有足够早地用于诸如网络时间守护程序之类的事情.
我已经完成了我的作业 - 我已经阅读了所有的手册页,信息条目,尝试过,我甚至做了一些网络搜索,但都无济于事 - 我的下一步,在这里没有回答,将是注册Fedora邮件列表并在那里询问!或者,放弃并编辑脚本.
那么,一个人应该怎么做呢?
为了理解我的要求,重要的是区分Unix中SUID的几种用法.
我有一个项目,使用用户的PATH中的可执行文件,该项目由项目拥有,并且设置了SUID位.这样,当它运行时,它在文件所有者的上下文中运行,而不是在调用用户的上下文中运行.这样,它可以访问用户没有的东西,从而通过正常的文件系统保护来保护这些东西免受用户的侵害.这工作得相当好.计划是将项目转移到客户端 - 服务器架构,但这需要一些时间.与此同时,我如何在Windows系统上复制此类行为?
请注意,项目的可执行文件不会调用SETUID库调用,但坦率地说,鉴于项目的作用,这将是一个很好的功能.该项目不需要系统root权限.它的第一个安全问题是它需要保护自己的文件免受用户(除了文件所有者以外的任何用户)的保护,如果它能够切换到"用户上下文"来访问文件,那将是非常好的.系统好像是主叫用户.(通过这种方式,它可以更容易地确定项目触摸什么是好的,什么不是.)
该项目是用C和Java组合编写的 - 一个带有SUID集的C程序调用Java代码......
我很想知道所有这些机制,特别关注那些:
如果某些解决方案更优越,请分享您对此方面所知的任何想法.
笔记:
我使用Terminal-IDE作为我的开发环境.(Google代码网站.)
我正在运行Terminal-IDE v 2.02 - 最新版本.我的Android版本是:
我在一个合适的开发目录中,已经准备好了足够简单的c源代码文件并运行'make'.
我还没有得到任何编译成功的工作.最有可能的是,在可用的可执行文件与软件要查找的内容之间存在版本不匹配.
这是命令和错误消息:
terminal-gcc -c -Wall -I/data/data/com.spartacusrex.spartacuside/files/local/include tester.c -o tester.o
/data/data/com.spartacusrex.spartacuside/files/system/bin/terminal-gcc[43]: arm-eabi-gcc: not found
make: *** [tester.o] Error 127
Run Code Online (Sandbox Code Playgroud)
当然是Snafu.我完全不确定如何找出正确的编译器文件名应该是什么,因为在这个非root用户手机上,我没有权限通过PATH查找并找到实际的可执行文件.
也可能是PATH设置错误.所有输入赞赏.
我的父亲最近去世了,我继承了他的Mac.我喜欢在我自己的生活中使用它,但我不想擦掉它的大脑,所以我可以重新配置它以在我的网络等中使用.他的旧文件在历史上对我很重要 - 我相信你可以理解我保留它们的愿望.
我可以登录,因为我在机器上有一个帐户,然后才能通过,但就是这样.