Linux | Shell编程
shell编程
shell基本功能
命令解释执行;
文件名替换;
输入输出重定向;
连通管道建立;
系统环境设置;
shell编程
shell编程是shell的基本功能之一。Shell是一个解释语言
特殊字符
*,?,[!- ]:统配符;
<,>,>>,|:I/O重定向符;
;:命令分隔符;
&:命令后台执行;
",',`:三种引号;
`:命令替换;
\:转义字符;
$:变量引用前导符;
{,},[,],(,):括号;
~:波浪号为用户的家目录,与$HOME同
两个整数间关系的测试
-eq:两数相等时为真
-ne:两数不等时为真
-gt:前数大于后数时为真
-ge:前数大于或等于后数时为真
-lt:前数小于后数时为真
-le:前数小于或等于后数时为真
特殊变量
$#:传递给shell程序的变量个数
$-:由set设置的参数串
$?:上一条命令执行返回值
$@:shell程序的所有参数
$$:当前进程的进程号
$*:默认情况下与$@同
$!:最后一次后台执行进程的pid
$n:第n个位置参数,n为小于$#的非负整数
expr:用于对表达式进行算术运算
#expr 5 – 3 #结果为2
#expr 5 \* 4 #结果为20
#xx=5; $xx=`expr $xx + 1` #结果为$xx=6
#x=5; y=6; xy=`expr $x \* $y #结果为xy=30
Bash的控制结构
if-then-fi结构
if [ -d "$1" ] #判断是否为目录
then
ls $1/*; exit 0 #列目录内容,返回0
fi
if-then-elif-else-fi结构
if test_cmd
then
statements
elif test_cmd
then
statements
fi
case结构
case var in
val1)
cmd11; …; cmd1n1;;
val2)
cmd21; …; cmd2n2;;
… … … … … …
*)
default_action;;
esac
while结构
while condition
do
do_list # 命令或语句系列
done
until结构
for结构
实例shell编程
#!/bin/sh
func1( ){ #定义函数func1,用于完成功能1
echo "This is function1"
}
func2( ){ #定义函数func2,用于完成功能2
echo "This is function2"
}
while true
do
clear #清屏
echo " 1.功能1 2.功能2 q.退出"
read x
case $x in
1) func1;;
2) func2;;
0|Q|q) exit $?;; # 退出并返回上次的执行结果
*) echo -e "\a";; #响铃表示非法输入
esac
read x
# read -p "Press Enter to continue:" x
done
计算1+…+10
#!/bin/sh
sum=0;x=1
until [ $x -gt 10 ]
do
sum=`expr $sum + $x`
x=`expr $x + 1`
done
echo "1+2+...+10=$sum"
计算输入的参数之和
#!/bin/sh
if [ $@ -lt 1]
then echo "Useage at least 1 arg"
exit 1
fi
sum=0
for x in $*
do
sum=`expr $sum + $x`
done
echo "The sum = $sum"
使用即时文档编写一个shell程序,要求:
1、在即时文档内部,进行参换或命令替换,显示操作者的用户名,并提示操作者输入一个用户名。
2、接收用户从键盘读入一个字符串,并与系统中已创建的用户相比较,若不是则显示错误“XX is not a user”并返回1;
3、然后与系统中已登录的用户相比较,若是其中的某一个则输出“you are logined”,否则输出“You are not in system now!”。
here文件示例程序
echo "This is a Here-Document demonstrator!"
cat << !
-----Here-File begine-----
I am "`whoami`", and who are you? please tell me.
!
# << 符号后面的 ! 是一个分界符,表示开始一个 Here-Document,Here-Document 可以用于在 shell 脚本中嵌入一段文本。
read x; cut -d: -f1 /etc/passwd | grep $x > /dev/null
# 如果匹配成功,则grep将返回0,否则返回非零值。
# 检查输入的字符串是否是系统上的有效用户名。如果输入的字符串匹配到了一个有效的用户名,那么这个命令将不会输出任何东西,否则会输出错误信息
if [ $? -ne 0 ]; then echo "$x is not a user"; exit 1; fi
y=`who | awk '{ print $1 }'`
# 获取当前登录系统的用户的用户名
for z in $y; do
case $z in
$x) v=$x;;
*) v="---------";; # *) 表示如果没有一个 case 模式与变量匹配
esac; done
# for 循环遍历这些用户名,判断是否与变量 $x 的值相同。
if [ $x = $v ]; then echo "Your are logined!"
else echo "You are not in system now!"
fi