shell语法细节
脚本名称叫test.sh 入参三个: 1 2 3
运行test.sh 1 2 3后
一、shell语法
case语句格式
# vi test.sh
:
echo "input : "
read num
echo "the input data is $num"
case $num in
1) echo "January";; 双分号结束
2) echo "Feburary";;
5) echo "may" 每个case可以有多条命令
echo "sdfd"
echo "sdf";; 但最后一条命令一定是双分号结束
*) echo "not correct input";; *)是其他值、default的意思
esac
# sh ./test.sh
input :
2
the input data is 2
Feburary
# sh ./test.sh
input :
ter
the input data is ter
not correct input
case 语句如果某个选项没有任何语句,也要加;; 否则会出下边错误
test: line 166: syntax error near unexpected token `)'
test: line 166: `"system hostname config")'
为什么输入no,仍不匹配到[no]
原来[]是专门针对单字符的值,如果用[no],就是n和o之一
一个getyn()函数的例子
if, case,匹配字符串最常见,但如何匹配一段很长的输出,一堆文字?最好方法,用“*”,如:*"command not found"*
[macg@machome ~]$ vi test.sh
var=$(ls -l $1) $()取命令输出,$1是命令行参数
echo "output is $var"
case $var in
"-rw-rw-r--"*) echo "this is not a execute file";;
"-rwxrwxr-x"*) echo "this is a execute file";
注意*在双引号外边
esac
[macg@machome ~]$ sh test.sh 22.txt
output is -rw-rw-r-- 1 macg macg 15 Jun 9 19:00 22.txt
this is not a execute file
[macg@machome ~]$ chmod +x 22.txt
[macg@machome ~]$ sh test.sh 22.txt
output is -rwxrwxr-x 1 macg macg 15 Jun 9 19:00 22.txt
this is a execute file
例2.匹配file命令输出的一堆文字,以获知文件类型
用’ ’ 取输出,然后用CASE+*对输出做修饰处理.
[macg@machome ~]$ vi test.sh
var=`file $1` ` `和$( )作用相同,是取命令输出
echo "output is $var"
case $var in
"$1: ASCII text"*) echo "this is a text file";;
"$1: directory"*) echo "this is a directory";;
注意*在双引号外边
esac
[macg@machome ~]$ sh test.sh 22.txt
output is 22.txt: ASCII text
this is a text file
[macg@machome ~]$ sh test.sh test-dir
output is test-dir: directory
this is a directory
最典型的shell case命令匹配命令行,用于sys v启动脚本的start|stop|restart|status处理
#!/bin/bash
echo $#
echo $@
echo $*
func ()
{
echo "hello world"
}
echo "input : "
read num
echo "the input data is $num"
case $num in
1) echo "January";; # 双分号结束
2) echo "Feburary";;
5) echo "may" #每个case可以有多条命令
echo "sdfd"
echo "sdf";; #但最后一条命令一定是双分号结束
6) "func";;
*) echo "not correct input";; #*)是其他值、default的意思
esac
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
以下是定义方法及调用需要注意那些事项。
一、定义shell函数(define function)
语法:
[ function ] funname [()]
{
action;
[return int;]
}
说明:
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
实例(testfun1.sh):
#!/bin/sh
fSum 3 2;
function fSum()
{
echo $1,$2;
return $(($1+$2));
}
fSum 5 7;
total=$(fSum 3 2);
echo $total,$?;
sh testfun1.sh
testfun1.sh: line 3: fSum: command not found
5,7
3,2
1
5
几点结论:
1、必须在调用函数地方之前,声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。一次必须在使用函数前先声明函数。
2、total=$(fSum 3 2); 通过这种调用方法,我们清楚知道,在shell 中 单括号里面,可以是:命令语句。 因此,我们可以将shell中函数,看作是定义一个新的命令,它是命令,因此 各个输入参数直接用 空格分隔。 一次,命令里面获得参数方法可以通过:$0…$n得到。 $0代表函数本身。
3、函数返回值,只能通过$? 系统变量获得,直接通过=,获得是空值。其实,我们按照上面一条理解,知道函数是一个命令,在shell获得命令返回值,都需要通过$?获得。
二、函数作用域,变量作用范围
实例(testfun2.sh ):
结论:
1、定义函数可以与系统命令相同,说明shell搜索命令时候,首先会在当前的shell文件定义好的地方查找,找到直接执行。
2、需要获得函数值:通过$?获得
3、如果需要传出其它类型函数值,可以在函数调用之前,定义变量(这个就是全局变量)。在函数内部就可以直接修改,然后在执行函数就可以读出修改过的值。
4、如果需要定义自己变量,可以在函数中定义:local 变量=值 ,这时变量就是内部变量,它的修改,不会影响函数外部相同变量的值 。