xDroid's Blog

假装高冷的Geek

20.5 Shell 条件表达式 (从新手到菜鸟的Linux教程)

除了 js 和 c/cpp 的三目操作符 [] ? [] : [] 和 python 的 [val1] if [cond] else [val2] 是的我就是要吐槽它们顺序不一样 ,应该大部分语言的条件表达式只有 if-else 类或者 switch-case 类,那么我们也从这两种看一下 bash 里怎么做条件判断。

if-else

基本语法是

if [ cond1 ]
then
exp1
elif [ cond2 ]
exp2
else
exp3
fi

假设大家都已经掌握了 if-else 结构,这里只强调几个不按常理出牌的地方:

  • 左右方括号周围要有空格,不然就是语法错误(原因接下来说道 test 的时候会分析),比如:

    $ if [ 1 -ne 2 ]; then echo "Surely"; else echo "Math taught by literature teacher."; fi
    Surely
    $ if [1 -ne 2 ]; then echo "Surely"; else echo "Math taught by literature teacher."; fi
    bash: [1: command not found
    Math taught by literature teacher.
    $ if [ 1 -ne 2]; then echo "Surely"; else echo "Math taught by literature teacher."; fi
    bash: [: missing `]'
    Math taught by literature teacher.

    这里我们也展示了如何将 if-else 写在同一行内。

  • 和 matlab 不一样的地方是, if-else 块用 fi 结束,而不是 end (相比之下我觉得还是 matlab 的写法好一点)。

  • 测试条件是返回值等于 0 为真,返回值非零为假(真 TM 奇怪,居然和 VB 差不多

[ 与 test

上面提到了左右方括号两边必须加空格,这是为什么呢?

$ help [
[: [ arg... ]
Evaluate conditional expression.

This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.

这就很有趣了,我们再来看看 test 的帮助:

$ help test
test: test [expr]
Evaluate conditional expression.

Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR. Expressions may be unary or binary. Unary
expressions are often used to examine the status of a file. There
are string operators and numeric comparison operators as well.

The behavior of test depends on the number of arguments. Read the
bash manual page for the complete specification.

因此 [ 只是 test 的别名,只是最后一个参数必须是 ] ;至于 test 能干嘛,只要知道它测试文件状态、比较字符串或数字就可以了——剩下的,文档都说了 Read the bash manual page for the complete specification 面向 StackOverFlow 编程就可以了

if-else 的简化写法

我们注意到既然条件表达式可以包含命令,那么我们就可以直接把分支中的表达式“接”在做出判断后面;这种技巧是这样实现的:

condition && if_succeed || if_failed

这种语句为什么能够成立留作习题

case-esac 结构

是的,他们又把单词反过来了(手动微笑),举个例子:

$ day="Sat"
$ case $day in
> Mon | Tue | Wed | Thu | Fri)
> echo 'Oh no, we have to work today.'
> ;;
> Sat | Sun)
> echo 'Relax!'
> ;;
> *)
> echo 'Sorry aliens.'
> ;;
> esac
Relax!

别忘了打两个分号。

20.4 Shell 字符串 (从新手到菜鸟的Linux教程)

好的,我抓紧把这个坑填上就可以安利其他有趣的命令了(

我们提到过 shell 是弱类型的语言,除了数字和数组类型以外好像也就字符串类型了。个人感觉用 shell 的时候字符串类型是最多的,因为你看传参数是用字符串,就连循环

for i in `seq 1 10`
do
...
done

i 的取值 seq 1 10 都是字符串类型。记得某篇文章说过 Lisp 系统比类 Unix 系统高端之处就在于前者用表传参,而后者是用字符串传参= =

Read More

匪夷所思的 Gurobi 安装

大意是在 Matlab 命令行安装 Gurobi 的时候提示架构不对,看了一下安装文件的源码:

% We don't require GUROBI_HOME on Mac or Linux. Get gurobiarch from path.
gurobiarch = gurobipath;
gurobiarch(end) = [];
slashes = strfind(gurobiarch, fs);
gurobiarch = gurobiarch(slashes(end-1)+1:slashes(end)-1);

关爱智障的眼神。

(解释一下,因为我把 Gurobi 安装到 /opt/gurobi 去了,但是似乎安装程序默认我们应该安装到一个类似于 /***/gurobi752/linux64/ 的地方)


顺便吐槽一下 CVX 。

申请 academic license 的时候需要输入(网卡的)特征编码,但是在我这里的发行版上 cvx_version 并不显示出来……继续读源码:

%%%%%%%%%%%%%%%%
% License file %
%%%%%%%%%%%%%%%%

if isoctave,
if ~isempty( cvx___.license ),
fprintf( 'CVX Professional is not supported with Octave.\n' );
end
elseif cvx___.jver < 1.6,
fprintf(' WARNING: full support for CVX Professional licenses\n' );
fprintf(' requres Java version 1.6.0 or later. Please upgrade.\n' );
elseif exist( 'cvx_license', 'file' ),
cvx_license( args{:} );
end

重下带 gurobi 和 mosek 的 standard 版本,把 cvx_license.p 文件复制过去就可以了。

关爱智障的眼神*2。

语言纯粹主义者的对话 0

纯粹主义者的对话:

A> 你平时使用什么
B> 哦我使用痛殴_。
A> _痛殴
是一个好的 ,但是我觉得 玄壳 似乎也不错。我用的是 哦我的玄壳 发行版。
B> 我在 混账中心 看到过这个发行版。有时候我也看到其他人推荐 ,不过我还没试过。毕竟用 造 安装 命令实在是太麻烦了。
A> 你不使用 包管理器 吗?
B> 我使用 吃豆人 ,在 操作系统十 上我会使用 家酿
A> 吃豆人 功能很强大,但是我觉得搜索起来不甚方便;你为什么不试试 酸奶 呢?
B> 唔,可能主要是我平时和 森蚺 打交道比较多。
A> 森蚺 ?那是什么?我只听说过 蟒蛇
B> 森蚺 是一个能够提供 蟒蛇 各类科学计算包的管理器,我感觉很不错。
A> 这样啊……我平时用的比较多的是 丙语言 ,所以对 蟒蛇 不是很熟。
B> 丙语言 ?你用什么 集成开发环境 吗?
A> 我不用 集成开发环境 ,大部分时间我用 崇高编辑器铿锵编译前端 ,有时候在服务器上我会使用 敏捷编辑器
B> 那你用什么写 可移植文档文件 呢?
A> 我一般使用 乳胶语言 ,引用会通过 围兜排版软件 编译插入。
B> 听起来不错。你知道的,用 单词 实在是太不方便了——说起来你试过 降价语言 吗?
A> 啊 降价语言 很不错,写博客什么非常方便,就是表达能力还很有限。
B> 那我还是花点时间学习一下 乳胶 。下次有空可能要在 电报 上请教一下你。
A> 不客气 ^_^

Read More

碎碎念 第一则

刚才偶然发现自己改的播客模板有个小 bug :

h3(): a(src = "//" + config.staticRoot + post.media) 下载链接

其实应该是 a(href = ...) 才对;否则链接会有下划线提示但是没有点击提示,也自然不会有点击跳转。


本来记得这周还碰到过一个语言的某种坑的,结果周中太忙没时间记录下来,也算是非常遗憾。

很遗憾啊……愿望太多、想做的事情太多、想达到的关系太复杂,往往就感觉没有完成,甚至不觉得自己能够完成。

十一的时候出去转了一圈 不过就是去隔壁圆明园走了半天嘚瑟什么 ,一路上和同伴谈天道地。聊起自己刚上大学时录制游戏视频传到网上,现在忽然也有了这份情调,却早已经没了彼时中二的气息和出名的欲望。或许有还是有的,只不过更多的被掩饰住了而已。

或许就这样吧。有空我继续去风楼倚上面去倾泻负能量去。