可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。
用于指定脚本使用哪个shell程序做为脚本中命令的解释器
使用bash做为脚本命令的解释器
#!/bin/bash
使用zsh做为脚本的命令解释器
#!/bin/zsh
[root@localhost ~]# vim hello.sh
里面输入:
#!/bin/bash
echo "helloworld"
保存退出
[root@localhost ~]# ./hello.sh
-bash: ./hello.sh: Permission denied #发现你的权限不够
[root@localhost ~]#
脚本写完后运行,利用./执行发现权限不够。Linux文件创建之后默认是没有可执行权限的,可以用chmod给文件或目录添加上可执行权限
[root@localhost ~]# ll
[root@localhost ~]# chmod +x hello.sh
[root@localhost ~]# ll
[root@localhost ~]# ./hello.sh
helloworld
[root@localhost ~]#
上面两次ll出来的文件列表,是为了对比出添加权限前后文件权限的变化,x表示可执行。
首先咱们在新建一个脚本
[root@localhost ~]# vim aaa.sh
里面输入:
#!/bin/bash
echo "hello aaa"
保存退出
验证它无权限被执行
[root@localhost ~]# ./aaa.sh
-bash: ./aaa.sh: Permission denied
[root@localhost ~]# bash aaa.sh
hello aaa
[root@localhost ~]# . aaa.sh
hello aaa
在脚本拥有可执行权限之后,我们就可以去执行脚本,执行脚本有以下几种方式:
在脚本所在目录下时
[root@localhost ~]# ./hello.sh
helloworld
[root@localhost ~]# . hello.sh
helloworld
[root@localhost ~]# bash hello.sh
helloworld
[root@localhost ~]# sh hello.sh
helloworld
[root@localhost ~]#
不在脚本所在目录下时
[root@localhost ~]# mkdir -p a/b/c/d
[root@localhost ~]# cd a
[root@localhost a]# bash /root/hello.sh
helloworld
[root@localhost a]# cd b/c/d
[root@localhost d]# pwd
/root/a/b/c/d
[root@localhost d]# ./../../../../hello.sh
helloworld
[root@localhost d]#
脚本的参数就是脚本后面跟的用户输入的选项或者是变量
在脚本中
[root@localhost ~]# vim hello.sh
输入:
#!/bin/bash
echo "脚本名称:$0"
echo "参数个数:$#"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
echo "第四个参数:$4"
echo "第五个参数:$5"
执行该脚本:
[root@localhost ~]# bash hello.sh 1 2 3 4 5
[root@localhost ~]# vim isroot.sh
输入:
#!/bin/bash
if [ $USER == root ];
then
echo "当前用户是管理员"
else
echo "当前用户不是管理员"
fi
[ $USER = root ] && echo "当前用户是管理员" || echo "当前用户不是管理员"
exit 0
执行该脚本:
[root@localhost ~]# bash isroot.sh
当前用户是管理员
当前用户是管理员
[root@localhost ~]#
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
运算符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
[root@localhost ~]# [ $LANG="EN.US.UTF-8" ]&&echo "is English"
is English
[root@localhost ~]#
注意:方括号外取值符号$不能少,方括号内一定要用空格把方括号和里面的命令隔开
[root@localhost ~]# i=$[10 * 10]
[root@localhost ~]# echo $i
100
[root@localhost ~]# echo $[999 + 999]
1998
[root@localhost ~]#
写一个判断内存是否够用的脚本
[root@localhost ~]# vim isfree.sh
输入:
#!/bin/bash
# 此脚本用于判断内存是否够用,标准为空闲内存大于总内存的20%(说明脚本功能)
# bash isfree.sh (说明脚本的用法)
# 作者:feng(说明脚本作者)
# qq:略(说明作者的联系方式)
# 可能有些脚本里有复杂参数或者函数,请在最下面进行说明
Totalmem=`free -m | grep Mem | awk '{print $2}'`
Freemem=`free -m | grep Mem | awk '{print $4}'`
i=$[ $Totalmem/5 ]
[ $Freemem -gt $i ] && echo "内存够用" || echo "内存紧缺,请抓紧清理内存"
执行:
[root@localhost ~]# bash isfree.sh
内存够用
[root@localhost ~]#
上面判断用户参数时,我们已经使用过了if语句
现在再来一次
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
[root@localhost ~]# vim 1.sh
输入:
#!/bin/bash
DIR="/root/test"
if [ ! -d $DIR ]
then
echo "目录不存在"
mkdir /root/test
else
echo "目录已经存在"
fi
exit 0
[root@localhost ~]# bash 1.sh
目录不存在
[root@localhost ~]# bash 1.sh
目录已经存在
结果如下图:
[root@localhost ~]# vim baidu.sh
输入:
#!/bin/bash
# example: ./testhost.sh www.baidu.com
if [ $# -eq 1 ]
then
ping -c 4 -i 0.2 -W 3 $1 &> /dev/null
else
echo "example: $0 www.baidu.com"
fi
if [ $? -eq 0 ]
then
echo "主机$1能正常访问"
exit 0
else
echo "主机$1无法访问"
exit 1
fi
[root@localhost ~]# bash baidu.sh
example: baidu.sh www.baidu.com
主机能正常访问
[root@localhost ~]#
[root@localhost ~]# vim result.sh
#!/bin/bash
read -p "Enter your score(0-100): " sc
if [ $sc -gt 100 ] || [ $sc -lt 0 ] ; then
echo "Error,Please input score 0~100!"
exit 2
elif [ $sc -ge 85 ] && [ $sc -le 100 ]; then
echo "$sc is Excellent"
elif [ $sc -ge 60 ] && [ $sc -le 84 ]; then
echo "$sc is Pass"
else
echo "$sc is Fail"
fi
[root@localhost ~]# bash result.sh
Enter your score(0-100): 90
90 is Excellent
[root@localhost ~]#
题目:在linux上创建一个脚本,名为/root/makeusers,此脚本能实现为系统创建本地用户,并且这些用户的用户名来自一个包含用户名列表的文件。
同时满足下列要求:
此脚本要求提供一个参数,此参数就是包含用户列表的文件
如果没有提供参数,此脚本应该给出下面的提示信息 Usage:/root/makeusers ,然后退出并返回相应的值
如果提供一个不存在的文件名,此脚本应该给出下面的提示信息 Input file not found 然后退
出并返回相应的值
创建的用户登录 shell 为/bin/false,此脚本不需要为用户设置密码
首先,了解一下新建用户的命令:
[root@localhost ~]# useradd -s /bin/fasle "testuser"
[root@localhost ~]# cat /etc/passwd
通过cat命令查看所有用户信息,可以看到如下图,用户testuser已经成功创建出来了
现在开始写脚本:
[root@localhost ~]# vim foruser.sh
#!/bin/bash
if [ $# -ne 1 ];then
echo 'Usage: $0 <>'
exit 1
elif [ ! -f "$1" ];then
echo "input file not found"
exit 2
else
for USER in $(cat "$1");do
useradd -s /bin/false $USER
done
fi
新建一个包含用户名的文件,里面随便设置几个用户
[root@localhost ~]# vim user.txt
aaa
bbb
ccc
ddd
执行脚本
[root@localhost ~]# bash foruser.sh user.txt
[root@localhost ~]# cat /etc/passwd
如下图,几个用户已经被成功添加了!
把for循环改成wheel循环的写法
另外再写一个脚本:
[root@localhost ~]# vim wheeluser.sh
#!/bin/bash
if [ $# -eq 1 ];then
if [ -f "$1" ];then
while read username;do
useradd -s /bin/false $username &>/dev/null
done<$1 #跳出循环
else
echo "Input file not found"
fi
else
echo "Usage: $0 "
fi
重新编辑一下user.txt
[root@localhost ~]# vim user.txt
aaawww
bbbwww
cccwww
dddwww
执行脚本
[root@localhost ~]# bash wheeluser.sh user.txt
[root@localhost ~]# cat /etc/passwd
如下图,几个用户已经被成功添加了!
在 linux上创建一个名为/root/script.sh 的脚本,让其提供下列特性:
当运行/root/script.sh all,输出为 none
当运行/root/script.sh none,输出为 all
当没有任何参数或参数不是 all 或者 none 时,其错误输出产生以下的信息:
/root/script.sh all|none
开始写脚本
[root@localhost ~]# vim script.sh
#!/bin/bash
case $1 in
all)
echo "none"
;;
none)
echo "all"
;;
*)
echo "Usage: $0 all|none"
;;
esac
执行脚本:
[root@localhost ~]# bash script.sh all
none
[root@localhost ~]# bash script.sh none
all
[root@localhost ~]# bash script.sh abc
Usage: script.sh all|none
[root@localhost ~]#
如下图
本篇到此结束