当我第一次学习shell脚本时,我看到很多let用于基本算术的例子,但后来我发现有些环境不是let内置的,而是支持使用expr(尽管速度明显较慢).
但是,例如,在许多shell中也可以使用双括号来执行算术运算$((54 + 102)).
由于我正在编写一个可移植性的脚本,这提供了一个可能性的雷区; 目前我正在使用两个不同的包装函数(一个用于let和一个用于expr),并使用快速测试来决定在我的其余脚本中使用哪个.
无论如何,我想知道的是,是否有人可以澄清这三个算术命令(以及我错过的任何其他算法命令)的兼容性.我希望双括号形式可能足够普通,我可以放弃兼容性检查,但搜索是一件很难的事情,所以我决定来这里并要求确定.
只是要注意我只对常规算术感兴趣,我想我已经涵盖了我可能需要使用的几个大整数.
所以,我发现与转换的情况下问题NSRange来Range<String.Index>,但我确实遇到相反的问题.
很简单,我有一个String和一个Range<String.Index>并且需要将后者转换成一个NSRange为与旧功能一起使用.
到目前为止,我唯一的解决方法是获取一个子字符串,如下所示:
func foo(theString: String, inRange: Range<String.Index>?) -> Bool {
let theSubString = (nil == inRange) ? theString : theString.substringWithRange(inRange!)
return olderFunction(theSubString, NSMakeRange(0, countElements(theSubString)))
}
Run Code Online (Sandbox Code Playgroud)
这当然有效,但它不是很漂亮,我宁愿避免不得不抓住一个子串而只是以某种方式使用范围本身,这可能吗?
所以我试图用一些方便的函数来扩展Swift的整数类型,但是我还不清楚我应该扩展哪些协议.
作为一个例子,假设我想实现一个用于钳位值的函数(如果它小于最小值,则将其设置为该值,否则如果它大于最大值则将其设置为该值).我的第一个想法是做这样的事情:
extension Int {
func clamp(minimum:Int, maximum:Int) {
if self < minimum { return minimum }
if self > maximum { return maximum }
return self
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子,但它说明了问题; 如果我现在想要调用它,UInt那么我自然也不能,所以我必须添加一个等价物UInt,但这对于UInt16等等不适用.
我认为我可以在链上向上扩展一些东西,然后使用泛型,但是IntegerType似乎无法扩展协议.
那么,是否有更合适的地方可以放置我的扩展程序?
好吧,所以我是一个相当讨厌的情况,我无法访问类型化的数组,如Float32Array,但仍然需要能够将Javascript数转换为字节.现在,我可以处理的整数很好,但我不知道如何为浮点值做.
我已经解决了相反的问题(将字节转换为浮点数),但是关于从float转换为字节的文档非常缺乏,因为大多数语言只是让您读取指针或具有处理它的公共类.
理想情况下,我希望能够将浮点数转换为4字节和8字节表示,并选择使用哪一个.但是,只需要一个数字并将其吐出为8字节的代码仍然很棒,因为我可能从那里自己想出32位版本.
这似乎是各种平台上非标准功能的经典案例.
很简单,我想要一种通用(或至少广泛)支持的方法,将文件的修改时间作为unix时间戳,以秒为单位.
现在我知道了各种方法,stat但大多数都是特定于平台的; 例如stat -c %Y $file适用于某些,但不适用于使用OS X(以及可能是其他FreeBSD系统)stat -f %m $file.
同样,一些平台支持date -r $file +%s,但OS X/FreeBSD再次没有,因为该-r选项似乎只是+%s用于获取unix时间戳的替代选项,而不是像其他平台上的参考文件选项.
我熟悉的另一种选择是使用find该-printf选项,但是这并没有得到广泛支持.我所知道的最后一种方法是解析ls,除了是一件令人不快的事情之外,我认为不能(或者至少应该)依赖它.
那么,是否有更兼容的方法来获取文件的修改时间?目前我只是将不同的变体stat放入一个脚本并运行它们直到一个退出状态为零,但这远非理想,即使我将成功的命令缓存到将来先运行.
好的,所以我有一个处理空分隔输出的脚本find,我可以使用像这样的bash shell轻松处理它:
#!/bin/sh
find "$1" -print0 | while read -rd '' path; do echo "$path"; done
Run Code Online (Sandbox Code Playgroud)
相当愚蠢的例子,因为它只是将结果转换为新行,但它只是让你知道我想要做什么.这种基本方法效果很好,并且避免了由于文件可能在各种文件系统上包含换行而导致的潜在问题.
但是,我需要在非bash shell上做同样的事情,这意味着我失去了支持read -d.因此,如果不采用bash(或其他shell)特定功能,有没有一种方法可以处理与上述类似的空分离结果?
如果没有,最好保护自己免受结果中的新线条影响?我以为我可以使用-exec选项find来替换文件名中的新行与某种转义值,但我不确定找到和替换新行的最佳方法(我不能tr用于示例)或使用什么替换,这就是为什么空字符是最好的选择(如果可用).
我需要为我在Swift中编写的应用程序编写一个Spotlight Importer,并且指的是编写Spotlight Importer的官方Apple指南.
这似乎很简单,但是创建Spotlight Importer项目会为Objective-C实现创建默认设置.现在,使用Objective-C并不是一个大问题(我过去曾经使用过很多次)但是我为我的应用程序编写的所有内容都是在Swift中,所以我真的很想写Swift中的导入器也是为了避免在语言之间切换,所以我也可以共享一些我已经为读/写文件所做的代码.
首先,是否可以使用Swift而不是Objective-C编写Spotlight Importer?如果是的话,我应该从哪里开始(例如 - 如果我采用Objective-C起点,我会做什么来切换到Swift)?
随着DirectX 12,Mantle和Vulkan等低级图形API的兴起,我想知道它们如何与异构系统架构(HSA)进行交互(如果有的话)?
据我所知,支持HSA需要一些开发人员的参与,但我很好奇是否有任何低级图形API自己处理这个问题,或者开发人员是否仍有责任充分利用它?
HSA对于简化系统内存和视频内存之间的数据共享等功能特别有用,特别是当它们共享相同的物理RAM时.
由于这个问题很可能与当前的事态有关,我对这种概述很好(虽然有关未来路线图的信息会很好),我会接受一个仅涵盖单个图形API的答案(因为我怀疑)许多人,如果有的话,人们都熟悉所有三个加HSA).如果我完全误解了它是如何工作的,那么也可以随意指出它; 我对这两种技术都不是很熟悉,但想知道它们目前是如何相互作用的.
给定一个目录,如何查找其中不是硬链接文件的所有文件(以及任何子目录)?或者更具体地说,那些不是具有多个引用的硬链接文件?
基本上我想扫描一个文件夹并返回该目录中的唯一文件列表,包括目录和符号链接(而不是它们的目标).如果可能的话,最好还忽略支持它们的文件系统上的硬链接目录(例如HFS +).
标题确实说明了一切,但我目前正在使用一个带有 case 语句的简单函数将人类可读的文件大小字符串转换为以字节为单位的大小。它工作得很好,但是移植到其他代码中有点笨拙,所以我很想知道是否有任何广泛可用的命令可以替代 shell 脚本使用?
基本上我想获取诸如“100g”或“100gb”之类的字符串并将它们转换为字节。
我目前正在做以下事情:
to_bytes() {
value=$(echo "$1" | sed 's/[^0123456789].*$//g')
units=$(echo "$1" | sed 's/^[0123456789]*//g' | tr '[:upper:]' '[:lower:]')
case "$units" in
t|tb) let 'value *= 1024 * 1024 * 1024 * 1024' ;;
g|gb) let 'value *= 1024 * 1024 * 1024' ;;
m|mb) let 'value *= 1024 * 1024' ;;
k|kb) let 'value *= 1024' ;;
b|'') let 'value += 0' ;;
*)
value=
echo "Unsupported units '$units'" >&2
;;
esac
echo "$value"
} …Run Code Online (Sandbox Code Playgroud)