官方文档
https://www.gnu.org/software/bash/manual/bash.html
-
什么是Shell编程
- Shell是linux系统的用户界面,提供了用户与内核的一种接口。
- Shell是C语言程序编写的。C语言及是命令语言,也是程序的设计语言。
- Linux本身没有图形化界面,所有任务都是通过命令来完成的。
-
在Linux系统中
- /bin/sh 软连接集 指向 /bin/bash工具
- 重定向
文件描述符
文件描述符0: 标准输入 /dev/stdin
文件描述符1: 标准输出 /dev/stdout
文件描述符2: 标准输出错误 /dev/stderr
# 单行注释
:<<!#
多行注释
!
ls -l > irohane.txt
#把ls 命令输出的消息保存到 irohane.txt文件中,以覆盖的方式保存
ps >> irohane.txt
#将ps 输出附加到文件的尾部
kill 123 1>hello.txt 2>>error.txt
#杀掉pid 123的进程 将输出信息保存到hello.txt中 然后 将错误输出到error.txt中
kill 123 &>hello.txt
# 也可以使用&> 将标准和错误输出到hello.txt中
# 重定向输入
more < hello.txt
#把hello.txt的内容输入到more程序
- 管道
在shell 中可以通过管道操作符 | 连接进程
不同进程间传递数据
ps>psout.txt
sort psout.txt > psout.txt
#利用管道符更加简单的完成功能
ps | sort > psout.txt
- shell 脚本
创建一个脚本main.sh
#! /bin/sh
#表注释
#第一行表示指明系统用什么解释器执行代码
echo "helloworld"
exit 0 #程序结束返回0表正常
变量类型
类型 | 范围 |
---|---|
局部变量 | 只在当前的Shell中生效,使用local修饰 |
全局变量 | 默认都是全局变量 |
环境变量 | 所有程序,包括Shell启动程序,都能访问($PATH) |
特殊变量 | Shell变是由Shell程序设置的特殊变量 |
#!!!注意
(☆▽☆)
1. 变量名和等号之间不能有空格
2. 不要跟系统已有的环境变量重名
3. 只能含字母,数字和下划线,不能以数字开头
4. 不能使用关键字
#变量使用
var_name="helloworld" #默认都是全局变量
local name="helloworld" #局部变量,通常在函数中使用
echo $var_name #变量访问前要加$
echo ${var_name}#数组的方式需要使用这一种
echo $PATH
----------------单引号/双引号
var_show='helloworld'
var_msg="helloworld"
name="xiaobai";
a='$name' //单引号不会转义,也不会使用变量
b="$name" //双引号可以转义,也可以使用变量
#结果
a-> $name
b-> xiaobai
----------------字符串操作
#字符串拼接
var_name="小明";
var_msg="hello${var_name}";
echo $var_msg;
#字符串长度
#在字符串前面表示取字符串长度
string="hello";
echo ${#string}; //返回5
#字符串查找
search_string="hello,xiaobai";
echo `expr index "$search_string" x` //返回7 `ESC下面那个 注意空格
---------Shell数组
定义:变量名=(值1 值2 值3 值4 ......) //使用空格隔开
变量名=([0]=值1 [1]=值2)
赋值
array_name[0]=value0;
array_name[1]=value1;
array_name[n]=valuen;
访问
valuen=${array_name[n]};
#@/*用于 获取所有元素
echo ${array_name[@]};
echo ${array_name[*]};
#获取数组长度
echo ${#array_name[*]};
添加
array_name[$(#array_name[*])]=99; //在最后添加元素 -!添加元素数组下标必须是连续的
追加
array_name+=(${array_name[*]},100,200,300})
参数变量:
运行脚本时带有参数,一些而外的变量会被创建,这些变量可以通过$n 来获取
hello.sh 参数1 参数2
hello.sh xiaobai xiaohei //xiaobai xiaohei
特殊字符
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 将参数变为一个字符串的形式显示出来 |
$$ | 脚本运行当前的ID号 |
$! | 后台运行最后一个进程的ID号 |
$@ | 和$*相同,使用时加引号,并在引号中返回参数 |
$- | 显示Shell使用的当前选项 |
$? | 显示最后命令退出的状态,0表示没有错误,其他值表示有错误 |
$HOME | 当前用户的家目录 |
$PATH | 以冒号分隔用来搜索目录列表 |
$USER | 当前用户名称 |
hello.sh
#!/bin/sh
#获取全部参数
echo $*
echo $@
#获取参数个数
echo $#
#获取第n个参数
echo $3
#s0 shell脚本名称
echo $0
#$? 退出码
echo $? //运行之后返回当前状态码
运行
./hello.sh 参数1 参数2
Set命令
Set可以设置环境变量
export TEST="hello";
set TEST="hello";
输入命令:
read name #读取用户输入以回车结束
echo "$name test"
输出命令:
输出到控制台上可以通过echo,printf(带格式)
\# - 表示左对齐 10表示占10个字符,s表示字符串
printf "%-10s %-8s %-8s\n" 名字 姓名 编号
算数运算
Bash中支持三种算数方式
expr命令计算
val=`expr 2+2` #也可以写成$(expr 2 + 2 )
let运算-用于执行一个或者多个表达式,变量计算中不需要加上 $ 来表示变量。
let a=5+4; let 计算中不允许有空格
执行ls 命令后显示结果`ls`
echo `ls`
echo $(ls)
使用$(())来计算算数运算
Number1=$((5+5)) //= - % * 都可以 !*注意做转义