Shell 学习文档

环境

系统: Centos7

版本: GUN bash, version4.2.46

学习过程

第一个shell脚本

1
2
3
4
5
6
7
# #!是一个约定的标记, 会告诉系统该脚本需要的解释器, 即哪一种shell
# First Form
#!/bin/bash
echo "Hello World!"
# Second Form
#!/bin/sh
echo "Hello World!"

运行Shell脚本

可执行程序

运行二进制程序, 直接写shell.sh, linux系统会找不到, linux系统会去PATH里寻找, 一般只有/bin, /sbin, /usr/bin, /usr/sbin等在PATH里, 要用./提示在当前目录找.

1
2
3
4
# 使脚本具有执行权限
sudo chmod u+x ./shell.sh
# 执行脚本
./shell.sh

利用解释器参数

1
2
/bin/sh shell.sh
/bin/php test.php

Shell变量

定义变量时, 变量名前不加美元符号.

命名只能使用英文字母, 数字和下划线, 首个字符不能以数字开头

中间不能有空格, 可以使用下划线_

不能使用标点符号

不能使用bash里的关键字(利用–help保留关键字)

利用语句给变量赋值.

1
2
3
# 将/etc下目录的文件名循环出来
for file in `ls /etc`
for file in $(ls /etc)

使用变量

1
2
3
# 使用一个定义过的变量, 只要在变量名前面加美元符号
# {}是为了帮助解释器识别变量的边界
echo ${variable_name}

只读变量

1
2
3
myRead="order"
# 使用readonly命令可以将变量定义为只读变量, 该变量的值不能改变
readonly myRead

删除变量

1
2
3
# 使用unset命令可以删除变量
unset variable_name
# 该命令不能删除只读变量

变量类型

局部变量: 该变量在脚本或命令中定义, 仅在当前shell实例中有效, 其他shell中不能访问局部变量

环境变量: 所有的程序, 包括shell启动的程序, 都能访问环境变量, 有些程序需要环境变量来保证其正常运行

shell变量: shell变量是由shell程序设置的特殊变量, 该变量保证了shell的正常运行

Shell字符串

单引号

单引号里的任何字符都会原样输出, 单引号字符串中的变量是无效的

单引号字串中不能出现单独的一个的单引号(也不能对单引号进行转义), 但可以成对出现, 作为字符串拼接使用

1
str='this is a single quote'

双引号

双引号里可以有变量

双引号里可以出现转义字符

1
2
3
4
var='double'
str="this is a \"$var\"! \n"
# -e 可以使输出变量中的换行符起作用
echo -e $str

拼接字符串

1
2
3
4
5
6
7
8
var="wiidu"
# 使用双引号拼接
double_split1="Hello,"$var"."
double_split2="Hello, ${var}."
# 使用单引号拼接
single_split1='Hello, '$var'."
single_split2='Hello, ${var}.' # 无效
echo $single_split1 $single_split2

获取字符串长度

1
2
3
string="length"
# 输出变量时在变量前加上#
echo ${#string} #输出字符串长度

提取子字符串

1
2
3
string="wiidu is my bolg"
# 从字符串的第二个字符串开始截取4个字符
echo ${string:1:4}

查找子字符串

1
2
3
string="wiidu is my blog"
# 查找字符i或o的位置(哪个字母先出现就计算哪个, 且该位置是从1开始计算的)
echo `expr index "$string" io` #反引号

Shell数组

bash支持一维数组, 不支持多维数组, 且没有限定数组的大小, 数组的下标类似于C语言.

定义数组

1
2
3
4
5
6
7
8
9
10
11
12
# 用括号来表示数组, 数组元素用空格符号分割
array_name=(num1 num2 ... numn)
array_name=(
value1
value2
value3
...
)
# 单独定义数组的各个分量
array_name[0]=value1
array_name[1]=value2
array_name[2]=value3

读取数组

1
2
3
4
5
6
# 读取数组元素值的格式
${array_name[index]}
# 赋值
value=${array_name[n]}
# 使用@符号可以获取数组中的所有元素
echo ${array_name[@]}

获取数组的长度

1
2
3
4
5
# 获取数组元素的个数
length=${#array_name[@]}
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}

Shell注释

单行注释: #

多行注释: 可以将要注释的代码用一对花括号括起来, 定义为一个函数, 没有调用, 就相当于注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 多行注释
:<<EOF
注释内容
注释内容
...
EOF
# EOF也可以换成其他符号
:<<'
注释内容
...
'
# 或者
:<<!
注释内容
...
!

Shell传递参数

在执行Shell脚本时, 向脚本传递参数, 脚本内获取参数的格式为: $n. n代表一个数字, 1为执行脚本的第一个参数, 2为执行脚本的第二个参数, 依次类推.

1
2
3
4
5
6
7
8
9
10
# 传递三个参数, 并分别输出
#!/bin/bash

echo "Shell 传递参数实例";
# $0 为执行的文件名
echo "执行文件名: $0";
# $1... 向脚本传递的参数
echo "第一个参数为: $1";
echo "第二个参数为: $2";
echo "第三个参数为: $3";
参数 功能
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
[email protected] 与$*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示Shell使用的当前选项
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

在为Shell脚本传递的参数中如果有空格, 应该使用单引号或着双引号将该参数括起来, 以便于脚本将这个参数作为整体来接受.在有参数时, 可以使用对参数进行校验的方式处理已减少错误发生.

0%