1.shell是什么?
从用户角度:shell是用户与Linux沟通的桥梁
从程序员角度:shell本身是一种用C语言编写的程序
shell担任了翻译的角色,将用户输入的命令翻译成Linux能够识别的指令。
shell是一个命令解释器。
shell是一种编程语言。
shell是内核的保护壳。
2.shell类型
cat /etc/shells 查看当前系统上的shell
echo $SHELL 查看当前使用的shell
3.bash优点:
1.命令编辑
记忆使用过的指令,上下键可以找到之前的指令
history 查看历史指令
vim .bash_history 历史指令保存在该文件中,默认保存2000条记录
vim .bashrc -> HISTFILESIZE=200 可以修改最大保存记录的数
2.补全功能(table)
指令补全
文件名补全
3.命令别名(alias)设定功能
ls -al ->lm
设定别名:alias lm='ls -al'
alias rm='rm -i'
4.作业控制、前景背景控制 &
ctrl + z 让正在运行的程序切换到后台运行
jobs 查看正在运行的作业
fg 1/2/3切回到前台运行
使用前背景控制可以让工作更顺利
5.shell script
DOS 中有将一堆指令写一起的称为 批处理文件 (.bat)
Linux中shell script 功能更强
4.在bash中输入指令
command [-options] parameter1,parameter2,...
指令 选项 参数
1.指令与选项、参数之间以空格,不论空几格shell都视为一格
2.如果指令很长,可以用 符使指令连续到下一行
3.一般来说,选项是 -选项,有时需要写完整的名称 --选项
ls --help
5.管道(|)
一般用来连接进程
把前一个命令的输出作为下一个命令的输入
ps | sort | more
6.重定向
简单的说,就是将目前的所得数据转到其他地方
大于号 > 就是将输出结果导向到“>”后面的文件中
1.若文件不存在,会自动创建
2.若存在,先清空,再将数据写入
标准输入 代码0 stdin <
标准输出 代码1 stdout 1>
标准错误 代码2 stderr 2>
基本指令格式:
指令 > 设备/文件
指令 1> 设备/文件
指令 2> 设备/文件
指令 < 设备/文件
把正常输出和错误输出重定向到同一个文件中:
ls -l file 1> out.txt 2>&1
输入重定向<:
简单的说,就是将原来 需要由键盘输入的数据经由文件读入
more < err.txt
wc err.txt
输出行、单词数、字节数
ls QQQQQ 2> /dev/null (空设备)
----------------------------
shell语法:
变量
条件
程序控制
函数
变量:
1.环境变量
一般指在操作系统中用来指定系统运行环境的一些参数
PATH=$PATH:.
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
HOME
PWD
LANG
OLDPWD (cd -)
export PS1='[u@h:]$ '
1.永久的
使用export命令声明,并保存到配置文件中
2.临时的
2.自定义变量
1.最简单常用的例子就是路径名称
export myDir=/mnt/hgfs/中文路径
cd $myDir
2.另一个需要自定义变量的地方是脚本文件中(参考#define,修改维护更方便)
3.特殊变量
$? 表示上一个命令的退出码(返回值)
设定变量的规则:
1.变量与变量内容以"="连接
2.等号两边不能直接 接空格符
3.变量名只能是字母和数字,其中数字不能是开头字符
4.若有空格符,可用双引号或单引号将变量内容结合起来
5.可以通过在变量名前加一个$符号来访问它的内容
6.通常大写字符是系统预设变量,自定义变量可以使用小写字符,方便判断
条件:
test 条件
或 [ 条件 ]
测试字符串:
string1 = string2 相同
string1 != string2 不同
-n string 如果字符串不空,则结果为真
-z string 如果字符串为空,则结果为真
测试算术表达式:
expression1 -eq expression2 等于
-nq 不等于
-gt 大于(greater)
-lt 小于(little)
-ge 大于等于
-le 小于等于
!expression 如果表达式为真,则结果为,假反之亦然
测试文件条件:
-d file 是目录则为真
-f file 是普通文件则为真
-e file 文件存在则为真
-r file 文件可读则为真
-w file 文件可写则为真
-x file 文件可执行则为真
程序控制:
1.if语句
if 条件
then
语句
elif 条件
then
语句
else
语句
fi
注:if测试条件中 等号两边要有空格
如果用[]来测条件 []与条件之间也要有空格
第一个脚本程序:
1.#!/bin/bash 告诉系统,用#!后面的程序来执行我的脚本文件
2.其它行的#开头的是注释
3.echo 用来输出 (相当于printf),read用来输入,相当于scanf
4.脚本结束时,exit 0
脚本程序的执行:
1./bin/bash XXX.sh
2.chmod +x XXX.sh
./xxx.sh
2.for语句
for 变量 in 值1,值2,...
do
语句
done
`指令`:获取指令的执行结果
$(指令):获取指令的执行结果
3.while语句
while 条件
do
语句
done
#!/bin/bash
#这是我的第一个脚本,就是用来输出hello wrold
var="hello world"
echo $var
exit 0
#!/bin/bash
#这是用if语句来测试字符串
echo "你饿了吗?请回答YES 或 NO"
read var
echo $var
if [ "$var" = "YES" ]
then
echo "咱们等会就吃饭"
elif [ $var = "NO" ]
then
echo "咱们再玩会"
else
echo "输入不正确,请重新输入"
fi
exit 0
#!/bin/bash
#这是用if来测文件
read var
if [ -f $var ]
then
echo "这是一个文件"
elif [ -d $var ]
then
echo "这是一个目录"
else
echo 不支持这种格式
fi
exit 0
#!/bin/bash
#这是测试for循环
for var in apple pear grape
do
echo $var
done
exit 0
#!/bin/bash
#打印当前目录下以.sh结尾的文件
#for var in `ls *.sh` # `指令` :表示获取指令执行的结果
for var in $(ls *.sh)
do
echo $var
done
exit 0
#!/bin/bash
#这是while语句示例
#密码检查
echo "请输入密码:"
read var
while [ $var != "123456" ]; do
echo "密码不正确,请重新输入"
read var
done
echo "密码正确,登录成功"
exit 0
作业:
求和1-100
学习for语句的第二种写法
#! /bin/bash
i=1
j=0
while :
do
j=$((j + i))
((i == 100 )) && break
((i++))
done
echo $j
for 循环版本
#! /bin/bash
j=0
for ((i=1 ; i<=100 ; i++))
do
j=$((j + i))
done
echo $j
#!/bin/sh
s=0
for i in `seq 1 100`
do
s=`expr $s + $i`
#s=$(expr $s + $i)
done
echo $s