1 shell scripts 概念
望文生义:针对shell 写成的脚本,或者叫剧本。
简单的说,shell scripts就是早期DOS年代的批处理文件(.dat).
作用:
- 自动化管理
- 追踪与管理系统的重要工作
- 简单入侵侦测功能
- 连续指令单一化
- 简单的数据处理
- 跨平台支持与学习历程短
例子:
#!/bin/bash
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0
2 练习
- 对话式:
#!/bin/bash
# Program:
# User inputs his first name and last name. Program shows his full name.
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input your first name: " firstname # 提示使用者输入
read -p "Please input your last name: " lastname # 提示使用者输入
echo -e "\nYour full name is: ${firstname} ${lastname}" # 结果由屏幕输出
- 日期命名文件:
日期的格式化输出:date +%Y%m%d
#!/bin/bash
# Program:
# Program creates three files, which named by user's input and date command.
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1 让使用者输入文件名称,并取得 fileuser 这个变量;
echo -e "I will use 'touch' command to create 3 files." # 纯粹显示信息
read -p "Please input your filename: " fileuser # 提示使用者输入
# 2 为了避免使用者随意按 Enter ,利用[变量功能](../Text/index.html#variable_other_re)分析文件名是否有设置?
filename=${fileuser:-"filename"} # 开始判断有否配置文件名
# 3 开始利用 date 指令来取得所需要的文件名了;
date1=$(date --date='2 days ago' +%Y%m%d) # 前两天的日期
date2=$(date --date='1 days ago' +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期
file1=${filename}${date1} # 下面三行在配置文件名
file2=${filename}${date2}
file3=${filename}${date3}
# 4 将文件名创建吧!
touch "${file1}" # 下面三行在创建文件
touch "${file2}"
touch "${file3}"
- 数值运算:
declare 可以声明为变量
使用$(())也可以表明是变量
sum=1+2+3
echo $sum
declare -i sum=1+2+3
echo $sum
read -p "second num" sed
total=$(($sum+$sed))
echo $total
计算PI的程序。为了确认VM的效率实验,保持计算机的忙碌状态,可以使用这个程序运行。
3 script执行方式的区别
- source script
- sh script
- ./script
- 直接执行script,sh(bash) script或者绝地相对路径
是重新开一个新的bash环境来进行的。 - 利用source来进行执行
是子啊父进程执行
4 判断式
test指令
test -e /tmp && echo "exist" || echo "not exist"
test ${HOME} == ${MAIL}
[ ] 判断符号
[ "$HOME" == "$MAIL" ] #一个=与两个==等价
#在中括号中每个元素都需要空白格
#变量需要用“”
#常熟需要用单或双引号
#!/bin/bash
read -p "Please input (Y/N): " yn
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo "Oh, interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0
$0,$1等默认变量
/path/to/scriptname opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
$#: 代表后面的参数个数
$@: 代表"$1" “$2” “$3” “$4” ,每个变量独立。
$*: 代表" $1 $2 $3 $3 "
shift:造成参数变量号码偏移
echo "your whole parameter is $@"
shift 1
ehco "your whole parameter is $@"
5 条件判断式
单层,基本条件判断结构
if []; then
...
fi
多层结构
if [];then
elif [] ;then
else
fi
利用function功能
function fname() {
…
}
由于shell script的执行是由上而下,由左至右,因此在 shell script 当中的
function 的设置一定要在程序的最前面。
function 拥有内置变量,它的内置变量,$0,$1… 此处与shell script的不同。
6 循环(loop)
不定循环
while do done, until do done
固定循环
for var in con1 con2…
do
…
done
eg1:
for var in con1 con2 con3 ...
do
程序段
done
eg2:
users=$(cut -d ':' -f1 /etc/passwd) # 撷取帐号名称
for username in ${users} # 开始循环进行!
do
id ${username}
done
eg3:
for i in $(seq 1 100) # for i in {1..100}
do
echo -ne $i #不自动换行
done
for…do…done的数值处理
for ((初始值;限制值;执行步长))
do
..
done
eg:
s=0
for ((i=1;i<=10;i=i+1))
do
s=$(($s+$i))
done
echo $s
7 shell script的追踪与调试
[dmtsai@study ~]$ sh [-nvx] scripts.sh
选项与参数:
-n :不要执行 script,仅查询语法的问题;
-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!