shell
shell ------ 命令解释器
shell脚本 ------ 命令的有序集合(进行批量化的处理,作为配置文件)
解释器:
sh – unix
csh – 优化了c语言的格式
tcsh – 增加了tab补全的功能
ksh – 需要许可证
ash – 轻量级的shell
bash – linux
dash – 执行脚本
rbsah – 受到bash限制,限制命令,提高保护
/etc/shells //环境支持的解释器
echo $SHELL // 查看默认解释器
shell脚本的编写
eg:编写名为test的shell脚本
- 创建文件
vim test.sh
- 脚本的编写
#!添加解释器路径------用哪一个解释器
#!/bin/sh
#!/bin/dash
#!/bin/bash //默认解释器
#!/bin/rbash
eg:
ls
pwd
ls -l
echo hello
一行基本上一条语句(一句话可以不用;)
- 修改权限
chmod 0777 test.sh
4.运行脚本
./test.sh
不需要编译,直接运行
shell中的变量
没有数据类型的概念,以字符串的形式处理
不需要定义,直接使用
赋值符号(=)前后不能有空格
变量的引用,前后有“$",给“钱”才能看内容
位置变量:
// $0 == argv[0]
// $n n是数字,表示获取脚本的第n个参数
// $* 或 $@ 获取所有参数。不包含第一个
// $# 获取参数个数。不包括$0
// $$ 获取正在运行的进程的ID
// $? 获取上一次程序或命令返回的值,成功返回0,失败返回非零数
环境变量:
HMOE //用户家目录信息
PATH //shell的搜索路径
HISTSIZE //历史容量
TERM=xterm //终端类型
SHELL=/bin/bash //默认shell
//给钱才能看
echo $HOME
echo $PATH
echo $变量名
echo $(命令)
unset (变量名) //删除变量
echo $1
echo $2
echo $9
echo $19 //19{}
echo ${19} //大于10的话需要用花括号
命令置换符 `` (esc下面`) 没有命令置换符相当于显示字符串
num=‘ls'
num=ls
关于单引号双引号
单引号内是严格的字符串,原样输出
双引号内部可以引用变量名或者命令
输出语句
echo
echo -n //不换行输出
echo -e //执行转义内容
echo -n $HOME
echo -e "hello \n world"
输入语句
read
read 变量名 //输入一行内容
read 变量名1 变量名2 变量名3 //以空格为界定多变量的赋值
read -s 变量名 //静默显示,不会显示输入的内容
read -p "input:" 变量名 //显示提示内容input
read -n num 变量名 //限制个数,输入num个字符后自动结束
read -t time 变量名 //限制输入的时间,time秒后没输入自动结束
算数功能语句
expr
加(+)减(-)乘(*)除(/)取余(%)
符号前后要有空格
expr 2 \* 3 #直接输出结果
var1='expr 3 + 4' #放变量时使用命令置换符
var1='expr 8 / 2' #放变量时使用命令置换符
var='expr $var1 + var2'
echo $var
注释语句
#注释一行
:<<!
注释语句
!!
执行
./test.sh
bash test.sh
source test.sh
区别
./ 执行脚本
测试语句
test
字符串
= 相等返回0
!= 不相等返回0 等返回1
-z 判断字符串是否为空 空0 非空1
-n 判断字符串是否不为空 空1 非空0
整数
-eq ==
-ne !=
-gt >
-lt <
-ge >=
-le <=
文件
-f 判断是否是普通文件
-d 判断是否是目录文件
-c 判断是否是字符设备文件
-l 判断是否是链接文件
-b 判断是否是块设备文件
-s 判断是否是套接字文件
-p 判断是否是管道文件
-r 判断文件是否可读
-w 判断文件是否可写
-x 判断文件是否可执行
-e 判断文件是否可存在
f1 -nt f2 //测试文件1是否比文件2更新
f1 -ot f2 //测试文件1是否比文件2更旧
结构性语句
if then else
if 判断表
then
语句块
fi
if------then------fi
if------then------else------fi
if------then------elif------then------fi
注意:
一个 fi 对应一个 if
可用【】代替test,前后要加空格
结构性语句
case
case 变量名 in
判断执行标志 ) 执行语句 ;;
判断执行标志 ) 执行语句 ;;
*) 执行语句;;
esac
注意:
case语句只能检测字符串变量
判断执行的标志可以有多个 “|” “)" (用或分隔,括号表示结束)
;; 相当于c语言中的break
最后一个双分号可以省略
* 表示其他字符 类似default
#!/bin/bash
echo "which one"
read choose
case $choose in
1)
echo "free"
;;
2)
echo "love"
;;
3)
echo "friend"
;;
*)
echo "nothing"
;;
esac
while
while 判断表
do #开始
代码
done #结束
num=1;sum=0
while [ $sum -le 100 ]
do
sum=`expr $sum + $num`
num=`expr $num + 1`
done
echo
echo $sum
num=1;sum=0
while((num<=100))
do
((sum+=num))
((num++))
done
echo $sum
1+++++100=
在shell中运用c语言格式加 (())
for
for 变量 in 循环表
do
代码
done
注意:
变量依次取循环表中的值
循环的次数由循环表中的个数决定
如果循环表内容是位置参数,可以省略“in循环表”
seq
seq 尾数 #默认从1开始 每次加1
seq 增量 尾数 #默认从1开始
seq 首数 增量 尾数
seq 1 1 100 #从1开始每次增加1,100结束
for
for((;;))
do
echo
done
break&continue
break 退出循环
break 退出一层循环
break n 退出n层循环
continue 跳过本次循环,执行下一次循环
continue n 若n=2,跳过本次循环,而执行上一层循环的下一次循环
shell 函数
shell中函数的格式:
function 函数名()
{
}
注意:function代表这是一个函数,function可以省略。
shell函数没有参数列表
在shell中没有返回值类型
在shell函数中使用的变量默认为全局变量(使用local申明的变量,为局部变量)
函数的调用
函数名
函数名 agr1 arg2 arg3
函数中参数的获取方式
通过位置变量获取
$0 显示脚步的名字
注意:使用的是source解析时,$0 表示的是bash
$0 $1 $2 $3 $4 $5 $6 ${n} 对应的参数
$# 命令行参数的个数
$@ $* 命令行所有的参数