Shell学习总结
2014-01-18 13:17
239 查看
1,shell的基本元素
(1) #!/bin/bash ,指出shell的类型
2,一个简单的Shell程序
3,执行Shell脚本
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
执行命令: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文件是否存在?
2,编写一个名为greet的问候程序,它执行时能根据系统当前的时间向用户输出问候信息。
设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。
3,编写一个名为ifuser的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系统中登录,并给出相关信息。
4,编写一个名为menu的程序,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。
5,编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。
6,编写一个名为chuser的程序,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。
(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分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。
相关文章推荐
- shell学习总结之特殊字符及特殊变量
- shell学习总结(1)
- shell脚本学习与总结
- shell 脚本菜鸟学习总结
- Ubuntu学习总结-08 Ubuntu运行Shell脚本报 shell /bin/bash^M: bad interpreter错误问题解决
- 记 Linux 学习知识总结 -- 寒江老师视频(七) - SHELL 讲解
- python调用shell总结 分类: ubuntu python基础学习 2014-02-26 14:32 261人阅读 评论(0) 收藏
- shell脚本学习总结
- shell脚本学习总结09--分支与循环结构
- shell脚本学习总结03--别名的使用
- shell脚本学习总结----sed+grep+awk+正则
- Shell 学习总结
- Linux学习总结(三)——Shell常见命令解析
- shell学习指南-知识点总结
- shell脚本学习总结01--文件描述符和重定向
- shell学习总结
- shell学习的一点总结
- Shell学习总结之逻辑运算符及表达式
- shell脚本学习总结----tar+gzip+zip+raync+ping+iptables
- Shell学习总结