初识shell

shell | shell script

shell是一种命令解释器,它提供了用户和操作系统之间的交互接口,还有其他的交互接口比如 GUI。
shell script即shell脚本,是一种通过shell执行的编程语言

helloworld

1
2
3
#!/bin/bash

echo helloworld

基本结构

顺序 && 条件 && 循环

1
2
3
4
5
6
7
8
9
# 条件
## 判断是否目录 -d -- directory
## 判断是否文件 -f -- file
## 判断是否相等 -eq -- equal 等价 ==
## 判断是否不相等 -ne -- not equal 等价 !=
## 判断是否大于
if [[ -d "/path/to/binary" ]]; then
echo "Is directory"
fi
1
2
3
4
5
# 遍历当前目录
for file in `ls .`
do
echo "file:$file"
done

变量

定义

1
newer=123

使用

变量名加”$”前缀

“” 包含的变量会解析
‘’ 包含的变量不解析

“$newer11” 中变量是 newer11 但是实际的变量是 newer, 为了解决这个情况,可以用括号”${newer}11”

环境变量

环境变量(environment variables)一般是指在 操作系统 中用来指定操作系统运行环境的一些参数,如: 临时文件夹 位置和 系统文件夹 位置等。

使用env命令可以输出当前的环境变量

1
2
3
4
5
...
PATH=XXX
HOME=XXX
SHELL=/bin/zsh
...
相对路径和绝对路径

可以参考坐标轴去理解, 通过相对原点可以定位一个点,通过坐标轴上的其它位置也可以定位一个点。只是这个原点这这里就是 / 代表挂载的最顶层的路径,从这里开始算就是绝对路径, 比如/usr/bin/git就是绝对路径

PATH

计算机并不知道如何找到对应的命令,PATH变量就是提供了一组路径,让shell在解释命令时能找到对应的可执行文件

比如git可执行文件在 /usr/bin/git,PATH中有/usr/bin,所以会去这个目录下去匹配,这样才能顺利找到git命令

其他目录

HOME 家目录 ~
当前目录 .
上一级目录 ..
根目录 /

cd - 切回上一个目录 – 通过PATH实现

数据结构: 数值 && 字符串 && 列表

常用字符串分割

获取文件的后缀名

获取文件名
获取目录名

helloworld 的解释

“#!/bin/bash”

首先是 #!, 是魔数(Magic Number),关于魔数,详见扩展部分,是一个标志,代表这个文件是脚本文件,/bin/bash,声明要用哪个可执行文件执行这个文件

echo helloworld

调用 echo “函数” 打印helloworld到显示器

echo -> shell -> OS -> hardware

1
2
3
4
5
6
#include <stdio.h>

int main(int argc,char[] argv) {
printf("helloworld");
return 0;
}

shell解释器

执行shell的脚本的可执行文件

1
echo $SHELL

默认的是bash,

可以使用 zsh
终极 Shell——ZSH

参考

  1. Shell 教程
  2. 結構化程式理論
  3. Unix中文手册

前言

很久没写博客,重新恢复写作后,发现hexo deploy 无法推送了,一直报无权限,检查了~/.gitconfig账号是对的,按参考一在~/.ssh/config中加了公钥

按要求eval "$(ssh-agent -s)"

1
2
3
4
Host *.github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/whz1992gt_github_home

指定github.com使用该公钥,但是还是失败。

阅读更多

仅记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<dict>
<key>URL</key>
<string>http://dev.skyfox.org/udid/receive.php</string> <!--接收数据的接口地址-->
<key>DeviceAttributes</key>
<array>
<string>UDID</string>
<string>IMEI</string>
<string>ICCID</string>
<string>VERSION</string>
<string>PRODUCT</string>
</array>
</dict>
<key>PayloadOrganization</key>
<string>dev.skyfox.org</string> <!--组织名称-->
<key>PayloadDisplayName</key>
<string>查询设备UDID</string> <!--安装时显示的标题-->
<key>PayloadVersion</key>
<integer>1</integer>
<key>PayloadUUID</key>
<string>3C4DC7D2-E475-3378-489C-0BB8D737A653</string> <!--自己随机填写的唯一字符串-->
<key>PayloadIdentifier</key>
<string>dev.skyfox.profile-service</string>
<key>PayloadDescription</key>
<string>本文件仅用来获取设备ID</string> <!--描述-->
<key>PayloadType</key>
<string>Profile Service</string>
</dict>
</plist>

Socket

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)

阅读更多

前言

  平常用的颜色宏大概如下

1
#define RGBHex(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

  考虑到蓝湖中获得的十六进制颜色值为#FF0000,cv时需要先删除#再添加0x,想省略这部分

实现

  C语言宏中’#’称之为字符串化操作符(Stringizing Operator),它将函数宏的实际参数转换为对应的字符串常量。利用这个特点定义如下的颜色宏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define HEXA(COLOR,A) ({ \
char *color = #COLOR;\
NSString *colorString = [NSString stringWithUTF8String:color]; \
colorString = [colorString stringByReplacingOccurrencesOfString:@"#" withString:@""]; \
colorString = [colorString stringByReplacingOccurrencesOfString:@"0x" withString:@""]; \
unsigned int red,green,blue; \
NSRange range; \
range.length = 2; \
range.location = 0; \
[[NSScanner scannerWithString:[colorString substringWithRange:range]] scanHexInt:&red]; \
range.location = 2; \
[[NSScanner scannerWithString:[colorString substringWithRange:range]] scanHexInt:&green]; \
range.location = 4; \
[[NSScanner scannerWithString:[colorString substringWithRange:range]] scanHexInt:&blue]; \
[UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:A]; \
})

#define HEX(COLOR) HEXA(COLOR,1.0)

  支持0xFF0000/#FF0000/FF0000这三种格式

环境

macOS Mojave Version 10.14.3
Xcode 10.1
iPhone 5s 10.0.1
node v11.10.0
npm 6.7.0
React Native 0.58
react 16.6.3

新建ReactNative项目

1
2
brew install node
brew install watchman

安装React Native命令行工具

1
npm install -g react-native-cli

安装Xcode及命令行相关工具


或者

阅读更多

环境

macOS Mojave 10.14.3
Xcode10.1
iPhone6S 10.0.1

获得崩溃日志

方式一:Xcode

菜单 > Window > Devices and Simulators

选择设备并查看设备日志(View Device Logs)

方式二:手机

设置 > 隐私 > 诊断与用量 > 诊断与用量数据

阅读更多

前言

《编译原理》中提到

编译器的第一个步骤是词法分析(Lexical Analysis)或扫描。词法分析器读入组成源程序的字符流,并且将它们组织成为有意义的词素(lexeme)的序列。对于每个词素,词法分析产生如下形式的词法单元(token)作为输出:
<token-name,attribute-value>
token-name 是一个语法分析步骤要使用的抽象符号
attribute-value指向符号表中关于这个词法单元的条目

实验

1
2
3
4
5
6
7
8
9
10
11
int main(){
@autoreleasepool {
int initial = 8;
int six = 6;
NSString* site = [[NSString alloc] initWithUTF8String:"starming"];
int rank = initial + six;
int position = initial + rank * 60;
NSLog(@"%@ rank %d", site, position);
}
return 0;
}

阅读更多

Clang

ClangLLVM(Low Level Virtual Machine)项目提供的工具链中的编译器的前端部分

LLVM项目是模块化和可重用的编译器和工具链技术的集合,LLVM的一大特色就是,有着独立的、完善的、严格约束的中间代码表示。这种中间代码,就是LLVM的字节码,是LLVM抽象的精髓,前端生成这种中间代码,后端自动进行各类优化分析,让用LLVM开发的编译器,都能用上最先进的后端优化技术。

阅读更多

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×