Shell编程简介
Shell编程只需要一个能编写代码的文本编辑器和一个能解释执行的脚本解释器即可。
Linux的shell种类很多,主要学习Bash(Bourne Again Shell)
Bourne Shell (/usr/bin/sh 或 /bin/sh)
Bourne Again Shell (/bin/bash)
C Shell (/usr/bin/csh)
…
首先在Linux中通过vim创建一个test.sh文件,这里的扩展名sh代表shell,可任意写,不影响脚本执行。
#!/bin/bash
echo "Hello World!"
其中 #! 是一个约定标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种shell。
echo命令用于向窗口输出文本。
运行Shell脚本
Shell脚本运行可以有两种方式:
- 作为可执行程序(脚本第一行需要写#!指定解释器)
- chmod 777 ./test.sh 表示给文件test.sh读写及可执行权限
chmod +x ./test.sh 表示将文件改为可执行状态
Linux文件的权限一般分为 读r:4 写w:2 可执行x:1 无权限-,若赋予某文件权限为 r-x ,即4+1=5 - 作为解释器参数(直接运行解释器,脚本第一行不需要指定解释信息)
一、Shell变量
- 定义变量
your_name="zhang"
注意变量名和等号之间不能有空格
- 使用变量
使用变量时在变量名前加符号 $ 即可,变量名外可加花括号以便区别。echo ${your_name}
- 只读变量
在变量名前使用readonly可以将变量定义为只读变量,只读变量的值不能被改变
#!/bin/bash
your_name="zhang"
readonly your_name
echo ${your_name}
- 删除变量
使用unset命令可以删除变量,但不能删除只读变量
unset your_name
二、Shell字符串
字符串可以用单引号、双引号,或不用引号
- 单引号
单引号字符中的任何字符都会原样输出,单引号字符串中的变量无效 - 双引号
双引号字符串里可以有变量,可以出现转义字符\ - 拼接字符串
- 获取字符串长度
在变量名前加 #
str="runoob"
echo ${#str}
输出结果为 6
- 提取子字符串
获取字符串中索引值为1到3的字符
your_name="zhang"
echo ${your_name:1:3}
输出结果为 han
- 查找子字符串
查找字符i或o的位置(哪个字母先出现就计算哪个)
string="runoob is a great site"
echo `expr index "$string" io` #输出4
注意:这里代码中的 ` 是反引号,位于ESC键下面
三、Shell数组
支持一维数组,不支持多维数组,且不限定数组大小。数组元素下标从0开始,获取数组中元素要利用下标。
- 定义数组
定义数组用圆括号将数组元素括起,每个数组元素以空格分隔
arr1=("aa" "bb")
可以单独定义数组的各个分量,此时可以使用不连续的坐标,且下标的范围没有限制
arr1=("aa" "bb")
arr1[3]="cc"
- 读取数组
读取数组元素的格式为 ${数组名[下标]}
下标使用 @ 或者 * 可以读取数组全部元素
arr1=("aa" "bb")
arr1[3]="cc"
echo ${arr1[0]} #输出 aa
echo ${arr1[2]} #不会有输出,因为下标2没有元素值
echo ${arr1[3]} #输出 cc
echo ${arr1[@]} #输出 aa bb cc
echo ${arr1[*]} #输出 aa bb cc
- 获取数组的长度
length=${#arr1[@]} #取得数组长度
length=${#arr1[*]} #取得数组长度
length=${#arr1[1]} #取得数组下标为1的元素的长度
四、Shell注释
以 # 开头即为注释
多行注释可通过以下方式
:<<EOF
注释内容
...
EOF
EOF可以用其他符号代替
:<<!
注释内容
!
五、Shell传递参数
在执行Shell脚本时传入参数 ,脚本中获取一般参数的格式为 $n ,n为数字,1代表第一个参数,2代表第二个参数…
0代表执行的脚本的文件名
#!/bin/bash
echo "file name ./test2.sh fir sec
"
echo "first: "
echo "second "
执行脚本
六、Shell基本运算符
则输出为
Shell运算符主要分为 算术运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符。
- 算术运算符
#!/bin/bash a=10 b=20 res=`expr $a - $b` echo ${res} res=`expr $a + $b` echo ${res} res=`expr $a \* $b` # *前需要加转义符 echo ${res} res=`expr $b / $a` echo ${res} res=`expr $b % $a` echo ${res} if [ $a == $b ] then echo "a=b" fi if [ $a != $b ] then echo "a!=b" fi
①表达式和运算符之间要有空格 ,如 $a + $b 而不能写成 b
②表达式要用反引号包含,在ESC键下边
- 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值为数字 - 逻辑运算符
- 字符串运算符
- 文件测试运算符
七、Shell echo命令
echo命令可以用于字符串、变量的输出等。echo命令输出会自动换行
echo "This is a string"
var="this is var"
echo ${var} #输出 this is var
echo -e "OK! \n" # -e开启转义
echo -e "ok! \c" # \c为不换行转义符
#!/bin/bash
#test.sh
echo "write this from test.sh to myfile.sh" > myfile.sh
#执行test.sh文件,则myfile.sh中将会出现上述字符串
echo ‘\sss${var}’ #输出结果为 \sss${var}
echo `date` #这里使用的是反引号,输出结果为当前日期
八、Shell printf 命令