Shell脚本之 笔记一
一、基础
- 脚本开头 像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
- 运行shell (chmod +x file 加上执行权限,否则会提示无执行权限)
一定要写成 ./test.sh,而不是 test.sh运行其它二进制的程序也一样,直接写 test.sh
linux 系统会去PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目 录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找
- 作为解释器参数运行脚本(这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。)
/bin/sh test.sh
/bin/php test.php
- ubuntu(linux)下 source、sh、bash、./ 执行脚本的区别是什么?
- source filename (在当前 bash 环境下读取并执行 FileName 中的命令。该 filename 文件可以无 "执行权限")
- sh filename 或 bash filename (:打开一个子 shell 来读取并执行 FileName 中命令。该 filename 文件可以无 "执行权限")
- ./ filename (打开一个子 shell 来读取并执行 FileName 中命令,该 filename 文件需要 "执行权限")注:运行一个 shell 脚本时会启动另一个命令解释器。
二.变量
1.定义变量时,变量名不加美元符号($,PHP语言中变量需要) 如 name="job"
注意,变量名和等号之间不能有空格,
2.使用变量(已定义),只要在变量名前面加美元符号即可 echo ${name}
echo "I am good at ${skill}Script"
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
推荐给所有变量加上花括号,这是个好的编程习惯
3.只读变量 (使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变)
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
4.删除变量 unset variable_name
5.变量类型 局部变量\环境变量\shell变量
6.字符串 (字符串可以用单引号,也可以用双引号,也可以不用引号)
str='this is a string'
单引号: 任何字符原样输出,字符串内变量 无效. 字符串中不能出现单独的单引号,转义也不行.
可成对出现用作字符拼接
双引号: 双引号里面可以有变量, 双引号里面可以出现转义字符
str="Hello, I know you are \"$your_name\"! \n"
7.获取字符串长度 string="abcde" 字符串有
echo ${#string} #输出5 变量为数组时,${#string} 等价于 ${#string[0]}:
expr length "$string" #计算字符串长度
注意:字符串里面有空格的话,需要加双引号,便于length计算字符串长度
8.提取子字符串
echo ${string:1:4} #从第2字符开始截取4个字符(注意:第一个字符的索引值为 0)
echo ${string:7} #从左边第8个开始到结束
echo ${string:0-7:3} # 0-7表示从右边算第七个开始, :3表示字符个数
echo ${string:0-7} #从右数第7个开始到结束(左边第一个用0表示,右边第一个用0-1表示)
echo ${var#*//} # 变量var #是运算符, *// 表示从左边开始 删除第一个//左边的所有
# 表示删除指定字符的左边 (% 表示从右边)
##表示删除指定字符的左边 (%% 表示从右边)
9.查找子字符串 (注意: 以上脚本中 ` 是反引号,而不是单引号 ')
string="runoob is a great site"
echo `expr index "$string" io` # 输入4 查找字符i或o的位置,计算先出现的那个
10.数组 (bash只支持一维数组. 用括号来表示数组,元素之间用"空格"符号分割开)
数组名=(值1 值2 值3 ...值n) my_array=(a b "c" d)
读取数组 ${数组名[下标]} 例:value=${array_name[n]}
echo ${array_name[@]} #使用@获取数组所有元素
length=${#array_name[@]} #获取数组元素个数
length=${array_name[*]} #获取数组元素个数
length=${arrya_name[n]} #获取单个元素的长度
关联数组 (用 declare 来声明) 例:declare -A array_name (# -A 用于声明关联数组)
11.注释 以 # 开头的就是注释
多行注释 (:<< 自定义字符 ... 自定义字符)
:<<EOF
...
EOF
12. expr 使用此命令时,运算符左右必须加空格.( 乘法需要转义 * 写成 \*)
13.read 用于获取键盘输入信息 read [-option] [variable] (-p 后面写 提示信息)
read -p "input a val:" a #获取键盘输入的 a 变量数字
read -p "input b val:" b #获取键盘输入的 b 变量数字
r=$[a+b] #计算a+b的结果 赋值给r 不能有空格
echo "result = ${r}" #输出显示结果 r
14.shell 传递参数 ($n,n代表数字,第几个参数) 含有空格的参数,只需要在参数传递的时候加双引号就可以
$0 表示执行的文件名
$1 第一个参数,$2 第二个参数
其他参数:
$# 传递的参数个数
$* 以单字符串显示所有参数 ($@相同,使用时加引号,能返回每个参数)
$$ 当前脚本的进程ID号 / $! 后台运行的最后一个进程的ID号
$- 显示shell的当前选项,与set命令功能相同
$? 显示最后命令的退出状态. 0表示无错误,其他任何表名有错误
15.运算符 (Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试)
中括号 [] 与其中间的代码应该有空格隔开
两个数相加(注意使用的是反引号 ` 而不是单引号 ')完整的表达式要被 ` ` 包含
乘号(*)前边必须加反斜杠(\)才能实现乘法运算
原生bash不支持简单的数学运算,可用其他命令实现,例如 awk 和 expr,expr 最常用
算术比较: [$var -eq 0 ] #变量是否为0
文件属性测试 [ -e $var ] #文件是否存在 / [ -d $var ] #是否是目录
字符串比较 [[ $var1 = $var2 ]]
[] 可以用 test 命令 代替