Shell 变量
- 变量默认都是字符串类型
- 变量名和等号之间不能有空格
- 命名:只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 查看变量 set 命令,删除变量
unset variable_name set -u调用未声明变量报错(默认无提示)
变量叠加
1 | x=123 |
readonly
1 | x=123 |
Shell 字符串
Shell 字符串可以用单引号,也可以用双引号,也可以不用引号。
1 | str='Hello World' |
其中双引号中可以出现变量和转义符。
1 | string="abcd" |
提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
1 | string="Hello World" |
查找字符串
1 | string="Hello World" |
Shell 数组
Shell 中只支持一维数组
1 | names=('leo' 'jack' 'tim') |
Shell 注释
Shell 没有多行注释
1 | -------------------------------------------- |
Shell 参数
创建脚本 test.sh
1 | !/bin/bash |
为脚本设置执行权限,并执行
1 | chmod +x test.sh |
Shell 运算符
原生 bash 不支持数学运算符,但是可以通过其他命令实现,比如 expr。
算术运算符
1 | val=`expr 2 + 2` # 注意空格 |
关系运算符
1 | [ $a -eq $b ] # -eq 相等 |
1 | a=$1 |
1 | ./test.sh 10 20 |
布尔运算符
1 | !/bin/bash |
逻辑运算符
1 | a=10 |
字符串运算符
1 | a="abc" |
echo 命令
1 | echo "\"Are you OK?\"" # 转义字符 |
printf 命令
1 | printf format-string [arguments...] |
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
test 命令
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
1 | a=10 |
代码中的 [] 表示执行基本的算数运算。
1 | a=10 |
字符串测试
1 | a="abc" |
文件测试
1 | -e 文件名 如果文件存在则为真 |
Shell 流程控制
条件控制
1 | if |
for 循环
1 | for var in item1 item2 ... itemN |
while 循环
1 | while condition |
无限循环
1 | while true |
case
1 | case 值 in |
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
break
1 | while : |
continue
1 | while : |
esac
case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。
Shell 函数
1 | funWithReturn(){ |
函数返回值在调用该函数后通过 $? 来获得。
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
函数参数
1 | funWithParam(){ |
Shell 重定向
1 | command > file # 将输出重定向到 file |
禁止输出
1 | command > /dev/null |
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
1 | command > /dev/null 2>&1 |
注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)
Shell 文件包含
1 | a="abc" |
1 | 使用 . 号来引用test1.sh 文件 |
接下来,我们为 test2.sh 添加可执行权限并执行:
1 | chmod +x test2.sh |
注:被包含的文件 test1.sh 不需要可执行权限。
read
-p 输入提示信息
-t 等待时间(单位是秒)
-n 字符数,read只
-s 输入隐藏数据
1 | !/bin/bash |