一、shell编程基础
打开文本编辑器(如vim),新建一个文件 test.sh
#!/bin/bash
#! 告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。其后路径便是解释此脚本文件的 Shell 程序。
/bin/sh test.sh
/bin/php test.php
这种方法也可以执行脚本,此时代码第一行则不需要写 #!
Ctrl+L 清屏 ; Ctrl+U 剪切光标前的 ; Ctrl+K 剪切光标后的 ; Ctrl+Y 粘贴剪切的内容
可以用分号分隔毫不相关的命令,实现批处理。
通配符:
二、Shell变量
0、<基本说明>
Shell 默认所有变量都是字符串类型。
set -u 设置成“调用未声明变量会报错”
不加选项的 set 是 “查看(几乎)所有变量”;env 也能看一部分环境变量
$PATH 是路径环境变量,与win不同的是,它以冒号作为分隔。
1、<变量基本操作>
定义变量时,不需要其他声明符号,如:your_name="runoob.com"
注意,变量名和等号之间不能有空格。
定义用户环境变量时:加一个前缀 export (区别是在子shell中也可访问到)
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
echo ${your_name} 其中大括号不是必需的,加了方便区分。
使用 readonly 命令可以将变量定义为只读变量,如:
your_name="runoob.com"
readonly your_name
使用 unset 命令可以删除变量,如:unset your_name
unset 命令不能删除只读变量。
2、<变量类型>:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
3、<Shell 字符串>:
字符串可以用单引号,也可以用双引号。
单引号字符串的限制:
1) 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
2) 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,将变量作为字符串使用。
双引号字符串的优点:
1) 双引号里可以有变量
2) 双引号里可以出现转义字符
获取字符串长度:
string="abcd"
echo ${#string}
字符串分片:(索引从0开始)
echo ${string:1:4}
4、<Shell 数组>:
只支持一位数组,下标从0开始。数组是动态的。
定义方法:数组名 = (值1 值2 ... 值n)
读取方法:${数组名[下标]}
* 使用 @ 符号可以获取数组中的所有元素
取得数组元素的个数:length=${#array_name[@]}
* @可以换成*
取得数组单个元素的长度:lengthn=${#array_name[n]}
5、<注释>:
单行:#
多行:(EOF可换成 ' 或者 !)
:<<EOF
注释内容...
EOF
6、<变量测试>:
x=${y-new} 若y不存在,x为new;若y存在,x为y。
三、向shell脚本传参
参数用$数字来访问,如 $1,$2,$3 等。其中:
$0 是文件名;10以上要用大括号,如 ${10}
$* 是所有参数(以单个字符串显示);$@ 也是所有参数(以多个字符显示出来)
$# 是参数个数(不含文件名)
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$$ 脚本运行的当前进程ID号;$! 后台运行的最后一个进程的ID号
$- 显示Shell使用的当前选项,与set命令功能相同。
四、运算符
1、<数学运算>
方法1:val=$(expr 2 + 2)
* 也可以用反引号。
* 运算符与运算数之间一定要加空格!
* 乘号前必须加反斜杠才能实现运算,即 \*
方法2:val=$[a+b]
【推荐】方法3:val=$((a+b))
方法4: let命令,用于执行一个或多个表达式。如:let int++ ; let c=$a+$b
2、<关系运算>
* 只能用于数字,不能用于字符串,除非字符串的值为数字。
-eq 是否相等;-ne 是否不等;-gt 是否大于;-lt 是否小于
-ge 是否大于等于;-le 是否小于等于
* 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。
* 除此之外,还可以使用test命令!
test $[num1] -eq $[num2] 等价于 [$num1 -eq $num2]
3、<布尔&逻辑运算>
* 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。
! 非运算;-o 或运算,也可写成 ||;-a 与运算,也可写成 &&
* 逻辑运算符必须用两个中括号:
[[ $a -lt 100 && $b -gt 100 ]] 等同于 [ $a -lt 100 -a $b -gt 100 ]
4、<字符串运算符>
* 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。
= 是否相等;!= 是否不等;(不用 ==)
-z 长度是否为0;-n 长度是否不为0;$ 是否不为空
* -n后的必须要加双引号,如 [-n "$a"]
* [$a] 直接这样写就可以判空。
* 除此之外,前四个运算也可以换成对应的test指令。
5、<文件测试运算符>
首先定义file="文件路径",然后再进行下面的操作.
必须用方括号。
-d 是否是目录;-f 是否是普通文件;-r/-w/-x 是否可读/可写/可执行
-e 检测文件(包括目录)是否存在
-L 文件是否存在?是否是一个符号链接?
6、<test命令>
* 另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
if test -e ./notFile -o -e ./bash
五、echo命令
echo -e 使得输出语句的转义字符生效
echo -e "\e[1; 颜色 内容 \e[0m" 带颜色输出
echo -n 不换行输出(也可用转义字符实现echo -e "abc\c")
输出重定向(到文件):
命令 [&]> myfile
> 是覆盖 ; >> 是尾增 ; & 使得无论是正确还是错误输出,都能写入文件。
命令 >>文件1 2>>文件2 正确输出写入文件1,错误输出写入文件2
echo `命令` 可以执行命令,并打印出结果,使用的是反引号。
也可以是$(命令)
六、printf命令
和C语言一样的用法,只不过不用括号和逗号。
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
倘若格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用:
printf "%s\n" abc def
七、流程控制
sh的流程控制不可为空,例如C语言中 else{//nothing} 这种。
1、<选择结构>:
如果要全部写在一行里(用于命令行):
有时候可以用逻辑运算来实现选择:
2、<循环结构>
循环结构也可以写成一行,用分号隔开即可。
* items可以为列表或字符串
循环可用于读取键盘信息。
例如 while read INPUT; do echo "$INPUT is good!"; done
可以不断地读取用户的输入,并将输入存入变量INPUT中。
如果想要实现死循环,则while后的条件处填写 ":" 或者 " true "
只要condition还为假,就继续循环,直到为真。
condition通常为条件表达式(用中括号括起来的)
case语句类似switch语句。
每一模式必须以右括号结束。取值可以为变量或常数或者正则。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;
如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
例如:
并列的条件则以 | 作为分隔:
循环控制:break跳出所有循环、continue跳出所在循环。
八、其他函数
1. cut 命令提取文件内容 (分隔符不支持空格)
2. read:类似python的 input,形式为
read [-n 允许输入的位数] [-s ] -p "message" 变量 ; -s 为隐藏输入的数据
2. read:类似python的 input,形式为
read [-n 允许输入的位数] [-s ] -p "message" 变量 ;-s 为隐藏输入的数据