您的位置:首页 > 运维架构 > Shell

Shell学习总结

2014-01-18 13:17 239 查看
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


4,Shell中的特殊符号

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。

举例:

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分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: