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)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...
随机推荐
- prototype与 _proto__的关系
prototype与 __ proto__ 都是在这个过程中催生的产物,我们一会儿马上讨论,在这之...做对象即可,那javascript种究竟是通过什么来明确继承关系的呢. 一.构造函数: 构造函数 ...
- caffe中batch norm源码阅读
1. batch norm 输入batch norm层的数据为[N, C, H, W], 该层计算得到均值为C个,方差为C个,输出数据为[N, C, H, W]. <1> 形象点说,均值的 ...
- Cocos Creator实现1024游戏,免费提供代码。
效果预览 获取代码 私信或留言. 游戏介绍 ● Github上的代码,不能进行合并操作,修改以后,功能类似2048,空白块赏随机位置,生成2,可以往左.右.上.下滑动,数字会朝着指定方向运动,相 ...
- 1.在ubuntu中软件安装在哪里?
ubuntu下安装软件有四种方式: 1.通过deb格式的离线软件包安装 sudo dpkg -i xxx.deb # 安装包,安装程序 -i: install sudo dpkg -r packa ...
- Catalan数的理解
Catalan数的理解 f(0)=1 f(1)=1 f(2)=2 f(3)=5 f(4)=14 f(5)=42 f(2)=f(1)+f(1) f(3)=f(2)+f(1)*f(1)*f(2 ...
- Java设计模式_七大原则
简介 单一职责原则.对类来说,即一个类应该只负责一项职责. 开闭原则.对扩展开放,对修改关闭.在程序需要进行扩展的时候,不能去修改原有代码,使用接口和抽象类实现一个热插拔的效果. 里氏替换原则.任何基 ...
- 一:XMind
- 前后端对称加密(AES)
后端实现(JAVA) package com.vcgeek.hephaestus.demo; import org.apache.commons.codec.binary.Base64; import ...
- 前端技术之:如何在控制台将JS class实例输出为JSON格式
有一个类: class Point { constructor(x, y) { this.x = x; this.y = y; } } 如果我们在控制台中输出其实例: console.log(new ...
- 博客文章编辑器 Cmd Markdown
欢迎使用 Cmd Markdown 编辑阅读器 编辑器点击打开链接 学习语言地址点击打开链接