linux Shell学习笔记3
一.简单函数
函数的使用
BASH 是一个相对简单的脚本语言,不过为了方便结构化的设计,BASH 中也提供了函数定义的功能。BASH 中的函数定义很简单,只要向下面这样写就可以了:
function my_funcname {
code block
}
或者
my_funcname() {
code block
}
上面的第二种写法更接近于 C 语言中的写法。BASH 中要求函数的定义必须在函数使用之前,这是和 C 语言用头文件说明函数方法的不同。
更进一步的问题是如何给函数传递参数和获得返回值。BASH 中函数参数的定义并不需要在函数定义处就制定,
而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了;
BASH 的返回值可以用 return 语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,
则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过【 $?】 保留字来获得。
二.导出环境变量
export Evalue=123 #注意左右两边不能有空格
char * getenv("Evalue");//C函数
三.截断字符串
1.
basename工具,dirname basename 命令
命令替换
$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
$ echo $MYDIR
/usr/local/share/doc/foo
在第一行,简单地将要执行的命令以 反引号 括起。那不是标准的单引号,而是键盘中通常位于 Tab 键之上的单引号。
可以用 bash 备用命令替换语法来做同样的事:
$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
$ echo $MYDIR
/usr/local/share/doc/foo
2.
如您所见,bash 提供多种方法来执行完全一样的操作。使用命令替换可以
====从前往后删
$ MYVAR=foodforthought.jpg
# 两个"##"搜索最长匹配:foodfo,截断之后结果返回
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
# 一个"#"搜索最短匹配:fo,截断之后结果返回
odforthought.jpg
3.
====从后往前删
$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
#两个最长匹配.tar.gz删了,结果如下
chickensoup
$ echo ${MYFOO%.*}
#一个%,最短匹配,.gz删了,结果如下
chickensoup.tar
#记忆法: 美国键盘上的#$%,#在$的前面,从前删;%在$的后面,从后删
4.
可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3} #从第一个数字的位置下一个位置的字符开始 直到 第二个数字的位置的字符结束
#就是说pos(0)没有字符
cow
$ echo ${EXCLAIM:3:7}
abunga
四.比较运算符
运算符 描述 示例
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可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ] new than
filename1 -ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ] old than
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" ]
算术比较运算符
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 ]
五。循环
for
while
until
函数的使用
BASH 是一个相对简单的脚本语言,不过为了方便结构化的设计,BASH 中也提供了函数定义的功能。BASH 中的函数定义很简单,只要向下面这样写就可以了:
function my_funcname {
code block
}
或者
my_funcname() {
code block
}
上面的第二种写法更接近于 C 语言中的写法。BASH 中要求函数的定义必须在函数使用之前,这是和 C 语言用头文件说明函数方法的不同。
更进一步的问题是如何给函数传递参数和获得返回值。BASH 中函数参数的定义并不需要在函数定义处就制定,
而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了;
BASH 的返回值可以用 return 语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,
则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过【 $?】 保留字来获得。
二.导出环境变量
export Evalue=123 #注意左右两边不能有空格
char * getenv("Evalue");//C函数
三.截断字符串
1.
basename工具,dirname basename 命令
命令替换
$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
$ echo $MYDIR
/usr/local/share/doc/foo
在第一行,简单地将要执行的命令以 反引号 括起。那不是标准的单引号,而是键盘中通常位于 Tab 键之上的单引号。
可以用 bash 备用命令替换语法来做同样的事:
$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
$ echo $MYDIR
/usr/local/share/doc/foo
2.
如您所见,bash 提供多种方法来执行完全一样的操作。使用命令替换可以
====从前往后删
$ MYVAR=foodforthought.jpg
# 两个"##"搜索最长匹配:foodfo,截断之后结果返回
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
# 一个"#"搜索最短匹配:fo,截断之后结果返回
odforthought.jpg
3.
====从后往前删
$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
#两个最长匹配.tar.gz删了,结果如下
chickensoup
$ echo ${MYFOO%.*}
#一个%,最短匹配,.gz删了,结果如下
chickensoup.tar
#记忆法: 美国键盘上的#$%,#在$的前面,从前删;%在$的后面,从后删
4.
可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3} #从第一个数字的位置下一个位置的字符开始 直到 第二个数字的位置的字符结束
#就是说pos(0)没有字符
cow
$ echo ${EXCLAIM:3:7}
abunga
四.比较运算符
运算符 描述 示例
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可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ] new than
filename1 -ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ] old than
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" ]
算术比较运算符
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 ]
五。循环
for
while
until