shell编程-基础
1.linux 下 Bash 程序开
1.1 怎样写 shell 脚本
1.2 彩色 shell 的输出
1.3shell 中的变量
1.4echo 命令
1.5shell 中数学计算
1.6 引号的使用
[root@desktop29 ~]# echo "$UU and date" #不能解读 date 命令,需要$来调用
200 and date
[root@desktop29 ~]# echo "$UU and $(date)"
200 and Wed Oct 5 08:28:42 CST 2011
[root@desktop29 ~]# echo "$UU and \$(date)" #\转义了
200 and $(date)
[root@desktop29 ~]# echo `$UU and date`
bash: 200: command not found
``斜点不能对$作解析,里面只能使用命令
[root@desktop29 ~]# echo "$UU and `date`"
200 and Wed Oct 5 08:29:20 CST 2011
[root@desktop29 ~]# echo '$UU and date' #不做任何修改
$UU and date
[root@desktop29 ~]# echo `date`
Wed Oct 5 08:30:09 CST 2011
[root@desktop29 ~]# echo "expr 3 + 4 "
expr 3 + 4
[root@desktop29 ~]# echo `expr 3 + 4 ` #先执行 bash
7
[root@desktop29 ~]# echo "$(expr 3 + 4 )"
7
1.7 退出和退出状态
[root@desktop29 ~]# ls /boot/grub/grub.conf
/boot/grub/grub.conf
[root@desktop29 ~]# echo $? #命令执行正确,返回 0
0
[root@desktop29 ~]# ls /boot/grub/grub.con
ls: /boot/grub/grub.con: No such file or directory
[root@desktop29 ~]# echo $? 命令执行不正确,返回非 0
2
1.8read 语法
[root@desktop29 ~]# read TT HH
tt hh
[root@desktop29 ~]# echo $TT
tt
[root@desktop29 ~]# echo $HH
hh
[root@desktop29 ~]# echo "rr ff ss" |while read HH GG II
> do
> echo $HH
> echo $GG $II
> done
rr
ff ss
[root@desktop29 ~]# echo $GG #显示是空
[root@desktop29 ~]#
1.9 通配符的使用
[root@desktop29 ~]# ls /lib/libn*.so
/lib/libnsl-2.5.so /lib/libnss_hesiod-2.5.so
/lib/libnss_compat-2.5.so /lib/libnss_ldap-2.5.so
…… ……
[root@desktop29 ~]# ls /lib/lib?[abef]*.so
/lib/libdb-4.3.so /lib/libdevmapper.so
/lib/libdevmapper-event-lvm2mirror.so /lib/libkeyutils-1.2.so
/lib/libdevmapper-event-lvm2snapshot.so /lib/libresolv-2.5.so
/lib/libdevmapper-event.so /lib/libSegFault.so
[root@desktop29 ~]# ls /lib/lib[^abefnd]*.so
/lib/libBrokenLocale-2.5.so /lib/libm-2.5.so /lib/libSegFault.so
/lib/libc-2.5.so /lib/libproc-3.2.7.so /lib/libthread_db-1.0.so
/lib/libcidn-2.5.so /lib/libpthread-2.5.so /lib/libutil-2.5.so
/lib/libcrypt-2.5.so /lib/libresolv-2.5.s
1.10 一行内执行多条命令
[root@desktop29 ~]# echo "ee" >> ff.txt;cp ff.txt d.t;rm ff.txt -f;echo $?
0
[root@desktop29 ~]# cat d.t
ee
[root@desktop29 ~]# cat ff.txt #被删了
cat: ff.txt: No such file or directory
1.11 命令行参数
[root@desktop29 ~]# rm d.t -fv #2 个参数
removed `d.t'
[root@desktop29 ~]# date #0 个参数
Wed Oct 5 09:20:15 CST 2011
测试位置参数和特殊的参数
[root@desktop29 ~]# vim dd.sh
#!/bin/bash
echo "\$0 : $0"
echo "\$1 : $1"
echo "\$2 : $2"
echo "\$# : $#"
echo "\$* : $*"
[root@desktop29 ~]# chmod u+x dd.sh
[root@desktop29 ~]# ./dd.sh root redhat
$0 : ./dd.sh
$1 : root
$2 : redhat
$# : 2
$* : root redhat
1.12shell 脚本中条件判断
|
字符的比较
|
数字的比较
|
代表的意思
|
|
==
|
-eq | 相等 |
|
>
|
-gt | 大于 |
|
<
|
-lt | 小于 |
|
!=
|
-ne | 不等于 |
|
<=
|
-le | 小于等于 |
|
>=
|
-ge | 大于等于 |
[root@desktop29 ~]# [ "qq" != "cc" ];echo $?
0
[root@desktop29 ~]# [ 100 -eq 12 ];echo $?
1
[root@desktop29 ~]# echo "100 / ( 5 + 5)" | bc
10
1.13 测试文件或文件夹属性
[root@desktop29 /]# touch ff
[root@desktop29 /]# chmod 111 ff
[root@desktop29 /]# su - student root #用户则测不出文件的 r,w,x 属性
[student@desktop29 ~]$ [ -w /ff];echo $?
1
[student@desktop29 ~]$ [ -f /ff ];echo $?
0
[student@desktop29 ~]$ [ -x /ff ];echo $?
0
[student@desktop29 ~]$ [ -d /ff -a -x /ff ];echo $? #-a 是and,非目录,所以为 1
1
[student@desktop29 ~]$ cat ds.sh
#!/bin/bash
echo -e "please input a doc\nexample /etc"
read DD
D=directory
F=file
for RR in $DD/*
do
if [ -d $RR ];then
if[ -w $RR -a -r $RR -a -x $RR ];then
echo -e "$RR\t\t$D-rwx"
else
if [ -w $RR -a -r $RR ] ;then
echo -e "$RR\t\t$D-wr"
else
if [ -w $RR -a -x $RR ] ;then
echo -e "$RR\t\t$D-wx"
else
if [ -x $RR -a -r $RR ] ;then
echo -e "$RR\t\t$D-xr"else
if[ -w $RR ] ;then
echo -e "$RR\t\t$D-w"
else
if [ -r $RR ] ;then
echo -e "$RR\t\t$D-r"
else
if[ -x $RR ] ;then
echo -e "$RR\t\t$D-x"
fi
fi
fi
fi
fi
fi
fi
else
if [ -f $RR ] ;then
if [ -w $RR -a -r $RR -a -x $RR ];then
echo -e "$RR\t\t$F-rwx"
else
if[ -w $RR -a -r $RR ] ;then
echo -e "$RR\t\t$F-wr"
else
if [ -w $RR -a -x $RR ] ;then
echo -e "$RR\t\t$F- wx"
else
if [ -x $RR -a -r $RR ] ;then
echo -e "$RR\t\t$F- xr"
else
if[ -w $RR ] ;then
echo -e "$RR\t\t$F- w"
else
if [ -r $RR ] ;then
echo -e "$RR\t\t$F- r"
else
if[ -x $RR ] ;then
echo -e "$RR\t\t$F- x"
fi
fi
fi
fi
fi
fi
fi
fi
fi
done
1.14if……else……fi
实例:依据钱数决定吃快餐或吃 KFC之 if-else-fi 版
编辑脚本:
[root@localhost ~]# vim eat.sh
#!/bin/bash
echo " money :"
read FF
if [ $FF -lt 5 ];then
echo "fastfood"
else
echo "KFC"
fi
修改权限
[root@localhost ~]# chmod u+x eat.sh
测试
[root@localhost ~]# ./eat.sh
money :
4
fastfood
[root@localhost ~]# ./eat.sh
money :
6
KFC
1.15&&和||以及[[……]]
1.&&在[]与[[]]之间的区别:
[root@localhost ~]# [[ -d /tmp && -w /tmp ]];echo $?
0
[root@localhost ~]# [ -d /tmp && -w /tmp ];echo $?
bash: [: missing `]'
2
2 依据钱数决定吃快餐或吃 KFC-逻辑符号版
#!/bin/bash
echo " money :"
read FF
[ $FF -lt 5 ] && echo "fastfood" || echo "KFC"
测试:
[root@localhost ~]# ./eat.sh
money :
5
KFC
[root@localhost ~]# ./eat.sh
money :
1
fastfood
1.16if 语句的直接使用
[root@localhost ~]# cat if_shell.sh
#!/bin/bash
D=/etc
if cd $D &> /dev/null;then #直接接 shell 命令
echo "now in $D"
else
echo "can't change to $D"
fi
[root@localhost ~]# ./if_shell.sh
now in /etc
1.17if 语句的嵌套
[root@localhost ~]# cat mu.sh
#!/bin/bash
echo "please choose:1,2,3"
echo "1.linux"
echo "2.win7"
echo "3.quit"
read CH
if [ "$CH" != "" ];then
if [ $CH -eq 1 ] ;then
echo " wellcom to linux"
else
if [ $CH -eq 2 ];then
echo "wellcom to win7"
else
if [ $CH -eq 3 ];then
echo "quit"
else
echo "please choose 1,2,3"
fi
fi
fi
else
echo "what do you like?"
fi
测试:
[root@localhost ~]# ./mu.sh
please choose:1,2,3
1.linux
2.win7
3.quit
what do you like?
[root@localhost ~]# ./mu.sh
please choose:1,2,3
1.linux
2.win7
3.quit
1
wellcom to linux
1.18if……then……elif
将菜单项的选择作修改:
#!/bin/bash
echo "please choose:1,2,3"
echo "1.linux"
echo "2.win7"
echo "3.quit"
read CH
if [ "$CH" != "" ];then
if [ $CH -eq 1 ] ;then
echo " wellcom to linux"
elif [ $CH -eq 2 ];then
echo "wellcom to win7"
elif [ $CH -eq 3 ];then
echo "quit"
else
echo "please choose 1,2,3"
fi
else
echo "what do you like?"
fi
1.19exit 退出代码
实例:如果用户输入的是目录,则返回值为 1,如果不是则返回 4
#!/bin/bash
echo -e "input a dir\nexample /etc"
read DD
if [ -d $DD ];then
echo " $DD is a directory"
exit 1
else
echo "$DD is not a directory or not exit"
exit 4
fi
测试:
[root@localhost ~]# ./exit.sh
input a dir
example /etc
/etc
/etc is a directory
[root@localhost ~]# echo $?
1
[root@localhost ~]# ./exit.sh
input a dir
example /etc
/dd
/dd is not a directory or not exit
[root@localhost ~]# echo $?
4
1.20 loop 循环
1.21 for loop
实例:
1.数字集合
99 乘法表:
#!/bin/bash
for A in {1..9}
do
for B in {1..9}
do
RE=$( expr $A \* $B )
echo " $A * $B = $RE "
done
done
测试:
[root@localhost ~]# ./9X9.sh
1 * 1 = 1
…… ……
3 * 1 = 3
…… ……
9 * 9 = 81
#!/bin/bash
echo "#!/bin/bash" >> /bin/setFilewall.sh
for IP in {1..254}
do
echo "iptables -I INPUT -s 192.168.0.$IP -p tcp --dport 80 -j ACCEPT"
>> /bin/setFilewall.sh
echo "iptables is making..."
done
测试:
[root@localhost ~]# ./iptables.sh
iptables is making...
iptables is making...
…………
[root@localhost ~]# tail /bin/setFilewall.sh -n 2
iptables -I INPUT -s 192.168.0.253 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -s 192.168.0.254 -p tcp --dport 80 -j ACCEPT
for FF in /root/cc/*
do
cp $FF $FF.bak -pv
done
测试:
[root@localhost ~]# ./chmod_cc.sh
`/root/cc/1.cc' -> `/root/cc/1.cc.bak'
`/root/cc/2.cc' -> `/root/cc/2.cc.bak'
…… ……
#!/bin/bash
for FF in $(find /root/cc -perm +002)
do
chmod o-w $FF
echo "$FF :o-w"
done
1.22 for 循环 c 语言格式
#!/bin/bash
for ((A=1;A<=9;A++)) 等同于 for A in {1..9}
do
for ((B=1;B<=9;B++))
do
C=$( expr $A + $B )
D=$( expr $C % 2 ) #取余运算
if [ $D -eq 0 ];then
echo -en "\033[30;40m \033[0m"
else
echo -en "\033[37;47m \033[0m"
fi
done
echo -e
done
1.23for 循环的练习
for FF in $(cat /etc/ser.conf | grep -Ev "^(#|$)" )
do
#if 后不能用[ping -c2 $FF &> /dev/nul],无论能否 ping 通,返回结果都是非 0
if ping -c2 $FF &> /dev/nul ;then
echo "$FF is up..."
else
echo "$FF is down..."
logger "$FF is down ..."
fi
done
1.24while 循环
CHOOSE=0
while [[$CHOOSE != "Q"&& $CHOOSE != "q" ]]
do
if (( CHOOSE !="" )) ; then
echo -e "Please input \033[33mq \033[0m to quit"
sleep 4
fi
clear
echo " 1 . Linux "
echo " 2 . Uni x "
echo " Q .Qui t "
read CHOOSE
echo "Please Input \033[ 33mq \033[0m to quit "
done
#!/bin/bash
IN=0
while [ "$IN" != "" ]
do
echo "1.linux"
echo "2.windows"
echo "3.quit"
read IN
if [ $IN -eq 1 ];then
echo "wellcom to linux"
exit 1
elif [ $IN -eq 2 ];then
echo "wellcom to windows"
exit 2
elif [ $IN -eq 3 ];then
exit 3
else #选错了就会清屏后提示 please input 1\2\3 并打印菜单
clear
echo "please input 1\2\3"
fi
done
1.25case 语句
PIDFIL E=/var/spool /test . pid
case $1 in
" start")
if [ - e $PIDFILE ] ; then
echo " the testcase has already run"
else
echo $$ > $PIDFILE ; echo " starting now. . . "
fi ;;
" stop")
kill -9 $( cat $PIDFILE ) ; rm - f $PIDFILE ; ;
" status")
....
*) # 默认值, 匹配所有上面没有给定的值
echo " Usage : /etc/init.d/testcase (start|stop|status) ";;
esac
#!/bin/bash
#chkconfig: 345 45 67 #这 2 行必须要有才能被 chkconfig 解读
#description: this is myserver
case $1 in
start)
echo "myserver is started...";;
stop)
echo "myserver is stoped...";;
*) echo " $0 { start|stop}"
esac
修改执行权限
[root@localhost ~]# chmod u+x myserver.sh
2.复制到/etc/init.d 下,并修改名字
[root@localhost ~]# cp myserver.sh /etc/init.d/myserver
测试:
[root@localhost ~]# chkconfig myserver on
[root@localhost ~]# chkconfig --list | grep myserver
myserver 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@localhost ~]# /etc/init.d/myserver start
myserver is started...
1.26 如何调试脚本
-v:打印 shell脚本执行的行号
[root@localhost ~]# bash -v testvx.sh #将整个脚本都展示出来,并执行
#!/bin/bash
echo "plese input a number"
plese input a number
read N
3
R=$( expr $N \* $N )
expr $N \* $N
echo "$N * $N = $R "
3 * 3 = 9
-x:对每一个指令作展开计算
[root@localhost ~]# bash -x testvx.sh #用++与+来区分计算和非计算
+ echo 'plese input a number'
plese input a number
+ read N
5 输入
++ expr 5 '*' 5
+ R=25
+ echo '5 * 5 = 25 '
5 * 5 = 25 脚本计算的结果
1.27 函数的使用
max ( )
{
if(( $1 > $2 )); then
return $1 # 注意, 此时函数已经结束了
fi
return $2
}
max 10 100
echo $? # 通过 $ ? 取得函数的返回值
setPath ( )
{
PAT H=/bin:/usr/bin
if (( $UID == 0 )) ; then # 如果为 root
PATH = $PATH:/usr/bin/sbin:/sbin # 路径追加 sbin 的目录
fi
i f (( $2 == "after" )); then # 根据位置参数 2,决定如何添加新路径
PATH = $PATH:$1 # 在原 PATH 后面追加
else
PATH=$1:$PATH # 在原 PATH 之前添加
fi
}
#!/bin/bash
showmanu () #展示菜单的函数
{
echo -e "1.linux\n2.windows\n3.quit"
read IN
}
testchoose () #测试用户输入选项的函数
{
if [ $IN -eq ] ;then
echo "wellcom to linux"
exit
elif [ $IN -eq ] ;then
echo "wellcom to windows"
exit
elif [ $IN -eq ] ;then
exit
else
clear
echo "please input 1\2\3"
fi
}
main () #当选择错误时,需要循环的显示菜单和测试用户输入的选项
{
IN=
while [ "$IN" != "" ]
do
showmanu #调用菜单函数
testchoose #调用测试选项函数
done
}
main #调用函数
#!/bin/bash
echo "---脚本 1---"
echo "test server..."
#!/bin/bash
[ $# -eq ] && (
for F in $/*
do
[ -d $F ] && echo "$F is a directory"
done ) || echo "please input a right directory"
#!/bin/bash
F=/root/f.sh
FF=/root/ff.sh
menu ()
{
echo -e "1.testServer\n2.findDir\n3.quit"
}
main ()
{
menu
read INPUT
case $INPUT in
)
bash $F
;;
)
bash $FF /etc #调用时,可以带参数
;;
)
exit - ;;
*)
clear #清屏
main #调用 main 函数
esac
}
main
1.28I/O 重定向和文件描述
1.29 重定向的高级应用
shell编程-基础的更多相关文章
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Linux学习之二十一-shell编程基础
Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- 6-2 shell编程基础
shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...
- shell编程基础进阶
为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...
- 基于Linux系统的Shell编程-基础篇
1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...
- Shell 编程基础之变量和环境变量
一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...
随机推荐
- C#用抽象类定义几何图形
using System;/*using System.Data;*/namespace tx{ abstract class tx { public double chan ...
- 最简单的ArcGIS Engine应用程序(上)
名词: IWorkspaceFactory 工作空间工厂 ShapeFileWorksapceFactory 矢量文件工作空间工厂 IWorkspce 工作空间 IFeatrueWorkspace 要 ...
- 介绍ArcGIS中各种数据的打开方法——mxd(地图文档)
1.加载地图文档 在ArcGIS中,以mxd作为扩展名的文件叫地图文档. 地图文档中只是包含图层的引用,即存储当前地图的图层路径.符号.状态.修饰等信息,并不存储真实的数据层. ArcGIS Map中 ...
- Vue学习笔记和代码记录
## 安装 * 直接引入链接:建议初学者使用:* 通过node.js的NPM安装Vue:* 通过node.js的NPM安装Vue-cli脚手架(推荐安装方式): ## 基础 ### 数据类型 * 字符 ...
- Qualcomm-Atheros-QCA9377-Wifi-Linux驱动
资源来自:https://download.csdn.net/download/ichdy/10331646 已经下载好了,发现无法使用,本人系统Centos7.2,如果有安装成功,并且可以正常使用的 ...
- join的使用
我们还是以这四张表为例:1.left joinselect * from student a left join score b on a.sid=b.sid; 也就是说A中的元素都会显示,没有值的用 ...
- video2
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 微服务SpringCloud之服务网关zuul二
Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...
- 基于 HTML5 + WebGL 实现 3D 可视化地铁系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...
- Python能做什么,自学Python效果怎么样?
短时间掌握一门技能是现代社会的需求.生活节奏越来越快,现在不是大鱼吃小鱼,而是快鱼吃慢鱼的时代,人的时间比机器的时间更值钱.Python作为一种轻量级编程语言,语言简洁开发快,没那么多技巧,受到众多追 ...