1、 set 命令
当没有参数的时候,列出系统中所有的自定义变量值;当有参数的时候,重置基本参数如 $1 、 $2 等。如 set `date` 将 date 命令的输出当作输入参数;
2 、 let 命令
执行算术运算。功能如 i=j+1,shell 语法为:
l et “i=$j+1” ,等同于 ‘expr’。 后者只能作用于整数,如 i=`expr $i+1`; 如果使用非整数,退出状态不为 0
3、expr
expr 也有模式匹配功能。
可以使用 expr 通过指定 冒号选项计算字符串中字符数。 .* 意即任 何字符重复 0 次或多次。
$value=accounts.doc
$expr $value : '.*'
输出: 12
在 expr 中可以使用字符串匹配操作,这里使用模式 . d o c 抽取文件附属名。
$expr $value : '/(.*/).doc' 在圆括号前加转义符号是表示圆括号是用于提取功能的。
输出: accounts
4、shift命令
将参数表向左移动一个位置, $2 变成 $1,... ,依次类推。
5、shell中可以嵌套命令,使用/`来保护内层命令,如`cd /`pwd/``。
6、设置 IFS 为换行符: IFS=’
’ (还真得换行)
7、两个特殊操作
命令 1 && 命令 2 :只有在命令 1 执行成功时才执行命令 2 ;
命令 1 || 命令 2 :命令 1 失败才执行命令 2 ;
8、变量赋值
“”引用的字符串需要shell解析其中的 `` 、 $ 、 / 等特殊字符,而 ’’ 引用的字 符串则被看作完全的
字符串, echo ‘`pwd`’ 将输出 `pwd` ;而 echo “`pwd`” 将输出当前目录 ;
变量 | 含义 |
$var | Var 的值,若无定义则无值 |
${var} | 同上,用于同 $varx 等类型变量区分 |
${var-thing} | Var 有定义时,取值 $var ;无定义时取值 thing ,而 $var 不变 |
${var=thing} | Var 有定义时,取值 $var ;无定义时取值 thing , $var 值设为 thing |
${var?message} | 有定义时取值 $var ;否则打印 message 并退出 shell ,若 message 为空串,打印 var:parameter not set |
${var+thing} | 有定义时取值 thing ;否则无值 |
9、shell内部变量
环境变量
当启动一个Shell脚本时,一些变量会由环境中的值进行初始化.在脚本中这些变量通常为大写字母,从而与用户定义的变量进行区分,而用户定义的变理常用小写字母来表示.创建的变量依赖于我们个人的配置.其中的许多列在手册页中,但是基本的一些列在下面的表中:
$HOME 当前用户的主目录
$PATH 用来进行命令查找的由冒号分隔的目录列表
$PS1 命令提示,通常为$,但是在bash中我们可以使用更为复杂的值.例如,字符串[/u@/h /W]$是流行的默认用法来告诉我们当前的用户,机器名称以及当前的工作目录,同时给出$提示.
$PS2 第二提示符,当提示额外的输入时使用,通常为>
$IFS 输入区域分隔符.当Shell读入输入时会使用一个字符列表来分隔输入的单词,通常是空格,tab和新行字符.
$0 Shell脚本的名称.
$# 传递的参数个数.
$$ 脚本的进程ID,通常用在一个脚本内部用来建立唯一的一个临时文件,如/tmp/tmp-file_$$.
如果我们的脚本调用一些参数,那么会建立一些其他的变量.即使没有传递参数,环境变量$#仍然存在,但是值却为0.
参数变量列在下面这个表中:
$1,$2,... 传递给脚本的参数.
$* 以单变量的形式显示所有的参数列表,由环境变量IFS中的第一个字符分隔.
$@ $*的一个灵巧变形.他并不使用IFS环境变量,所以如果IFS为空那么所有的所有的参数会一起运行.
变量 | 含义 |
$# | 参数个数 |
$* | 所有参数 |
$@ | 同上,稍有区别 |
$- | Shell 的选择项 |
$? | 上次执行命令返回值 |
$$ | Shell 的进程标识符 |
$! | 用 & 启动的最后一个命令的进程标识符 |
$HOME | cd 命令的缺省参数 |
$IFS | 参数分割词的字符表 |
| 信件文件,当其改变时给出信息 you have mail |
$PATH | 搜索命令的目录表 |
$PS1 | 提示符串,缺省为 $ |
$PS2 | 后继命令行提示符,缺省为 > |
有关 $* 和 $@ 得归纳:
$* 和 $@ 扩展为参数,并被重复扫描;参数得空格将字符串分成多个参数;
“$*” 表示 shell 文件的所有参数及其空格连在一起作为单个词处理;
“ $@ ”与 shell 文件接收的参数等价,参数中的空格被忽略,其结果是等同于原来参数 的一个单词列表。
10、 shell 模式匹配规则
* 匹配任意字符串,包括空字符串
? 匹配任意单字符串
[ABC] 匹配 ABC 中任意字符
“…” 完全与 … 匹配,引号保护特殊字符,也可以写成 ’…’
/C 匹配 C
11、 case 语句
case word in
模式 1) 命令 ;;
模式 2) 命令 ;;
…
*) 命令 [;;]
esac
只能匹配一个模式
12、 if 语句
if 命令
then
else
fi
其中换行很重要, then 、 else 和 fi 仅在换行或分号之后被识别, else 部分可选。可以利用case语句替代if和test测试语句,对于test命令不是内部命令的情况下,case语句执行的要快;
13、循环
1)for i [in 文件(参数)列表 ]
do
循环体
done
如果 i 后面没有 in 部分,则隐含地表示对 shell 文件的全部参数,即 $*
2) While 命令
do
循环体,只要命令返回状态为真便继续进行
done
3) until 命令
do
循环体,只要命令返回状态为假便继续执行
Done
例如:
While sleep 60
do
…
Done
每隔 60 秒执行一次循环中的操作;
另外 , where 处的控制命令可以是 true 、 false 、或者是 : ,冒号 命令是一个 shell 内部命令,仅 仅计
算参数值,然后返回“真”,但是它不需要调用系统中的命令,所以效率比 true 命令高 ;
4)break 命令:退出循环,取自 C 语言。
14、点号命令:
将文件作为标准输入,从中读入一行一行的命令在当前 shell 中执行,不要求文件具有可执行权限 ;
15、 文件命令习惯,后面加上当前进程号码 $$ 为好
16、标准输入命令read
$read greeting
Hello,world
$echo $greeting
Hello,world
17、here document 输入
<<s 从本地输入,直至出现字符串 s 为止,但是要解析输入中的特殊字符, `` , $ 和 / 。
<<’s’ 同上, 不进行替换。
<</s 同上。
如果谈到I/O重定向,就涉及到文件标识符(File Descriptor)的概念, 在Linux系统中,系统为每一个打开的文件指定一个文件标识符以便系统对文件进行跟踪,这里有些和C语言编程里的文件句柄相似,文件标识符是一个数字, 不同数字代表不同的含义,默认情况下,系统占用了3个,分别是0标准输入(stdin),1标准输出(stdout), 2标准错误(stderr), 另外3-9是保留的标识符,可以把这些标识符指定成标准输入,输出或者错误作为临时连接。通常这样可以解决很多复杂的重定向请求。
以下命令是把标准输出和错误都定向到文件
#ls /dev &>filename |
"&"在这里代表标准输出和标准错误,这里无论是正常输出还是错误信息都写到filename中了。
重新定义标准输入,输出,和错误的文件标识符
重新定义文件标识符可以用i>&j命令,表示把文件标识符i重新定向到j,你可以把"&"理解为"取地址"
请看以下例子
#exec 5>&1 |
表示把文件标识符5定向到标准输出,这个命令通常用来临时保存标准输入。
i>&j
# 重定向文件描述符i
到j
# 指向i
文件的所有输出都发送到j
.
命令j<>filename表示把文件打开,并指明文件标识符为j
"&-"表示关闭文件标识符
参考:http://blog.chinaunix.net/u1/34739/showart_283263.html