Shell编程下的特殊字符
字符 说明
$ 指出shell变量名的开始
| 把标准输出通过管道传送到下个命令
# 标记注释开始
& 在后台执行进程
? 匹配一个字符
* 匹配一个或几个字符
> 输出重定向操作符
< 输入重定向操作符
>> 输出重定向操作符{添加到文件}
<< 跟在输入结束字符串后(HERE)操作符
[] 列出字符的范围
[a-z] 意a到z的全部字符
[a,z] 意指a或z字符
双引号
在字符串含有嵌入的空格时,用双引号括起来。
例子:
var=“teststring”
newvar=“Value of var is $var”
echo $newvar
单引号
利用单引号把字符括起来,以阻止shell解析变量。把前面的双引号改为单引号
var=”teststring”
newvar='Value of var is $var’
echo $newvar
执行程序可得到如下的结果:
Value of var is $var
反引号
通知 shell 执行由反引号定义的字符串。当需要把执行命令的结果存放在变量中时,就可以在 shell程序中利用反引号
string=”current directory is `pwd`”
echo $string
current directour is /home/huzl
管道
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 | 表示。
格式:命令1 | 命令2
举例:
cat /dev/event0| hexdump
history |grep "mv"
文件重定向
改变程序运行的输入来源和输出地点。
重定向标准输出
cat file | sort > sort.out
pwd >> path.out
echo 5 > file
echo 3 > file
echo 4 > file
重定向标准输入
sort < file
sort < name.txt > name.out
shell下运算符
$[ ] 和 $(()) 两种格式功能一样,所有的 shell 的求值都是用整数完成
echo $[2+8]
echo $((2+8))
echo `expr 2+8 `
赋值运算符=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=
var=9
let var+=1
echo $var 结果为10
var+=1
echo $var 结果为101
整数的算术运算符+、-、*、/、%;
赋值运算符
+=、-=、*=、/=、%=
位运算符
<<、>>、&、|、~、^;
位运算赋值运算符
<<=、>>=、&=、|=、~=、^=;
逻辑运算符:
&&,||,!,>,>=,<,<=,!=,==
echo 命令可以显示文本行或变量,或者把字符串输入到文件。
read 语句可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。
read varible1 varible2 …
如果只指定了一个变量,那么 read 将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车;
如果给出了多个变量,它们按顺序分别被赋予不同的变量。Shell 将用空格作为变量之间的分隔符。
键盘获取字符串
echo "enter a word "
read find_ch
echo $find_ch
文本获取字符串#!/bin/bash
echo "welcome to start for shell language"
count=1
cat $1 | while read line
do
echo "Line$count:$line"
count=$[ $count +1 ]
done
echo "program end"
比较运算
1、文件比较运算符
-e filename如果 filename 存在,则为真[ -e /var/log/syslog ]
-d filename如果 filename 为目录,则为真[ -d /tmp/mydir ]
-f filename如果 filename 为常规文件,则为真[ -f /usr/bin/grep ]
-L filename如果 filename 为符号链接,则为真[ -L /usr/bin/grep ]
-r filename如果 filename 可读,则为真[ -r /var/log/syslog ]
-w filename如果 filename 可写,则为真[ -w /var/mytmp.txt ]
-x filename如果 filename 可执行,则为真[ -x /usr/bin/grep ]
2、字符串比较运算符(注意引号的使用,这是防止空格扰乱代码的好方法)
-z string如果 string 长度为零,则为真[ -z "$myvar" ]
-n string如果 string 长度非零,则为真[ -n "$myvar" ]
string1 = string2如果 string1 与 string2 相同,则为真
[ "$myvar" = "one two three" ]
string1 != string2如果 string1 与 string2 不同,则为真
[ "$myvar" != "one two three" ]
3、算术比较运算符
num1 -eq num2等于[ 3 -eq $mynum ]
num1 -ne num2不等于[ 3 -ne $mynum ]
num1 -lt num2小于[ 3 -lt $mynum ]
num1 -le num2小于或等于[ 3 -le $mynum ]
num1 -gt num2大于[ 3 -gt $mynum ]
num1 -ge num2大于或等于[ 3 -ge $mynum ]
4、测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件3个方面的测试,
test $a -eq $b && echo "a euqal b"[ $a -ne $b ] && echo "a not equal b"
[ $a -gt $b ] && echo "a big then b"
[ $a -lt $b ] && echo "a less then b"
[ -e ./huzl.sh ] && echo "huzl.sh is exit"
[ -x ./huzl.sh ] && echo "huzl.sh is excuate"
chmod +x huzl.sh
[ -x ./huzl.sh ] && echo "huzl.sh(1) is excuate"
5、逻辑运算符
逻辑与: -a 格式: [ condition1 -a condition2 ]
逻辑或: -o 格式: [ condition1 -o condition2 ]
逻辑否: ! 格式: [ ! condition ]
if [ $# -gt 1 -a $# -lt 3 ] ;thenecho "the value :$#"
fi
[root@localhost ~]# [ 1 -eq 1 ] && echo 'ok'
ok
[root@localhost ~]# [ 2 < 1 ] && echo 'ok'
-bash: 2: No such file or directory
[root@localhost ~]# [ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok'
ok
流程控制语句
常见分支结构:
if
case
常见循环结构:
for
while
until
shell命令,可以按照分号分割,也可以按照换行符分割。如果想一行写入多个命令,可以通过“';”分割。
if 条件测试语句
then
action
[elif 条件
action
else
action
]
fi
说明:
[] 表示这段代码可选.
当条件为真(0)时执行then后面的语句,否则执行else后面的语句;
以fi作为if结构的结束。
if [ condition ];then
action
fi
if [ $# == 1 ] ;then
if [ -f $1 ] ; then
echo "$1 is a file"
if [ -x $1 ] ;then
$1
else
echo "It is not x"
fi
else
if [ -d $1 ] ; then
echo "$1 is a dir"
else
echo "$1 is not exit"
echo "It will be creator"
touch $1
fi
fi
else
echo "the val is not valid"
fi
Case语句
case选择语句使用(case/esac)
语法结构
case $arg in
pattern | sample) # arg in pattern or sample
;;
pattern1) # arg in pattern1
;;
*) #default
;;
esac
说明:
“条件”可以是变量、表达式、shell命令等;
“模式”为条件的值,并且一个“模式”可以匹配多种值,不同值之间用竖线(|)联结 ;
一个模式要用双分号(;;)作为结束 ;
以逆序的case命令(esac)表示case分支语句的结束
echo "================case test=============="
case $# in
1)
echo "the var is $1"
;;
2)
echo "the var is $1 $2"
;;
3)
echo "the var is $1 $2 $3"
;;
*)
echo "too many vars"
;;
esac
#!/bin/sh
case $1 in
start | begin)
echo "start something"
;;
stop | end)
echo "stop something"
;;
*)
echo "Ignorant"
;;
esac
For循环
do
命令(通常用到循环变量)
done
“列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值;
do和done之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次;
如果中括号中的部分省略掉,Bash则认为是“in $@”,即执行该程序时通过命令行传给程序的所有参数的列表。
echo "================for test=============="
sum=0
for((i=0;i<10;i++ ))
do
#echo $i
sum=$(( $sum +$i ))
done
echo "sum = $sum"
j=0
#echo "enter a word "
#read find_ch
#for i in a b c d e f g
#do
# if [ $i == $find_ch ] ; then echo "find it ($j)" break
# fi
# j=$(( $j+1))
#done
While循环
do
命令
done
while循环中,只要条件为真,就执行do和done之间的循环命令;
until循环中,只要条件不为真,就执行do和done之间的循环命令,
避免生成死循环
echo "================while test=============="
sum=0
loop=$1
while [[ $loop -gt 0 ]]; do
#statements
echo "$loop"
sum=$(( $sum + $loop))
loop=$(($loop -1 ))
done
echo "$sum"
break 和continue 语句
break 语句
用来终止重复执行的循环。break通常在进行一些处理后退出循环或case语句。如果是在一个嵌入循环里,可以指定跳出的循环个数。例如如果在两层循环内,用break 2刚好跳出整个循环。
continue语句
它不会跳出循环,只是跳过这个循环步。
函数使用
说明:
中括号中的部分可以省略;
如果在函数内部需要使用传递给函数的参数,一般用$0、$1、......、$n,以及$#、$*、$@这些特殊变量 :
$0为执行脚本的文件名;
$1是传递给函数的第1个参数 ;
$#为传递给函数的参数个数;
$*和$@为传递给函数的所有参数
echo "welcome to start for shell language"
func1(){
echo "function1 test"
}
func2(){
echo "function2 test"
echo $1
}
func1
func2 Goodbye
函数返回值
#!/bin/bash
echo "welcome to start for shell language"
func1(){
echo "function1 test"
}
func2(){
# echo "function2 test"
# echo $1
if [ $#>=1 ] ; then
return 1
else
return 0
fi
}
echo "the func2 result is `func2 Goodbye ;echo $?`"
使用$?变量存放退出状态码,由函数中的最后一条语句决定
2)return命令
#!/bin/bash
func3() {
read -p "enter a number: " value
return $[ $value + 1 ]
}
func3
echo "func3's exit status is $?"
3)使用函数输出
#!/bin/bash
func3() {
read -p "enter a number: " value
echo $[ $value + 1 ] echo显示值
}
result=`func3` 将函数输出赋值给新变量
echo "new value is $result"