PS: Shell 编程时总是不能区分什么是 Shell 语法,什么是系统命令。
基础
x=abc
echo hello world
echo 'Just output $x'
echo "The value of x: $x"
echo ${x:?变量未设置}
echo ${x:+变量已设置}
echo ${x:-默认值}
变量
Shell 就是标准的弱类型,所有的数据都是按照字符串的形式存储,然后根据上下文决定如何处理。
x='hello world' # 等于号两边不能有空格
local x='hello world' # 本地作用域,函数体中使用
echo $a
echo ${a}
unset a
readonly a # 将变量设置成只读,不能修改,不能 unset
readonly b=1
# 没有提供方法取消 readonly 属性,但是我看到 SO 上有提供非常规方法来做这件事情
字符串变量
单引号不支持变量和转义(也就是说字符串中不能出现单引号)!
x="hello world"
echo $x
echo ${#x}
echo ${x/world/markjour} # 字符串替换
# 子字符串/字符串切片
echo ${x::5} # hello
echo ${x:7:8} # world
echo ${x::4} # hell
echo ${x::-4} # hello w
特殊变量
$0
$1
...
$n
# 所有参数
$*
$@
$# # 参数个数
$$ # 进程号
$! # 后台进程号
$? # 上一个命令的退出状态
$- # himBHs 当前 Shell 的选项
数组
arr=(zhao qian sun li)
arr[4]=zhou
arr[5]=wu
arr[6]=zheng
arr[7]=wang
echo ${arr[0]} # zhao
echo ${arr[@]} # zhao qian sun li zhao wu zheng wang
# 获取数组元素个数
echo ${#arr} # 4 定义时的长度,后来新加的不算,也就是说这个值定义变量的时候就定了
echo ${#arr[@]} # 8
条件
if condition:
then
:
else:
:
fi
[ ]
[[ ]]
test
循环
for var in list:
do
:
done
数学计算
test
逻辑
数学比较
字符串比较
文件相关
bcdfgkpurwxse
白菜豆腐干,靠谱如我,羞涩
最常用的:
-e
检查路径是否存在-d
检查是否为目录-f
检查是否为文件-r
检查文件是否可读-w
检查文件是否可写-x
检查文件是否可执行-s
检查文件是否为空
参考资料与拓展阅读
- StackOverflow, Unset readonly variable in bash
- How To Unix For Loop 1 to 100 Numbers
- Linux Handbook, Bash Beginner Series #4: Using Arrays in Bash
- StackOverflow, Questions tagged [bash]