Linux下Shell编程(二)

来源:互联网 发布:拳皇2002键盘优化版 编辑:程序博客网 时间:2024/05/01 13:43

Shell编程下的特殊字符

字符       说明

    $      指出shell变量名的开始

    |      把标准输出通过管道传送到下个命令

    #      标记注释开始

    &      在后台执行进程

    ?      匹配一个字符

    *      匹配一个或几个字符

    >      输出重定向操作符

    <      输入重定向操作符

 >>      输出重定向操作符{添加到文件}

    <<       跟在输入结束字符串后(HERE)操作符

    []       列出字符的范围

    [a-z]    az的全部字符

    [a,z]    意指az字符

双引号

在字符串含有嵌入的空格时,用双引号括起来。

例子:

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_checho $find_ch
文本获取字符串
#!/bin/bashecho "welcome to start for shell language"count=1cat $1 | while read linedo        echo "Line$count:$line"        count=$[ $count +1 ]doneecho "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 ] ;then
echo "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

if 语句

shell命令,可以按照分号分割,也可以按照换行符分割。如果想一行写入多个命令,可以通过“';”分割。

if 条件测试语句

then

action

[elif 条件

action

else

action

]

fi


说明:
[] 表示这段代码可选.
当条件为真(0)时执行then后面的语句,否则执行else后面的语句;
以fi作为if结构的结束


最简单的条件判断
if [ condition ];then 
    action
fi
较复杂语句
if [ $# == 1 ] ;thenif [ -f $1 ] ; thenecho "$1 is a file"if [ -x $1 ] ;then$1elseecho "It is not x"fielse if [ -d $1 ] ; thenecho "$1 is a dir"elseecho "$1 is not exit"echo "It will be creator"touch $1 fifielseecho "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 $# in1)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 instart | begin)    echo "start something"      ;;stop | end)    echo "stop something"      ;;*)    echo "Ignorant"      ;;esac


For循环

for 变量 [in 列表]
do
  命令(通常用到循环变量)
done
说明:
“列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值;
do和done之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次;
如果中括号中的部分省略掉,Bash则认为是“in $@”,即执行该程序时通过命令行传给程序的所有参数的列表。 
举例
echo "================for test=============="sum=0for((i=0;i<10;i++ ))do#echo $isum=$(( $sum +$i ))doneecho "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循环

while/until 条件
do
命令
done
说明:
while循环中,只要条件为真,就执行do和done之间的循环命令; 
until循环中,只要条件不为真,就执行do和done之间的循环命令,
或者说,在until循环中,一直执行do和done之间的循环命令,直到条件为真;
避免生成死循环

echo "================while test=============="sum=0loop=$1while [[ $loop -gt 0 ]]; do#statementsecho "$loop"sum=$(( $sum + $loop))loop=$(($loop -1 ))doneecho  "$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}func1func2 Goodbye

函数返回值

#!/bin/bashecho "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 $?`"

使用$?变量存放退出状态码,由函数中的最后一条语句决定

2return命令

#!/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"












0 0
原创粉丝点击