1.数字计算
declare -i num=10
while [ $num -ne 0]
do
num=num-1
done
num=10
while [ $num -ne 0]
do
let 'num -= 1'
#let 'num = num -1'
#num=`expr $num -1`
(( num-- )) #用(( )) 可以使用类C风格的计算式,注意算式两边要加空格(( t = a<457:11))
done
let 'num = $RANDOM % 6 + 1'
2.读入文件
while read line
do
echo $line
done<filename
#读入一下目录下所有文件,所打印出来
FILES='ls'
for file in $FILES
do
while read word
do
echo $word
done<$file
done
3.for循环
for name in "derry china" "daisy usa" "jintaiqi korea"
do
echo $name
done
#显示一下目录下以sh结尾的文件
for file in *[sh]
do
ls -lh $file
done
for ((a=1,b=1; a<=LIMIT; a++, b++))
do
echo -n "$a-$b"
done
4.while循环
i=0
while ($i < 10)
#while [ "$i" -lt 10 ]
do
echo $i
#((i++))
#i=`expr $i + 1`
let "i += 1"
done
#读入所有命令行参数
while [ $# -gt 0 ]
do
echo $1
shift
done
5.until循环
i=0
until ((i >= 10))
do
echo $i
((i++))
done
6.case
read cmd
case "$cmd" in
"quit" | "q" ) echo "quit"; exit 0;;
"ls" ) `ls`;;
"date" ) `date`;;
esac
7.常用函数
#检查是否全部字母输入
SUCCESS=0
FAILURE=-1
isalpha()
{
if [ -z $1]
then return $FAILURE
fi
case "$1" in
*[!a-zA-Z]*|"") return $FAILURE;;
* ) return $SUCCESS;;
esac
}
#检查是否全部数字输入
isdigit()
{
[ $# -eq 1] || return $FAILURE
case $i in
*[!0-9]*|"") return $FAILURE;;
* ) return $SUCCESS;;
}
for param in 0 a 9 %
do
if isdigit "$param"
then echo "$param is digit"
else echo "$param is not digit"
fi
done
5.字符串操作
string=defabcdefxyz
len=`expr length string`
pos=`expr index $string abc` #查找第一个字串的位置
str=`expr substr $string 2 6` #取指定位置的子串
6.文件包含
config.sh:
IP=192.168.0.1
read.sh
. config.sh
#source config.sh
echo $IP
7.test测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:
(1)数值测试:
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
(2)字符串测试:
=:等于则为真
!=:不相等则为真
-z 字符串:字符串长度伪则为真
-n 字符串:字符串长度不伪则为真
(3)文件测试:
-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真
另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。
同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:var1=2
var2=$[var1*10+1]
则:var2的值为21。
8.命令分组
在shell中有两种命令分组的方法:“()”和“{}”,前者当shell执行()中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。
当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些
命令放在圆括弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰;{}用于将顺序执行的命令的输出结果用于另一个命令
的输入(管道方式)。当我们要真正使用圆括弧和花括弧时(如计算表达式的优先级),则需要在其前面加上转义符(/)以便让shell知道它们不是用于
命令执行的控制所用。
9.信号
trap命令用于在shell程序中捕捉到信号,之后可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:trap signal-list
第三种形式的trap命令允许忽视信号:trap " " signal-list
注意:(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止(如执行exit语句)时发出该信号。
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。
10. bash的内部命令
1.eval 命令格式:eval args 功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
for i in ls df;
do
ret=eval $i
echo $value
done
2.exec 命令格式:exec 命令 命令参数
功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序
中exec后面的语句将不再被执行。
#调用子进程
ret=`exec ./wait.sh`
#输出子进程返回值
echo $?
#输出子进程输出
echo $ret
3.export 命令格式:export 变量名 或:export 变量名=变量值
功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
4.wait
功能:是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。
#!/bin/bash
eval ./wait.sh &
wait
5. 特殊参数
$*: 代表所有参数,其间隔为IFS内定参数的第一个字元
$@: 与*星号类同。不同之处在於不参照IFS
$#: 代表参数数量
$?: 执行上一个指令的返回值
$-: 最近执行的foreground pipeline的选项参数
$$: 本身的Process ID
$: 执行上一个背景指令的PID
$_: 显示出最後一个执行的命令