1,shell的基本元素
(1) #!/bin/bash ,指出shell的类型
(2)# 注释
(3)变量
(4)控制
2,一个简单的Shell程序
#!/bin/bash #shell类型
#a simple shell script example
#a function
function sayhello() #函数
{
echo "Enter Your name:"
read name #读取来自键盘输入的变量
echo "Hello $name"
}
echo "programme starts here..." #主过程
sayhello
echo "programme ends."
3,执行Shell脚本
chmod a+x hello.sh
./hello.sh
1、注释符#
除了#!/bin/bash里的#特殊,其它代表注释
用法:#this is a shell script
2、美元符 $
变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来
用法: echo "this is $JAVA_HOME"
3、单引号
被引起的字符全部做普通字符,即全部原样
echo 'my $SHELL'
4、双引号
引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
5、倒引号(数字1键旁边的那个键)
引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
用法 :`pwd` 即是pwd命令的执行结果
6. 反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
5,shell 变量 可以保存如路径名、文件名或者一个数字
本地变量:局部变量只在创建它们的Shell中使用,可以在shell程序内任意使用和修改它们。
本地变量在用户现在的shell生命期的脚本中使用
环境变量:可以在创建它们的Shell及其派生出来的任意子程序中使用。有些变量是用户创建的,其他的则是专用的(比如PATH、HOME)。是系统环境的一部分,
不必去定义它们,可以在shell程序中使用它们 。还能在shell中加以修改。
环境变量可以在命令行中设置,但用户注销时这些值将丢失
环境变量均为大写
必须用export命令导出
内部变量:由系统提供的。与环境变量不同,但用户不能修改它们
6,Shell变量注意点
定义一个本地变量:变量名=值
等号两边不可以有空格
取值包含空格,必须用双引号括起来
Shell变量可以用大小写字母,区分大小写
变量的引用:${变量名}$变量名
显示本地所有变量:set
设置只读变量:
变量名=值
readonly 变量名
7,显示环境变量
env 可以看到所有的环境变量
echo $环境变量名 (显示一个变量)
unset 环境变量名(清除环境变量)
8,PATH : 就是执行文件搜寻的路径,目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔
9,
LANG : 语系文件,很多数据都会用到他,当出现编码错误的时候往往需要设置它,中文编码是zh_CN.UTF8
举例:配置java环境变量可使任何目录都能执行javac命令
(1)需要配置Java环境变量
JAVA_HOME(JDK存放的路径)
CLASSPATH(字节码的位置,让JVM知道要运行的类的字节码放在哪)
PATH (让OS找到javac等命令的存放的位置)
(2)在Linux下配置它们
打开终端
vi .bash_profile
在配置文件中追加内容
JAVA_HOME=JDK存放位置
CLASSPATH=.(当前目录)
PATH=$JAVA_HOME/BIN:$PATH(不覆盖原来的内容,追加)
export JAVA_HOME CLASSPATH PATH
保存,让配置起作用(source .bash_profile或者注销)
10,使用Shell预定义变量的脚本举例
$# ——传送给shell程序的位置参数的数量
$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0——shell程序的名称
$*——调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数
echo "当前程序的名字是 $0"
echo "共输入了$#个参数,全部参数是$@,第一个参数是$1"
echo "当前进程的pid是:$$"
echo "执行完毕,返回$?"
11,用户设置自己的环境变量
在/home/user/.bash_profile中定义下句,会怎样?
alias la='ls –a|grep "\.*"'
答:user下次再登陆,其shell会自动建立一个别名命令la,功能为查看当前目录下名字以.开头的文件。
写在~/.bash_profile中,需重新登录才能有效。除非运行source .bash_profile使其立即有效。
写在~/.bashrc中,则打开新的终端中就有效
区别:bash_profile只在会话开始的时候读取一次,而bashrc
则每次打开终端时都会读取
按照传统,定义的变量如PATH放到.bash_profile中,而像别名函数等放在.bashrc中,但是.bash_profile先于.bashrc读取内容,也可全放入.bashrc中
12,变量表达式
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于
真返回0,假返回1。
举例:
执行命令:chmod a+x eg1.sh
test 1
–lt
4
#判断1<4
echo $?
#结果为0
test语句的等价形式[ 1 –lt 4 ]
脚本演示:
joe eg1.sh
#! /bin/bash
if test $1 -gt 0
then
echo "$1 是一个整数"
fi
执行命令:chmod a+x eg1.sh
./eg1.sh
-f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
如:test -d “mydoc”
判断mydoc是否是目录
-a 逻辑与
-o 逻辑或
! 逻辑非
表达式求值:
$ expr 1 + 3
$ expr 2 – 1
$ expr 1 \* 3 使用*要加转义符
$ echo `expr 1 + 3`
注意:表达式中,数字和运算符指教要有空格,出现在语句中要
加反引号
if
[ $# -eq 0 ]
then
echo "输入了0个参数"
elif
[ $# -lt 1 ]
then echo "输入了多个参数"
else echo "输入了1个参数"
fi
case "$#"
in
0
)
echo "输入了0个参数"
;;
1
)
echo "输入了1个参数"
;;
*
)
echo "输入了多个参数"
;;
esac
每个分支条件后必须以两个分号结尾
for 例子——输出100内10的倍数
for i in `seq 1 9`
do
echo `expr $i \* 10`
done
乘号前加转义符,
与数字间要有空格
1,编写一个名为iffile程序,它执行时判断/bin目录下date文件是否存在?
#! /bin/bash
fname=/bin/date
if [ -d $fname ]
then
echo "$fname 目录 已经存在"
else
echo "sorry!"
fi
2,编写一个名为greet的问候程序,它执行时能根据系统当前的时间向用户输出问候信息。
设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。
#!/bin/bash
hour=`date|cut -c 10-11`
if test "$hour" -ge 0 -a "$hour" -le 11
then
echo "上午好!"
elif test "$hour" -ge 12 -a "$hour" -le 17
then
echo "下午好!"
else
echo "晚上好!"
fi
3,编写一个名为ifuser的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系统中登录,并给出相关信息。
#! /bin/bash
echo "enter your username will be check!"
user = $1
if who | grep -q $user
then
echo "$1 已经登录!"
exit 0
else
echo "$1 未登录!"
exit 1
fi
4,编写一个名为menu的程序,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。
#! /bin/bash
clear
echo " -----------------MENU------------------"
echo
echo " 1.Find files modified in last 24 hours"
echo " 2.The free disk space"
echo " 3.Space consumed by this user"
echo " 4.Exit"
echo
echo -n "select :"
read choice
case $choice in
1)find $HOME -mtime -1 -print;;
2)df;;
3)du -s $HOME;;
4)exit;;
*)echo "非法操作"
esac
5,编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。
6,编写一个名为chuser的程序,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。