Shell 是一个用C 语言编写的程序,通过Shell用户可以访问操作系统内核服务。它类似于DOS 下的 command 和后来的 cmd.exe 。Shell即是一种命令语言,又是一种程序设计语言。
linux 的Shell 种类众多,可以通过 cat ./etc shells 查看系统中安装的shell。
Bash 由于易用和免费,在日常工作中被广泛使用,同时,Bash也是大多数linux 系统默认的Shell
基本格式
shell脚本第一行 #! 是一个约定的标记,他告诉系统这个脚本要使用什么解释器来执行。
#!/bin/sh
一个简单的例子 vim hello.sh
#! /bin/sh
# 我是注释
echo "hello"
运行的两种方式
- 第一种方式: sh hello.sh 或者 bash hello.sh
- 第二种方式:添加执行权限
chomd -R 777 hello.sh
shell变量
定义
语法格式: 变量=值。
注意:变量名和等号之间不能有空格,同时遵循以下规则:
- 首字符必须为字母
- 中间不能有空格,可以使用下划线
- 不能使用标点
- 不能使用bash里的关键字
例:
your_name=hello
使用
使用一个定义过的变量,只要在变量名前加$ 即可。
例如:
echo $your_name
类型
- 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效 - 环境变量
所有的shell窗口全部共享 - shell变量
只在当前脚本有效,其他脚本无效
参数传递
位置参量 :位置参量是一种特殊的内置变量,通常被shell脚本用来从命令行接收参数,或被函数用来保存传递给他的参数。
符号 | 说明 |
---|---|
$0 | 当前脚本的文件名 |
$1-s9 | 第一到第九个位置参量 |
${10} | 第10个位置参量,以此类推还有${11}… |
$# | 位置参量的个数 |
$* | 一单字符串显示所有位置参量 |
$@ | 未加双引号与$*相同 |
$$ | 脚本运行的当前进程号 |
$! | 最后一个后台运行的进程的进程号 |
$? | 显示前面最后一个命令的推出状态,0代表没有错误,其他值代表有错误 |
实例:
#! /bin/sh
# 我是注释
echo "hello"
echo "当前脚本的名称"$0
echo "第一个参数"$1
echo "第二个参数"$2
运行时输入参数
sh hello.sh ab ac
运算
原生bash不支持简单运算,但是可以使用其他命令来实现,例如expr。
注意:表达式和运算符之间要有空格
#! /bin/sh
a=4
b=20
# 加法运算
echo `expr $a + $b`
# 减法运算
echo `expr $a - $b`
#乘法运算 注意*号前面要加反斜杠
echo `expr $a \* $b`
# 除法运算
echo `expr $a / $b`
还可以使用(())、$[]进行算术运算
判断语句
-
关于某个档名文件类型的判断:如 test -e filename
* -e 该档名是否在用 * -f 该档名是否存在且为档案(file) * -d 该文件名是否存在且为目录(directory)
-
关于档案权限侦测:如 test -r filename
* -f 侦测档名是否存在且具有可读权限 * -w 侦测档名是否存在且具有可写权限 * -x 侦测档名是否存在且具有可执行权限
-
关于两个整数之间的判断:
* -eq 两数值相等equal * -ne 两数值不等not equal * -gt 大于 greater than * -lt 小于 less than * -ge 大于等于 greater than or equal * -le 小于等于 less than or equal
-
判定字符串的数据
* test -z string 判定字符串是否为0,若为0,结果为true * test -n string 判断字符串是否非0,非0,结果为true * test str1=str2 判断字符串是否相等,相等为true * test str1!=str2 判断字符串是否相等,不相等为true
if 判断
语法:
if [判断语句];then
执行命令
fi
多重条件
if [判断语句];then
执行命令
else
执行命令
fi
更复杂的情况
if [判断语句];then
执行命令
elif [判断语句]; then
执行命令
else
执行命令
fi
for循环
实例:
for var in 1 2 3 4 5
do
echo ${var}
done
num=10
s=0
for((i=0;i<${num;i=i+1}))
do
s=$((${s}+${i}))
done
echo ${s}
while循环
语法
while [condition]
do
执行命令
done
until [condition]
do
执行命令
done
实例:从文件中逐行读取数据
#!/bin/bush
SLAVE_FILE=/opt/app/hadoop-2.5.0/etc/hadoop/slaves
cat ${SLAVE_FILE} | while read line
do
echo ${line}
done
case语法
#! /bin/sh
echo '输入1到4之间的数字'
echo '你输入的数字是'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1到4 之间的数字'
;;
esac
函数
函数在使用前需要定义,调用函数使用其函数名即可。
[ function ] funname [ () ]
{
action;
[ return int; ]
}
函数参数
通过为止参数传参
实例
#! /bin/bash
hello(){
echo "第一个参数为"$1
echo "第二个参数为"$2
}
hello abc 123
或 在命令行传参
hello $! $2