1. #!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。
2. 变量命名规则:
①首个字符必须为字母(a-z,A-Z)
②中间不能有空格,可以使用下划线(_)
③不能使用标点符号
④不能使用bash里的关键字(可用help命令查看保留关键字)
3. 为了正确使用变量,推荐给所有的变量均加上括号。
赋值的时候不加美元符,引用的时候才加。
只读变量指令为readonly para
删除变量指令为unset para,变量被删除后不能再次使用。unset 命令不能删除只读变量。
变量类型主要分局部变量和环境变量,以及shell变量。
4. Shell字符串使用:
①单引号:单引号里的任何字符都会原样输出,单引号字串中不能出现单引号(对单引号使用转义符后也不行)
②双引号:双引号里可以有变量,双引号里可以出现转义字符。
拼接字符串:strcat_1="hello, ${your_name} !"
获取字符串长度加#:echo ${#string}
提取字符串:echo ${string:2:5} 从第二个字节开始,五个字符
查找字符串:echo `expr index "$string" is` ("`" 是反引号,1前面,而不是单引号 "'"),查找字母i或者s的位置。
4.shell数组:用括号来表示数组,数组元素用"空格"符号分割开。
数组名=(值1 值2 ... 值n)
①读取数组:${数组名[下标]}
②获取所有数组元素:${array_name[@]}
③获取数组长度:length=${#array_name[@]} 或者${#array_name[*]}
④获取单个元素长度:length=${#array_name[n]}
5.shell传递参数
脚本传递参数,获取参数的格式为:$n,其中 $0 为执行的文件名,$1为第一个参数
特殊字符含义:
①$# 参数个数。
②$* 单字符串显示所有参数,如"$1 $2 … $n"
③$@ 单字符加””显示所有参数,如"$1" "$2" … "$n"
④$? 命令退出状态。
6.shell基本运算符
算数、关系、布尔、字符串、文件测试运算符。
①算数运算通过expr、awk来实现,注意表达式和运算符之间要有空格,完整的表达式要被 ` ` 包含。如value=`expr $a + $b`
常用运算符有+、-、*、/、%、=、==、!=,注意*必须写成\*才是乘法,条件表达式要放在方括号之间,并且要有空格,例如 [ $a == $b ]。
②关系运算符:只支持数字,常用的有-eq相等、-nq不相等、-gt大于、-lt小于、-ge大于等于、-le小于等于。例如if [ $a -eq $b ],在if、[]、-eq和变量之间都有空格。
③布尔运算符有!非、-o或、-a与。例如[ ! false ] ,[ $a -lt 20 -a $b -gt 100 ]。
④逻辑运算符有&&和、||或。例如[[ $a -lt 100 && $b -gt 100 ]]
⑤字符串运算符有=相等、!=不相等、-z长度为0、-n长度不为0、[ $str ]字符串为空。例如[ $a = $b ] 、[ -z $a ] 、[ $a ]
⑥文件测试运算符有-b块设备、-c字符设备、-d目录、-f普通文件、-p有名管道、-r可读、-w可写、-x可执行、-s文件为空、-e是否存在。例如if [ -e $file ]、if [ -d $file ]
7.echo指令
①显示换行echo -e "Ok! \n" # -e 开启转义。
②显示不换行echo -e "Ok! \c" # -e 开启转义 \c 不换行。
③显示结果到定向文件echo "It is test" > file1。
④原样输出用’’单引号echo ‘$name\"’。
⑤显示执行命令用``(1前面的符号)echo `date`。
8.printf指令
printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。
①默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。
②单引号和双引号效果一样,例如printf '%d %s\n'2 "abc"。
③转义有\b后退、\c抑制换行忽略后面内容、\n换行、\r回车。
9.test指令
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
①数值测试:-eq等于、-ne不等于、-gt大于、-lt小于、-ge大于等于、-le小于等于,例如if test $[num1] -eq $[num2]。
②字符串测试:=等于、!=不等于、-z长度为0、-n长度不为0为真,例如if test $num0 = $num1。
③文件测试:-e文件存在、-r/w/x文件存在且可读写执行、-s文件存在且文件不为空、-d/f/c/b文件存在且为目录/普通文件/字符文件/块文件,例如if test -e ./bash。
④支持逻辑运算符:与( -a )、或( -o )、非( ! ),例如if test -e ./notFile -o -e ./bash。
10.流程控制
①if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
②for循环 当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值,n列表可以包含替换、字符串和文件名
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
③while循环 while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。
while condition
do
command
done
例如:
ind=1
while(( $ind<=5 ))
do
echo $ind
let "ind++"
done
④无限循环
while :或while true
do
command
done
或for (( ; ; ))
⑤until循环:至少执行一次。
until condition
do
command
done
⑥case指令
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
⑦跳出循环
break:break命令允许跳出所有循环(终止执行后面的所有循环)
continue:不会跳出所有循环,仅仅跳出当前循环
11.函数
①可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
②参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)。
③函数返回值在调用该函数后通过 $? 来获得。
④函数参数:通过 $n 的形式来获取参数的值,$1表示第一个参数,当n>=10时,需要使用${n}来获取参数。特殊字符:$#传递参数个数、$*单字符显示所有传递参数、$@双引号返回每个传递参数、$?显示最后命令的退出状态。
12.输入输出重定向
①command > file输出重定向
②command < file输入重定向
③command >> file追加重定向
④n > file文件描述符为n重定向到file
⑤n >& m输出文件m/n合并
⑥n <& m输入文件m/n合并。
例如:command 2 > filestderr 重定向到 file
command > file 2>&1 stdout 和 stderr 合并后重定向到 file
command < file1 >file2 stdin 和 stdout 都重定向
command > /dev/null 执行某个命令,但又不希望在屏幕上显示输出结果
13.文件包含
. filename # 注意点号.和文件名中间有空格 或 source filename
例如:
tst1.sh 代码如下:
www="www.123.com"
tst2.sh 代码如下:
. ./tst1.sh
echo "地址是$www"
打印结果:
地址是www.123.com