Wang Tian
●Shell中引号使用时的注意事项是什么?
在Shell中使用单引号和双引号要特别注意如下一个区别:单引号所包含的字符串里若含有变量($var),不作替换处理,而双引号所包含的字符串则会自动进行变量的替换。例如:
$ myname = “Li Xi”
$ echo “My name is $myname.”
My name is Li Xi.
$ echo ‘My name is not $myname.”
My name is not $myname.
●Shell中的环境变量有哪些?它们各有什么作用?
环境变量在实际Shell编程中广泛使用,是需要重点掌握的。现在只介绍几个主要的常用的变量:
1)$HOME 当前用户的主目录
2)$PATH 命令的搜索路径
3)$PS1 命令提示符,就是你在Linux命令行下那个总出现的提示符,通常是$,也可能定制成其他类型。
4)$PS2 第二命令提示符,比如当你输入的命令需要接受输入时,也会给出一个提示符,通常为>
5)$IFS 输入字段分隔符,就是当你读入信息时用来将字符串分隔为单词的符号,通常为空格、制表符以及回车符号。
6)$0 所执行的Shell脚本的名字
7)$# Shell脚本(命令)传递的参数个数
8)$$ 所执行的Shell脚本的进程号,通常用来生成唯一的临时文件名
●Shell中的参数变量有哪些?它们各有什么作用?
参数变量与环境变量同样重要,当你编写的脚本需要调用参数时,系统会自动为你创建这些参数变量,如果不需要传递参数,上面的环境变量$#的值会设为0。参数变量比较简单,就有三个而已:
1)$1, $2, … 传递给脚本的参数1,2,…
2)$* 所有参数的一个列表,参数之间用IFS中所定义的第一个分隔符分隔
3)$@ $*的一个变种,它不使用IFS环境变量的分隔符,即使IFS为空,也不影响其表示。所以这是比$*更好的一种表示方式。
●Shell中的布尔测试命令是什么?其用法怎样?
Shell中的布尔测试与一般编程语言有所不同,有两个命令可以表示(它们其实是同一个命令,只是表示方法不同而已):test和[(这不是左括号吗?也算命令吗?答案是肯定的,不信你可以去检查ls -l /usr/bin/[。还要注意一点的是,通常使用[表示时,会在测试完成后加上一个],其实这只是为了可读性而增加的,没有实际意义)。例如:
if test –f my.txt 和 if [ -f my.txt ] 都表示测试文件my.txt是否存在。(注意[与-f之间必须有空格)
使用布尔测试符测试的条件类型包含三类:字符串测试/算术测试/文件测试,具体分为:
1)字符串测试
①string1 = string2 测试两字符串是否相等
②string1 != string2 测试两字符串是否不等
③-n string 测试字符串是否不为空
④-z string 测试字符串是否为空
2)算术测试
①expr1 -eq expr2 测试两表达式是否相等
②expr1 -ne expr2 测试两表达式是否不等
③expr1 -gt expr2 测试expr1是否大于expr2
④expr1 -ge expr2 测试expr1是否大于等于expr2
⑤expr1 -lt expr2 测试expr1是否小于expr2
⑥expr1 -le expr2 测试expr1是否小于等于expr2
⑦!expr 测试表达式是否为假
3)文件测试
①-d file 测试该文件是否为目录
②-e file 测试该文件是否存在,但该选项可移植性不好,通常改用-f
③-f file 测试该文件是否为常规文件
④-g file 测试该文件是否设置了set-group-id
⑤-r file 测试该文件是否可读
⑥-s file 测试该文件是否不空
⑦-u file 测试该文件是否设置了set-user-id
⑧-r file 测试该文件是否可写
⑨-x file 测试该文件是否可执行
●Shell中的条件控制结构是怎样的?
编程语言中的条件控制结构通常是if..then之类的,Shell也不例外。其格式如下:
if 条件1
then
语句A
elif 条件2
then
语句B
elif 条件3
then
语句C
else
语句D
fi
●Shell中的循环控制结构是怎样的?
Shell中的循环结构也与其他编程语言类似。基本格式如下:
1)for循环(适于在字符串集中循环,注意其与通常的for语句的差别)
for 变量 in 值集
do
语句
done
2)while循环(适于在数集中循环或条件测试)
while 条件 do
语句
done
3)until语句(与while的条件判断正好相反)
until 条件
do
语句
done
●关于case语句的用法是怎样?
case的结构比较复杂,所以在这里单列出来。其基本格式为:
case 变量 in
模式 [ | 模式] …) 语句A;;
模式 [ | 模式] …) 语句B;;
…
esac
看个例子吧:
case “$dayofweek” in
1) echo “Today is Monday”;;
2) echo “Today is Tuesday”;;
3) echo “Today is Wednesday”;;
4) echo “Today is Thursday”;;
5) echo “Today is Friday”;;
6) echo “Today is Saturday”;;
7) echo “Today is Sunday”;;
*) echo “Sorry, your input is wrong!”;;
esac
●Shell中的语句链表是怎样的?
Shell中有一项比较特殊的用法,就是将多个语句串联在一起,这样可以使编程更为简洁。这些语句的串联通常是条件测试语句,一般用两个符号来组织它们:&&(表示与)和||(表示或)。&&链表可以连接一组命令,当&&前面的命令都成功时,才执行&&后面的命令。而||链表则当其中一条命令成功时,即退出。这两个符号甚至还可以链接语句集,只要你把这些语句用{}包围就好了。
●在Shell中怎么使用函数?
Shell中的函数定义很简单,基本格式为:
函数名()
{
语句体
}
函数的使用需要注意的几点:
1)函数必须先定义才能调用
2)当函数调用的时候,原来脚本的参数,如$*,$@,$#,$1,$2等会被函数的相应参数所替换,函数调用完成,它们的值则回归到原值。
3)在函数内部,可以使用local来定义局部变量,该变量仅在函数内部有效。如果局部变量与全局变量同名,局部变量会在函数内部替换全局变量。
●Shell中是否也有break命令,是否也有continue命令?
答案是肯定的,和其他编程语言一样,break用来直接跳出for, while或until循环,而continue用来跳出for, while或until的当前循环。
●Shell中出现:在单独一行是什么意思?
有时我们可以看到,Shell脚本中出现一行仅包括一个冒号,它的意思其实很简单,这个冒号就等于布尔变量true。实际上,它运行的速度比true还快。
●Shell中的.做什么用?
别小看这个.符号,它实际很有用处,这是Shell中一个特殊的命令符,用来在指定Shell脚本环境里执行命令(脚本)。这有点类似于C中的#include,它可以切换到某个脚本环境下来执行后续命令。其使用方法为:. ./script
●Shell中eval命令的作用?
eval命令用来求值。它会给出后面所接变量的值,这在多次赋值时很有用。
●Shell中exec命令的作用?
exec也是Shell中常用的命令,一般有两个作用:
1)用不同的程序名替换当前Shell脚本(主要功能)
2)修改当前文件描述符(次要功能)
●关于exit的用法还有什么?
我们常见的exit用来退出脚本运行,exit 0表示成功退出,如果在exit后面加状态码1-125则表示有错误发生,这些错误可由程序指定,另外Shell还保留了一些状态码:
1)126 文件不能执行
2)127 命令未找到
3)128及以上 收到一个信号
●Shell中export命令的作用?
export命令的主要作用是导出环境变量,使得该环境变量能被其他脚本和程序所用。
●Shell中expr命令的作用?
expr的主要作用是将其后的参数看作表达式来求值。它可以完成许多表达式的运算。