I'm Prime

十方三世,尽在一念

View on GitHub

λ:

限定范围

#!/bin/bash
set -euf # 开启选项
# set -x -o pipefail 

# set +euf # 关闭选项
...

大部分教程到这就开始写脚本逻辑部分了,但是第二行set -euf可能比第一行还有用,而且第一行也不是非写不可,bash <script_name>.sh 也可以跑。

  • setbash的内建命令,可以 help set 查看具体用法
  • man builtin 了解内建命令
  • 如果使用未定义的变量,值会是 "" 空串,这在路径拼接时尤为危险:rm -rf $WORKSPACE/, 如果 WORKSPACE 是个未定义变量,这条语句直接变成rm -rf /

命令 & 组合命令

man bash
# 打开手册后搜索 SHELL GRAMMAR,
/SHELL GRAMMAR

简单命令 Simple Commands

A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator.

简单命令是一个由若干可选变量组成的序列,参数之间空格或者重定向符连接,并且由控制操作符终止

控制操作符:|| & && ; ;; ( ) | <newline>

管道 Pipelines

A pipeline is a sequence of one or more commands separated by the character .

[time [-p]] [ ! ] command [ | command2 ... ]

管道是一个或多个命令的组成的序列,由字符 分隔。 方括号中为可选参数,所以 一条命令也算作是个管道
# example
cat /etc/shells | grep /bin

命令列表 Lists

A list is a sequence of one or more pipelines separated by one of the operators ;, &, &&, or   , and optionally terminated by one of ;, &, or <newline>.

简单讲就是一串管道(命令)。

复合命令 Compound Commands

各种括号

for


变量

str1="string1"

echo "str1: $str1"
echo "str2: ${str1}2"

数组

shell 数组更像 map<int, T>

# 数组, 数组名=("val1" "val2" "val3")
empty_arr=() # 空数组
arr=("val1" "val2" "val3  3  3")

# 使用:
${arr[50]} # 取值,如果不存在就是空字符串
arr[100]="new val" # 赋值
${#arr[@]} # 当前元素个数

引号,转义字符

shell 操作基本都是在做字符串处理。环境变量里IFS(Internal Field Seprator)为当前分隔符的值。打印一下默认值:

# 由于全是转义字符,用 od 命令处理一下,否则看不到

echo $IFS | od -c

# output:
# 0000000      \t  \n  \0  \n
# 0000005

echo $IFS | od -a

# output:
# 0000000  sp  ht  nl nul  nl
# 0000005

所以如果字符串中空格,tab,换行等,会被识别成两个字符串。