shell脚本编程学习笔记(二)

条件

用于判断的命令:

test 或者 [  ]

testshell的内置命令

test命令可以判断的条件类型三种:

  • 字符串比较
字符串比较 描述
string1 = string2 字符串相同返回真
string1 != string2 字符串不同返回假
-n string 字符串不NULL空为真
-z string 字符串为NULL为真
  • 算术比较

    类似C语言的关系运算符

算数比较 描述
expression1 -eq expression2 两个表达式相等结果为真
expression1 -ne sexpression2 两个表达式不等结果为真
expression1 -gt sexpression2 表达式1大于表达式2则结果为真
expression1 -ge sexpression2 表达式1大于等于2则结果为真
expression1 -lt sexpression2 表达式1小于表达式2则结果为真
expression1 -le sexpression2 表达式1小于等于表达式则结果为真
!expression 表达式结果取反
  • 文件有关条件测试

    file为文件名

    文件测试 描述
    -d file 文件类型为目录则结果为真
    -f file 是普通文件则结果为真
    -g file 文件set-group-id位被设置则结果为真
    -r file 文件可读则为真
    -s file 文件大小不为0则结果为真
    -u file 文件set-user-id位被设置则结果为真
    -w file 文件可写则为真
    -x file 文件可执行结果为真
    -e file 文件存在结果为真(不可移植,所以一般-f)
    #!/bin/sh
    if [ -f main.c ] # 判断文件main.c是否存在
    then
    	echo "main.c exists"
    fi
    
    #!/bin/sh
    if test -f main.c # 判断文件main.c是否存在
    then  
    	echo "main.c exists"
    fi
    
    #!/bin/sh
    if [ -d main.c ] # 判断文件main.c是否是目录
    then  
    	echo "file is a directory"
    else
    	echo "file is not a directory"
    fi
    

控制结构

if语句

语法:

#!/bin/sh

if 
then
	
fi
if 
then
	
else
	
fi
if 
then
	
elif 
	
else
	
fi
#!/bin/sh
read string # 获取终端输入存放在string变量中

if [ $string = "yes" ] 
then  
	echo "you are right"
else
	echo "you are error"
fi

exit 0  # 给shell程序一个退出值

for循环语句

语法:

for  in 
do 
	
done
	

例1:

#!/bin/sh

for var in "aa bb cc"  #遍历字符串
do 
    echo $var
done

exit 0

输出结果:

aa bb cc

如果程序为:

#!/bin/sh

for var in "aabbcc"  #遍历字符串
do 
    echo $var
done

exit 0

则结果为:

aabbcc

例2-利用通配符遍历:

for file in $(ls f*.sh) #遍历输出当前目录所有以f开头的脚本文件
do
    echo $file
done

exit 0

while循环语句

当条件为真的时候反复执行

while  #条件为真反复执行
do 
	
done
echo "Enter your password"
read password # 获取终端输入存放于password变量

while [ $password != "123456" ] 
do
    echo "try again"
    read password
done

echo "pass"

exit 0

until语句

until  #反复执行直到条件为真
do 
	
done 
read string

until [ $string = "linux" ]
do 
    read string
done

echo $string

exit 0

case语句

语法:

case varibale in
	pattern | pattern ...) statements;;
    pattern | pattern ...) statements;;
esac

例1:

#!/bin/sh

read week

case $week in
    "Mon") echo "Monday";;
    "Tue") echo "Tuesday";;
    "Wed") echo "Wednesday";;
    "Thu") echo "Thursday";;
    "Fri") echo "Friday";;
    "Sat") echo "Saturday";;
    "Sun") echo "Sunday";;
    *) echo "input error";;     #error to input others
esac

exit 0

例2-合并匹配模式:

#!/bin/sh
read string
case $string in
   AA | BB | CC) echo "AA BB CC";;  #多个条件一起匹配,其中一个成立就执行这一分支语句
   L* | l*) echo "Linux";; # 只要输入的string是含有L或者l开头的字符串就会执行这一分支语句 
   *) echo "Hell world";;
esac

exit 0

例3-执行多条语句:

#!/bin/sh

read string

case $string in
	yes | y | Yes | YES) 
    	echo "Yes, u r right" #执行多条语句
        echo "good job";;     #执行多条语句
    L* | l*) echo "Linux";;
    *) 
        echo "Hell world"
        exit 1;;
esac

exit 0

命令列表

AND列表

与C语言的逻辑与类似

语法:

 &&  &&  && ... 
#从左往右执行,前面一条语句执行返回真,下一条语句才能执行,
#直到有一条命令返回false,或者执行到最后一条语句

&&的作用:

检查前一条命令的返回值
#!/bin/sh
read string
if [ $string = "Linux"  ] && echo "Hello Linux"  
then
    echo "success to run"
else 
    echo "fail to run"
fi

输入为"Linux",则输出结果为:

Hello Linux
success to run

输入不等于"linux",则输出结果为:

fail to run

OR列表

与C语言的逻辑或类似

 &&  &&  || ... 
#从左往右执行,前面一条语句执行返回false,下一条语句才能执行,
#直到有一条命令返回True,或者执行到最后一条语句
#!/bin/sh

touch  xxx_file 
rm -f xxx_file

read string

if [ -f xxx_file ] || [ $string = "Linux" ] 
then 
    echo "Succes to Run"
else
    echo "Failed to run"
fi

语句块

使用花括号{}构造语句块:想在单条语句执行地方执行多条语句

#!/bin/sh
read string
if [ $string = "Linux"  ] && {  # 语句块开始
    echo "Hello Linux" 
    echo "AA BB CC"
    echo "Yes"
    }  #语句结束
then
    echo "success to run"
else 
    echo "fail to run"
fi

exit 0

函数

语法

()
{

}

例1:

#!/bin/sh

PrintHello()
{
    echo "hello world"
}

echo "Linux"

PrintHello   #调用函数

exit 0

函数返回值

  • 返回数字值
通过return命令返回
#!/bin/sh

PrintHello()
{
    echo "hello world"
}

Atest()
{
    echo "Test"
    return 20000
}

Atest

ret=$?   #通过$?得到函数返回

echo "Linux"
echo $ret
PrintHello

exit 0
  • 返回字符串

    让函数将需要返回的字符串保存在一个变量中,该变量然后可以在函数
    结束之后被使用
    
    #!/bin/sh
    
    string=""
    
    ReturnString()
    {
        a="hello world"
        string=$a
    }
    
    echo $string
    
    exit 0
    

局部变量

使用local关键字声明局部变量,局部变量和全局变量相同,全局变量覆盖局部变量(即使用全局变量)

函数传参

调用函数时可以向其传递参数。在函数内,通过 $n 的形式来获取参数的值:
$1表示第一个参数,$2表示第二个参数...$n表示第n个参数
#!/bin/bash
# author:guangjieMVP

function_param(){
    echo "第1个参数为 $1 !"
    echo "第2个参数为 $2 !"
    echo "第3个参数为 $3 !"
    echo "第10个参数为 $10 !"
    echo "第10个参数为 ${10} !"
    echo "第11个参数为 $11 !"
    echo "参数总个数有 $# !"
    echo "所有参数 $* !"
}

function_param 1 2 3 4 5 6 7 8 9 15 20

输出结果:

第1个参数为 1 !
第2个参数为 2 !
第3个参数为 3 !
第10个参数为 15 !
第10个参数为 15 !
第11个参数为 20 !
参数总个数有 11 !
所有参数 1 2 3 4 5 6 7 8 9 15 20 !

shell文件包含

语法:

.  
或
source 

shell_test2.sh:

#!/bin/sh

PrintString()
{
    echo "I love Linux"
}

string="Hello world"

shell_test1.sh:

#!/bin/sh

. ./shell_test2.sh

PrintString
s
echo $string

exit 0

你可能感兴趣的:(shell)