Shell 脚本
6/16/2016 10:12:05 AM
类似与windows下批处理,shell 命令的有序集合
- 建立.sh文件(方便识别和系统颜色自动显示)
- 赋予执行权限
chmod +x filename.sh
- 执行,搞定。
./finame.sh
格式要求
- 开头
#!/bin/bash 告诉OS用何种类型的shell解释
- 注释 #
- 变量
- 用户变量 小写/c++命名规则
- 位置变量(命令行参数
$0第一个命令行参数(即脚本文件名)
$n第n个命令参数(包括脚本文件名哦)类似于c语言中的argv[n]
//没完! 这里的n=0....9
当n超过9,是 *两位数时,需要将10放在一个整体中处理**。
${10}${99}
如果不这样,$10,系统将解释为$1+"0"来处理 预定义变量
$# 命令行参数个数-argc(不含$0)
$@ 所有命令参数-char* argv--独立性(不含$0)“$1,$2...,$9”
$* 同$@上,整体性(不含$0)“$1,$2...,$9”
$? 上一个命令的退出状态,可以接收函数的返回值
$$ 正在执行的PID
4. 环境变量
1. HOME---/etc/passwd中列出的用户主目录
2. IFS Internal Fidld Separator: 空格,TAB,换行符
3. PATH---shell搜索路径
4. PS1 ----默认用户提示符$ #
5. PS2 ----换行提示符 >
5. TERM---终端类型xterm
新特性
- 不支持数据类型
- 所有变量当成字符串解释,如果带有空格,用双引号“ ”。
- 命名规则同c++
- 赋值符号两边无空格
- 取变量$varname
当需要将变量名和其他字符放在一起,用{}加以区分
num=2 echo "this is the ${num}nd" //而不是$numnd
清除变量的赋值
unset varname
将命令输出作为变量值 “ 反撇号
ls `echo $HOME` //列出HOME环境变量(用户家目录)文件
echo时,最好将提示信息用“ ”包含起来,虽然不包含也可,但是不好看!
常用功能性语句
1. read
从stdin读入一行,并复制给后面的变量**
read var //读入数据全部复制给var
read v1 v2 v3 //读入的数据按序输入给v1,v2,v3
read v1,v2 //如果输入超过var数量,最后一个变量是多余的所有
read v1,v2 //如果只输入一个参数,则第二个为空
read -p "Hints..." v1 //提示语
read -s v1 //不显示输入的信息
expr
算数运算命令,用于简单的整数运算。
\\* 乘法
expr 12 + 3 \* 5 //12+3*5注意,这里每个操作数后有空格
重要的事情说2遍: **每个操作数或者操作符后有空格!**
重要的事情说2遍: **每个操作数或者操作符后有空格!**
重要的事情说2遍: **每个操作数或者操作符后有空格!**
test
测试,可作为判断条件
三种对象:条件满足,返回0
1.字符串
test "$var" = "string" //判断变量var中的值是否等于string
= 等于
!= 不等于
-z 长度为0
2.整数
test $var -eq 19 //判断var是否等于19,
-eq 等于
-ne 不等于
-gt >
-ge >=
-lt <
-le <=
3.文件
test [options] name
options:
-d name是否为目录
-e 存在?
-f 普通文件
-L 符号链接
-r/w/x 是否可读/可写/可执行?
-s 是否存在且长度不为0
----------------------------
test f1 nt f2 //f1 newer to f2?
test f1 ot f2 // older
4.结构控制语句
**if...then...fi**
if [ express1 ]
then
command1
fi
这里条件判断可以不用test express1 , 直接使用[],这样更人性化
需要注意的是,中括号与express1之间左右都必须有空格
如果有多个条件,每个条件都用[],再用逻辑符号连接
if…then…else…fi同理。
# File Name: file.sh
# Author: Michael Jay
# mail: xuchuanwork@foxmail.com
# Created Time: Thu 16 Jun 2016 03:07:07 PM CST
# Function: check a filename is a dir or a file;
# if dir--open it;
# if file -- show it
############################################################
#!/bin/bash
read -p "input the name :" name
if [ -d $HOME/$name ]
then
echo "$name is a dir, which content:"
ls --color=auto $HOME/$name
exit
else
if [ -f $name ]
then
echo "$name is a ordinary file:"
cat ./$name
else
echo "$name is nothing..."
fi
fi
2. 多路分支 case…esac
case 字符串变量 in
mode1)
command1
;;
mode2)
command2
;;
mode*)
commandn
;;
esca
注意:case只能给检测字符串变量
3. 循环语句
1.循环次数确定
for 变量名 in 单词表
do
cmd
done
变量var依次从单词表中作为它的值,循环次数=单词个数
如果,单词表是所有的命令行参数,可以省略 in 单词表
for varname
do
cmds
done
2.循环次数不确定
while cmd/expres
do
cmds
done
首先,执行while后的命令或者表达式,如果值为真,则执行循环体cmds,直到为假。
4.循环控制
1.break
`break n #跳出n层循环,这跟c语言不`同
2.continue
continue #结束本轮循环,重新开始新的一轮本
continue n #结束本循环,并转到最近n层循环的下一轮循环
5. shell 函数
1. 调用前必须定义。
定义:
fun() #括号内不能添加参数,与c不同
{
cmds
}
或者
function fun()
#shell中传参直接使用命令行参数,如 "fun argument1 argument2"
{
cmds
}
同时,在函数内部使用参数时,使用2这种预定义变量使用。
函数返回值的使用,可以使用:
var=`fun [arg1 arg2]` ##反撇号
fun arg1 arg2 ## $?
echo $?