shell 脚本之语法

一、条件测试

 1、test和[
[root@www SHELL]# cat shell.sh
#!/bin/bash
val=10

test $val -gt 9  //test 传给各命令的参数之间用空格隔开
echo $?

test $val -gt 10
echo $?

[ $val -gt 9 ]   // [
echo $?

[ $val -gt 10 ]
echo $?


[root@www SHELL]# chmod +x shell.sh
[root@www SHELL]# ./shell.sh   //测试结果为真,则该命令的Exit Status为0
0
1
0
1
测试命令
[ -d DIR ] : 如果DIR存在并且是一个目录则为真
[ -f FILE ] : 如果FILE存在且是一个普通文件则为真
[ -z STRING ] : 如果STRING的长度为零则为真
[ -n STRING ] : 如果STRING的长度非零则为真
[ STRING1 = STRING2 ] : 如果两个字符串相同则为真
[ STRING1 != STRING2 ] : 如果字符串不相同则为真

[root@www SHELL]# cat shell.sh  
#!/bin/bash
read str

[ -d "$str" ]  //判断该目录是否存在并且该目录为真 ($_str变量事先没有定义,则被Shell展开为空字符串,会造成测试条件的语
法错误,所以把变量取值放到""中)
echo $?

[ -f "$str" ]  //判断文件存在是否为普通文件
echo $?

[ "X$str" == "X" ] // 判断字符串是否为空
echo $?

[ -z "$str" ]  //判断该字符串长度为0
echo $?

[ ! -z "$str" ]  //逻辑非
echo $?

[ -n "$str" ]  //判断该字符串长度不为0
echo $?

[ "X$str" != "Xhello" ] // 判断两个字符串是否相等,最好在字符串前面加上一个字符
echo $?
测试结果:
[root@www SHELL]# ./shell.sh

1
1
0
0
1
1
0
[root@www SHELL]# ./shell.sh
lalal
1
1
1
1
0
0
0
[root@www SHELL]# ./shell.sh
shell.sh
1
0
1
1
0
0
0
$@:
$?: 0
$$: 3348

2. if/then/elif/else/fi

[root@www SHELL]# cat shell.sh
#!/bin/bash
read name
read score
if [ $score -ge 90 ];then   //if条件 
	echo "$name,you are excellent"
elif [ $score -ge 80 -a $score -lt 90 ];then //逻辑与,两条命令写在一行上,用分号隔开
	echo "$name,you are good"
elif [ $score -ge 60 -a $score -lt 80 ];then
	echo "$name,you passed"
else 
	echo "gou out"
fi
[root@www SHELL]# ./shell.sh
lala
65
lala,you passed
[root@www SHELL]# cat shell.sh
#!/bin/bash
read name
read score
[ $score -gt 90 ] && { echo "$name,you are good"    // &&相当于if..then,连接两个命令
}


[ $score -gt 90 ] || { echo "$name, you are a little good" // || 相当于if not... then
}

3. case/esac

case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式, 而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干 条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳 到esac之后,不需要像C语言一样用break跳出。

[root@www SHELL]# cat shell.sh
read val
case $val in 
    "hello")
	echo "hi"
	;;
    "nihao")
	echo "nihao"
	;;
	*)
	echo "*"
	;;
esac
[root@www SHELL]# ./shell.sh
hello
hi
[root@www SHELL]# ./shell.sh
nihao
nihao
[root@www SHELL]# ./shell.sh
ni   
*

二、循环语句

1、for/do/done

[root@www SHELL]# cat shell.sh
#!/bin/bash

#for i in {a..z}
#do
#	echo " val is: $i"
#done

sum=0
for ((i=0; i<=100;i++ )) //类c方式
do
	let sum+=i
done
echo "sum is $sum"

2、while/do/done和until/do/done

[root@www SHELL]# cat shell.sh
#!/bin/bash

#sum=0
#i=0
#while [ $i -le 100 ]
#do
#let sum+=i
# let i++
#done
#echo $sum

sum=0
i=0
until [ $i -gt 100 ]
do
 let sum+=i
 let i++
 done
 echo $sum

3、位置参数和特殊变量

[root@www SHELL]# cat shell.sh
#!/bin/bash
echo '$0:' $0  //相当于c函数中的argv[0]
echo '$1:' $1  //argv[1]
echo '$2:' $2  //argv[2]
echo '$#:' $#  //argc 
echo '$@:' $@  //表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
echo '$?:' $?
echo '$$:' $$ //当前shell进程号
[root@www SHELL]# cat shell.sh
#!/bin/bash
echo '$0:' $0
echo '$1:' $1
echo '$2:' $2
echo '$#:' $#
echo '$@:' $@
echo '$?:' $?
echo '$$:' $$


shift 1  // 位置参数用shift左移
echo '$0:' $0
echo '$1:' $1
echo '$2:' $2
echo '$#:' $#
echo '$@:' $@
echo '$?:' $?
echo '$$:' $$

[root@www SHELL]# ./shell.sh wo ni
$0: ./shell.sh
$1: wo
$2: ni
$#: 2
$@: wo ni
$?: 0
$$: 15752
$0: ./shell.sh
$1: ni
$2:
$#: 1
$@: ni
$?: 0
$$: 15752
[root@www SHELL]# cat shell.sh
#!/bin/bash
case "$1" in             // $1相当于argv[1]
    start | -s | -S )
   echo "your cmd is start"
       ;;
    st[oO]p )
	   echo "your cmd is stop"
	   ;;
    restart )
  echo "your cmd is restart"
   ;;
 * )
 echo "your cmd is default"
  ;;
esac
[root@www SHELL]# ./shell.sh start
your cmd is start
[root@www SHELL]# ./shell.sh s
your cmd is default
[root@www SHELL]# ./shell.sh -s
your cmd is start
[root@www SHELL]# ./shell.sh -S
your cmd is start
[root@www SHELL]# ./shell.sh stOP
your cmd is default
[root@www SHELL]# ./shell.sh stOp
your cmd is stop

4、 函数

[root@www SHELL]# cat shell.sh
#!/bin/bash
sum=0
function add() {                       //函数定义时没有参数也没有返回值
	echo "this is a function !arg1:$1,arg2:$2" 
	let sum=$1+$2          // 调用参数时可以传任意个参数,通过$0、$1、$2传参
	echo $sum
	return 0             //返回的是退出码
}
#add 100 200
res=$(add 100 200)
echo "res:$res"

5、eval命令(Linux)

shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。
(1)eval用于回显变量
[root@www SHELL]# COUNT=10
[root@www SHELL]# eval echo $COUNT  //等价于 echo $COUNT
10
[root@www SHELL]# echo $COUNT
10

(2)二次扫描
[root@www SHELL]# val="cat test"
[root@www SHELL]# eval $val  // 第一次扫描把变量进行了置换,第二次扫描执行该字符串中的命令
we are young
[root@www SHELL]# echo $val
cat test

(3) 命令还可以用来显示出传递给脚本的最后一个参数
[root@www SHELL]# echo "last argument is $(eval echo \$$#)"  //第一次扫描解析成参数个数,第二次得出最后一个参数
last argument is bash
[root@www SHELL]# echo "last argument is $(eval echo $#)"      
last argument is 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值