接触LINUX也有一段时间了,觉得命令好多,很难记住。有个高人指点我现学学shell编程可能会对LINUX的理解好很多。在这里也不想说什么有关语法亚,变量的问题,我直接给出一点具体的程序知道一下格式也就行了。 #!/bin/sh
#本脚本目的在于实现某个软件的启动,关闭,或者重新启动
#启动的软件由参数PGM决定
#列出错误提示
USAGE="Usage:$0 [ start | stop | restart ]"
#给出软件路径
PGM=/usr/sbin/sshd
#给出软件参数
PGM_OPTS=
#判断软件路径是否存在
if [ ! -x "$PGM" ] ; then
echo "Error:Not Executable:$PGM" l>&2
exit 1
fi
#判断操作系统类型
case "'uname -s'" in
Linux | Darwin | *BSD)PS="bin/ps auwxx"
;;
*)PS="/bin/ps -ef"
;;
esac
#判断命令
case "$1" in
#启动命令
start)
RUNNING=`$PS -aux | grep "$PGM" | grep -v grep |head `
if [ -n "$RUNNING" ] ; then
echo "Error:Already running :$PGM" 1>&2
exit 1
fi
"$PGM" $PGM_OPTS
echo "$PGM start"
;;
#关闭命令
stop)
RUNNING=`$PS | grep "$PGM" | grep -v grep |head `
if [ -z "$RUNNING" ] ; then
echo "Error:Not Exist:$PGM" 1>&2
exit 1
fi
/bin/ps -ef | grep "$PGM" | grep -v grep | \
awk '{print $2;}' | xargs kill 2 > /dev/null
echo "$PGM stop"
;;
#重启命令
restart)
RUNNING=`$PS | grep "$PGM" | grep -v grep |head `
if [ -z "$RUNNING" ] ; then
echo "Error:Not Exist:$PGM" 1>&2
exit 1
fi
/bin/ps -ef | grep "$PGM" | grep -v grep | \
awk '{print $2;}' | xargs kill 2 > /dev/null
"$PGM" $PGM_OPTS
echo "$PGM restart"
;;
#错误提示
*)
echo "$USAGE"
exit 1
;;
esac
exit 0
为了方便查找,我以后将shell程序都放在这个文件下面,并且把所有的有关shell的有用资料全放在评论中。
#!/bin/sh
#这个程序的主要目的是演示一下如何实现进度指示器(这个是按点来的)
function dots
{
count=0;
echo "please wait:"
while true
do
if [ $count -eq 40 ];then
printf "\n"
count=0
fi
sleep 0.5
printf "."
count=`expr $count + 1`
done
}
dots &
BG_PID=$!
sleep 5
echo -ne "\33[32m"
printf "\t\t\t\t\t\t"
printf "[ seccussfull ]"
printf "\n"
echo -ne "\33[0m"
kill $BG_PID
匿名网友 | 2005年 04月17日 20 : 26
第三个shell程序[回复]
这个和上面的功能是一样的,指示更是点画线实现function rotate
{
printf "Please Wait:"
printf "\t\t\t\t\t\t\t"
INTERVAL=0.5
TCOUNT="0"
while :
do
TCOUNT=`expr $TCOUNT + 1`
case $TCOUNT in
"1")printf "-"
printf "\b"
sleep $INTERVAL
;;
"2")printf "\\"
printf "\b"
sleep $INTERVAL
;;
"3")printf "│\b"
sleep $INTERVAL
;;
"4")printf "/\b"
sleep $INTERVAL
;;
*)TCOUNT="0"
;;
esac
done
}
rotate &
ROTATE_PID=$!
sleep 10;
echo -ne "\33[32m"
printf "[ seccessfull ]"
echo -ne "\33[0m"
printf "\n"
kill -9 $ROTATE_PID
匿名网友 | 2005年 04月17日 20 : 27
输出颜色控制[回复]
cNO="\033[00m" #还原
cFR="\033[01;31m" #红色前景
cFG="\033[01;32m" #绿色前景
cFY="\033[01;33m" #黄色前景
cFB="\033[01;34m" #兰色前景
cFM="\033[01;35m" #艳红前景
cFC="\033[01;36m" #浅兰前景
cFL="\033[01;37m" #亮白前景
cBR="\033[01;41m" #红色背景
cBG="\033[01;42m" #绿色背景
cBY="\033[01;43m" #黄色背景
cBB="\033[01;44m" #兰色背景
cBM="\033[01;45m" #艳红背景
cBC="\033[01;46m" #浅兰背景
cBL="\033[01;47m" #亮白背景
#用法举例:echo -e "$cFG 前景 $cBG 背景 $cNO 全部复原"
sagely | 2005年 04月21日 09 : 29
条件测试及expr的用法[回复]
流程控制
"if" 表达式 如果条件为真则执行then后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等...
通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等
执行man test可以查看所有测试表达式可以比较和判断的类型。
直接执行以下脚本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
文件目录操作:
-e filename file filename is existed?
-r filename 用户对文件filename有读权限?
-w filename 用户对文件filename有写权限?
-x filename 用户对文件filename有可执行权限?
-f filename 文件filename为普通文件?
-d filename 文件filename为目录?
-c filename 文件filename为字符设备文件?
-b filename 文件filename为块设备文件?
-s filename 文件filename大小不为零?
-t fnumb 与文件描述符fnumb(默认值为1)相关的设备是一个终端设备?
逻辑操作:
-a (And)逻辑与,操作符两边均为真,结果为真,否则为假。
-o (Or)逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
测试字符串
string_operator可为:
= 两个字符串相等。
!= 两个字符串不等。
-z 空串。
-n 非空串。
测试数值
测试数值可以使用许多操作符,一般格式如下:
"number" numeric_operator "number"
或者
[ "number" numeric_operator "number" ]
numeric_operator可为:
-eq 数值相等。
-ne 数值不相等。
-gt (Greater than)第一个数大于第二个数。
-lt (Less than)第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
这里还是把数值看成字符串,如:
number="130" 或 number=130
[ "$number" -eq "130" ]
expr 命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr 也是一个手工命令行计数器。
使用乘号时,必须用反斜线屏蔽其特定含义。因为s h e l l可能会误解显示星号的意义。
如:expr 3 \* 3
expr 3 / 3
expr 命令用于记数:
number=1 --------number是字符串!!!!!
number=`expr $number + 1` #反引号即替代命令,expr $number + 1是命令,不能放在等号右边
所有数字可以用引号括起来,也可不括起来,因为本来就不存在数字,只有字符串。!!!!!!!!!
但字符串和数字也有不同,当是数字字符串时,才能用numeric_operator
typeset -i VAR8
VAR8=1
while ((VAR8<4))
do
((VAR8 = VAR8 +1))
echo $VAR8
done
========自己的补充
在windows下使用cygwin的时候要加环境变量SHELLOPTS=igncr
#!/bin/sh a='1.mp3' #不能写成a = '1.mp3' echo `echo $a|sed 's/1/2/1'` #不能写成echo `echo $a|sed 's/1/2/1'` for file in `ls` do if [[ "$file" =~ ".mp3" ]]; then filetmp=`echo $file|sed 's/\[.*\]//1'`#也可以写成filetmp=${file##\[*\]} echo $filetmp echo "change $file to `echo $file|sed 's/\[.*\]//1'`" fi done
#!/bin/sh #[我听评书网www.5tps.com]凡人修仙传112.mp3 改名为 凡人修仙传112.mp3 for file in `ls` do if [[ "$file" =~ ".mp3" ]]; then filetmp=`echo $file|sed 's/\[.*\]//1'`# #也可以写成filetmp=${file##\[*\]} echo "change $file to $filetmp" #mv $file $filetmp fi done
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sagely/archive/2005/04/29/367871.aspx