shell脚本编程
1.1简介
- 什么是shell脚本
shell脚本: 就是一些命令的集合, 在脚本文件中可以有流程控制, 如顺序, 条件分支和循环等
脚本文件一般一.sh文件为扩展名, 但是不是必须的.
- 基本格式
命名格式
一般使用.sh为后缀命名文件 (这是一个约定, 不是必须的)
书写格式
# - 注释
# 第一行的内容
#! /bin/bash - 解析当前脚本文件使用的命令解析器
#! /bin/sh
bourne shell ->sh -> unix
bourne again shell -> bash
# 第二行开始
shell命令 1
shell命令 2
shell命令 3
- 执行脚本
- 脚本创建出来之后是一个普通文件 -> 没有执行权限
- 例子
chmod u+x xxx.sh
./xxx.sh -> 最常用的方式
sh xxx.sh
1.2 shell中的变量
- 如何定义变量
int a;
int number = 9;
# shell - 变量没有数据类型, 新变量定义必须初始化
value=123
value1="123"
value1="hello,world"
#赋值的时候=前后不能有空格
- 位置变量 - 执行shell脚本时候, 传递到内部的参数
- $0 - 脚本文件的名字
- $1 - 第一个参数
- $2 - 第二个参数
- $3 - 第三参数
- 例子
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
# 执行脚本
./test.sh 1 2 3 4 a b c d e f
# 输出结果
./test.sh
1 2 3 4 a b
- 特殊变量
$#: 表示参数的个数
$@: 表示全部的参数
$$: 当前进程的PID
$?: 程序执行完成之后的返回值
- 取普通变量的值
第一种方式: $变量名
$PATH
$value
第二种方式: ${变量名}
${PATH}
${value}
- 取命令执行之后的得到的值
第一种方式
value=$(shell命令)
第二种方式:
value=`shell命令`
1.3
awk 可以将文件拆分成功若干行, 根据指定的分隔符, 再将每一行拆分成若干列, 默认按照空格或tab进行拆分
- 基本语法格式
§ awk 参数 '条件{处理动作}' 操作的文件或数据
§ awk 参数 '/正则表达式{处理动作}' 操作的文件或数据
- 指定分隔符的参数: -F
-F分隔符
如果不指定分隔符, 默认是按照空格或者tab进行拆分
- 如何使用变量取出某一列?
$0 - 当前行
$1 - 拆分的第一列
$2 - 拆分的第二列
$3 - 拆分的第三列
...
打印某一列的值
print $n
1.4 条件判断语法 - if
# 条件判断语句和[ 判断语句 ]左右必须要有空格间隔
if[ 判断语句 ];then
处理语句
处理语句
fi
# 或者
if[ 判断语句 ]
then
处理语句
处理语句
fi
if [ 判断语句 ];then
处理语句
处理语句
elif [ 判断语句 ];then
处理语句
处理语句
else
处理语句
处理语句
fi
2.5 循环控制
循环:
for语句和while
例1:
for var in apple pear banana
do
echo $var
done
例2:打印当前所有的文件
for file in `ls`
do
echo $file
done
例3:求1-100的和
sum=0
for i in {1..100}
do
sum=$[$sum+$i]
done
echo "sum==[$sum]"
如果一个文件名字为: file.xxx, 想去掉~~得到file可以: basename file.xxx ".xxx"
使用这种方法可以获得文件名字去掉扩展名后的名字: 如: basename test.sh .sh
案例: 某个目录下有a.bak b.bak c.bak d.bak, 要求把扩展名去掉, 变成a b c d
mv a.bak $(basename a.bak .bak)
while的用法:
案例: 求1-10的和
sum=0
i=0
while [ $i -le 10 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo "sum==[$sum]"
1.5补充
1. 查看脚本命令解析器
cat /etc/shells
2. 查看当前使用的脚本 echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
echo $SHELL
3. 查看环境变量的值
echo $环境变量