Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Shell 环境
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为#!/bin/bash。
#!告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
第一个 Shell 脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 b.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行。
输入一些代码,第一行一般是下图
"#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
如遇到下列错误原因为权限不够。使用chmod命令为root使脚本具有执行权限
[root@192 myshell]# ./b.sh
-bash: ./b.sh: Permission denied
[root@192 myshell]# chmod 744 b.sh
chmod +x ./b.sh #使脚本具有执行权限
./b.sh #执行脚本
注意,一定要写成 ./b.sh ,而不是b.sh,要用 ./test.sh 告诉系统说,就在当前目录找。
[root@192 myshell]# ./b.sh
Hello World !
Shell变量
Shell 变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要)
注意,变量名和等号之间不能有空格。
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可
your_name="wangyy"
echo $your_name
echo ${ your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
比如:
for skill in Ada Coffe Action Java do
echo "I am good at ${ skill}Script"
done
如果不给skill变量加花括号,写成echo “I am good at $skillScript”,解释器就会把 $skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
这样写是合法的,但注意,第二次赋值的时候不能写 $your_name=“alibaba”,使用变量的时候才加美元符( $)。
Shell 字符串
单引号
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
拼接字符串
your_name="wangyy"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
输出
获取字符串长度
echo ${#greeting}
提取子字符串
`echo ${ greeting:0:5} 输出hello
查找子字符串
echo `expr index "$greeting" name`
Shell 数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制。
读取数组
读取数组元素值的一般格式是:
${ 数组名[下标]}
例如:
valuen=${ array_name[n]}
valuen=${ array_name[@]}
@为所有数组 n为数组标识
shell注释
以"#"开头的行就是注释,会被解释器忽略。
sh里没有多行注释,只能每一行加一个#号
如:
如果遇到大段的代码需要临时注释起来,过一会儿又取消注释,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
Shell 传递参数
Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
Shell 数组
Shell 数组
与大部分编程语言类似,数组元素的下标由0开始。
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 ... valuen)
实例:
my_array=(A B C D)
我们也可以使用下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组
读取数组元素值的一般格式是:
${ array_name[index]}
实例:
my_array=(A B C D)
echo "第一个元素为: ${ my_array[0]}"
echo "第二个元素为: ${ my_array[1]}"
echo "第三个元素为: ${ my_array[2]}"
echo "第四个元素为: ${ my_array[3]}"
获取数组中的所有元素
使用@ 或 * 可以获取数组中的所有元素,例如:
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为: ${ my_array[*]}"
echo "数组的元素为: ${ my_array[@]}"
执行脚本,输出结果为:
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同但是要在数组名前加入#,例如:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组元素个数为: ${ #my_array[*]}"
echo "数组元素个数为: ${ #my_array[@]}"
输出结果为: