####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权限