####shell结构
#!指定执行脚本的shell
#注释行
命令和控制结构
第一步:创建一个包含命令和控制结构的文件
第二步:修改这个文件的权限使它可以执行,chmod u+x
第三步:执行./example(或sh example,使用此方式执行时加-x,可以看到执行过程)
#!/bin/bash 指定执行脚本的shell程序
#This is to show 描述
echo "Our first example shell" 命令……
echo #This inserts an empty line in output.
echo "We are currently in the following directory"
/bin/pwd
echo
echo "This directory contains the following files"
/bin/ls
####example.sh
#!/bin/bash 执行脚本的shell
#auto mail for system info 描述
/bin/date +%F >> /tmp/sysinfo 获取日期
echo "disk info:" >> /tmp/sysinfo
/bin/df -h >> /tmp/sysinfo 获取硬盘信息
echo >> /tmp/sysinfo 打印空行
echo "online users:" >> /tmp/sysinfo
/usr/bin/who | /bin/grep -v root >> /tmp/sysinfo 获取在线用户(不包令root)
echo >> /tmp/sysinfo
echo "memory info:" >> /tmp/sysinfo 获取内存信息
/usr/bin/free -m >> /tmp/sysinfo
echo >> /tmp/sysinfo
#write root
/usr/bin/write root < /tmp/sysinfo && /bin/rm /tmp/sysinfo
# crontab -e
# 0 9 * * 1-5 script 计划任务(每天早上9:00)
####shell变量
以字母或下划线开头,一般变量名为大写字母。
#位置变量:
ls -l file1 file2 file3
$0 指命令本身
$1 file1
$2 file2
……
$n
##特殊变量
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的pid
$! 执行上一个后台命令的pid
$? 执行上一个命令的返回值。
##examle
#!/bin/bash
#test special varibale
echo '$# is :' $#
echo '$* is :' $*
echo '$? is :' $?
echo '$$ is :' $$
echo '$0 is :' $0
sh example.sh file1 file2 file3 file4
##返回结果
$# is : 4
$* is : file1 file2 file3 file4
$? is : 0
$$ is : 17379
$0 is : example
####shell命令
read:从键盘读入数据,赋值给变量
#example
#!/bin/sh
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second"
echo "the third parameter is $third"
expr:对整数型变量进行算术运算,小数点后省略。
#example
expr 3 + 5
expr $var - 5
expr $var1 / $var2
expr $var3 \*10
#example2
#!/bin/bash
a=10 b=30 c=30
value1=`expr $a + $b + $c`
test:变量测试语句,用于测试变量是否相等,是否为空,文件类型等
test 测试条件
#example
test str1=str2
test strl!=str2
test -n str1 是否为空
test -d file 是否为目录
test -x file 是否可执行
#example2
if test -d $1 then
……
fi
test -d $1 ==== [-d $1]
#example3
#检测web服务是否启动。
#!/bin/bash
web=`/usr/bin/pgrep httpd`
if [ $web != ""]
then
echo "The web service is running"
else
echo "The web serviec in not running"
/etc/init.d/httpd start
##if多条件判断结构 fi
if 条件1 then
命令1
elif 条件2 then
命令2
else
命令3
fi
#!/bin/bash
echo "please input a file name:"
read file_name
if [ -d $file_name ]
then
echo "$file_name is a directory"
elif [ -f $file_name ]
then
echo "$file_name is a common file"
elif [ -c -o -b $file_name ]
then
echo "$file_name is a device file"
else
echo "$file_name is an unknow file"
fi
-a 并且 -o 或
##example
#!/bin/bash
if [$# -ne 2 ]; then
echo "Not enough parameters"
exit 0
fi
if [$1 -eq $2 ]; then
echo "$1 equals $2"
elif [ $1 -lt $2 ]; then
echo "$1 littler than $2"
elif [ $1 -gt $2 ]; then
echo "$1 greater than $2"
fi
for done语句
格式:for 变量 in 名字表
do
命令列表
done
##example
#!/bin/sh
for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday
do
echo "The day is $DAY"
done
awk -F 域分隔符 '命令'
#example1 检测系统中UID为0的用户
awk -F: '$3==0 {print $1}' /etc/password
#example2 检测系统中密码为空的用户
awk -F: 'length($2)==0 {print $1}' /etc/shadow
#example3
#!/bin/bash
echo "Please input the username:"
read username
grep $username /etc/passwd > /dev/null 2> /dev/null
if [ $? -eq 0 ]
then
echo "username is : $username"
else
echo "user $username does not exist"
exit 1
fi
echo
#list /etc/passwd info
userinfo=`grep ^$username:x /etc/passwd`
userid=`echo $userinfo |awk -F : '{print $3}'`
groupid=`echo $userinfo |awk -F : '{print $4}'`
homedir=`echo $userinfo |awk -F : '{print $6}'`
shell=`echo $userinfo |awk -F : '{print $7}'`
#get group name from GID
grouptmpname=`cat /etc/group | grep :x:$groupid`
groupname=`echo $grouptmpname | awk -F : '{print $1}'`
echo "user id is : $userid"
echo "default group is : $groupname"
echo "home directory is : $homedir"
echo "shell is : $shell"
echo "group members info:"
#get group members
groups=`groups $username`
echo $groups
echo
#get login info
userlogin=`who | grep $username`
if [ "$userlogin" != "" ]
then
echo "$username is online"
else
echo "$username NOT logged in"
fi
###example for for
#!/bin/bash
username=$1
ps aux |grep $username |awk '{print $2}' > /tmp/temp.pid
killid=`cat /tmp/temp.pid`
for pid in $killid
do
kill -9 $pid 2> /dev/null
done
select 变量 in 关键字
do
command 1
……
command 2
done
#example
#!/bin/bash
echo "What is your favourity OS?"
select var in "Linux" "Unix" "Windows" "Other"
do
break
done
echo "You have selected $var"
##case
case ... esac 语句,格式:
case 变量 in
字符串1) 命令列表1
;;
...
字符串n) 命令列表n
;;
esac
##example
#!/bin/bash
echo "***************************"
echo "Please select your operation:"
echo "Press "C" to Copy"
echo "Press "D" to Delete"
echo "Press "B" to Backup"
echo "***************************"
read op
case $op in
c)
echo "Your selection is Copy"
;;
D)
echo "Your selection is Delete"
;;
B)
echo "Your selection is Backup"
;;
*)
echo "Invalide selection"
esac
while语句,格式:
while 条件
do
命令
done
#example
#!/bin/bash
num=1
while [ $num -le 10 ]
do
SUM=`expr $num \* $num`
echo $SUM
num=`expr $num + 1`
done
#example2
#!/bin/bash
echo "please input username:"
read name
echo "please input number:"
read num
n=1
while [ $n -le $num ]
do
useradd $name$n
n=`expr $n + 1`
done
echo "please input the password:"
read passwd
m=1
while [ $m -le $num ]
do
echo $passwd |passwd --stdin $name$m
m=`expr $m + 1`
done
echo 12345 |passwd --stdin shedon "12345"为设置的密码 shedon为用户
until语句,格式:
until 条件
do
命令
done
until类似while循环,不同的是until是条件返回值为假时才继续执行。
#example
#!/bin/bash
until [ -x /etc/inittab ]
do
/bin/ls -l /etc/inittab
exit 0
done
#example2
#!/bin/bash
echo "Press Y/y to stop..."
read input
until [ $input = "Y" ] || [ $input = y]
do
echo "error input,please try again..."
read input
done
echo "stop here!"
#########跳出循环:break 和 continue
break 跳出循环
continue 跳出本次循环
shift指令:参数左移,每执行一次,参数向左移一位,$#的值减1,用于分别处理每个参数,移出去的参数不再可用
####函数应用
函数定义:
函数名()
{
命令序列
}
函数的调用:不带()
函数名 参数1 参数2 ...
#######函数中的变量:
均为全局变量,没有局部变量
#######函数中的参数:调用函数时,可以传递参数,在函数中用$1 $2...来引用
###sh -x script
将执行脚本并显示所有变量值
###sh -n script
不执行脚本只是检查语法模式,将返回所有语法错误。
###普通用户脚本执行权限
sh 执行
1.普通用户对脚本文件有r权限
2.对脚本所在目录有rx权限
脚本直接执行
1.普通用户对脚本文件有rx权限
2.对脚本所在目录有rx权限