1 基本语法
1.1 shell文件结构
shell文件开头必须有如下标记(必须放在文件的第一行):
#!/bin/sh
符号#!
告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh
来执行程序。
当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
要使脚本可执行:
运行chmod +x filename
这样才能用./filename
来运行
1.2 注释
用#
作为单行注释符。
1.3 变量
shell所有的变量都由字符串组成,且不需要声明,直接赋值就可以,应用变量的话,用$
+变量名的形式。
变量赋值语句举例:
a="hello world"
打印变量举例:
echo "A is:"
echo $a
有时候变量名很容易与其他文字混淆,比如:
num=2
echo "this is the $numnd"
这并不会打印出"this is the 2nd"
,而仅仅打印"this is the "
,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。
可以使用花括号{}
来告诉shell要打印的是num变量:
num=2
echo "this is the ${num}nd"
输出: this is the 2nd
1.4 环境变量
由export关键字处理过的变量叫做环境变量。如PATH
,CPLUS_INCLUDE_PATH
2 概念
2.1 管道, 重定向和backtick
2.1.1 管道 (|
)
将一个命令的输出作为另外一个命令的输入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有“hello”
的行并计算其行数。
在这里grep
命令的输出作为wc
命令的输入。当然您可以使用多个命令。
2.1.2 重定向
将命令的结果输出到文件,而不是标准输出(屏幕)。
符号 | 说明 |
---|---|
> | 写入文件并覆盖旧文件 |
>> | 加到文件的尾部,保留旧文件内容。 |
举例
ip route>file1
可以将ip route的输出结果写入file1文件中。
2.1.3 backtick
backtick就是键盘上esc下方那个。
符号 | 说明 |
---|---|
` | 可以将一个命令的输出作为另外一个命令的一个命令行参数。 |
命令:
find . -mtime -1 -type f -print
用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。
如果想将所有查找到的文件打一个包,则可以使用以下脚本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
3 流程控制语句
3.1 if
“if” 表达式 如果条件为真则执行then后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…
通常用[ ]
来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ]
:判断是否是一个文件
[ -x "/bin/ls" ]
:判断/bin/ls是否存在并有可执行权限
[ -n "$var" ]
:判断$var变量是否有值
[ "$a" = "$b" ]
:判断$a和$b是否相等 ,注意“=”和变量之间要有空格。
执行man test可以查看所有测试表达式可以比较和判断的类型。
直接执行以下脚本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else