转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8176137.html
一:脚本文件的创建、格式、运行
1:创建shell脚本
首先,要创建一个文件
touch 文件名
然后,编辑该文件,将命令输入其中。
脚本文件第一行,需要指明使用的shell种类:
#! shell的路径
比如:
#!/bin/bash
脚本的注释符号是井号 #。
#注释
一般脚本格式为:
#!/bin/bash
#脚本注释:介绍脚本的用途
命令行、代码
2:改变文件权限
默认创建的文件没有执行权限,需要收到赋予。
chmod u+x 文件名
3:执行文件
对于经常执行的文件,需要将shell脚本所处目录添加到PATH环境变量去,这样,每次只需输入脚本名即可运行。
对于一次性使用的,则通过路径来启动:
./脚本名 :运行当前目录下的脚本文件
/.../.../脚本名 :通过绝对路径运行某个脚本文件
二:基本操作
1:打印输出
echo 内容 例如: echo "字符串" echo $变量名 将命令行结果输出到字符串后面: echo -n "字符串: " command
2:使用环境变量
可以通过 set 命令查看系统中的环境变量。
在脚本中,可以通过 $环境变量名 来引用。
3:使用用户变量
shell编程的变量不需要声明后使用,直接赋值就是声明。
引用变量可以 $变量名 或者 ${变量名} 来引用。
var=value :赋值的同时即声明 $var ${var} :引用变量
var2 = $var1 :变量之间的赋值:后者必须用 $ ,否则相当于字符串赋值给var2
4:提取命令输出
将命令的输出赋值给变量,有两种方法:
反引号法:
var=`command` :用反引号括住命令,那么命令的执行就自动提取给变量
美元括号法:
var=$(command) :用括号将命令括住,命令的运行结果被提取赋值给变量
5:重定向输入输出
输出重定向:
command > 文件:将输出写入文件(覆盖)
command >> 文件 :将输出追加到文件
输入重定向:
command < 文件
6:管道
将一个命令的输出作为另一个命令的输入。
command1 | command2
[一般,最常用的场景是:将命令行产生的大量输出,通过管道传送给more显示]
7:进行数学运算
法一(不推荐):expr
expr 运算表达式
法二:方括号法
$[运算表达式]
注意:bash中是数学运算针对整数,如果涉及浮点数,一般需要借助外在程序。
8:退出脚本
exit [退出码]
查看退出码:
$? :保存了最近一个脚本的退出码
三:结构化命令——基本语句
1:条件语句
if [condition] then commands
elif [condition]
then
commands
else
commands fi 或者 if [condition]; then commands fi
判断条件主要包括:非空判断、数值比较、字符串比较、文件比较等。
非空判断:
if [$变量] :变量是否为空
数值比较:(注意:如果用符号来比较,需要转义!)
-eq (equal) 等于,如:if [ "$a" -eq "$b" ] -ne (not equal) 不等于,如:if [ "$a" -ne "$b" ] -gt (greater than) 大于,如:if [ "$a" -gt "$b" ] -ge (greater equal) 大于等于,如:if [ "$a" -ge "$b" ] -lt (less than) 小于,如:if [ "$a" -lt "$b" ] -le (less equal) 小于等于,如:if [ "$a" -le "$b" ] < 小于(需要双括号),如:(("$a" < "$b")) <= 小于等于(需要双括号),如:(("$a" <= "$b")) > 大于(需要双括号),如:(("$a" > "$b")) >= 大于等于(需要双括号),如:(("$a" >= "$b"))
字符串比较:(注意:如果用符号来比较,需要转义!)
= 等于,如:if [ "$a" = "$b" ] == 等于,如:if [ "$a" == "$b" ], 与=等价 注意:==的功能在[[]]和[]中的行为是不同的,如下: 1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true 2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true 3 4 [ $a == z* ] # File globbing 和word splitting将会发生 5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true != 不等于,如:if [ "$a" != "$b" ], 这个操作符将在[[]]结构中使用模式匹配. < 小于,在ASCII字母顺序下.如: if [[ "$a" < "$b" ]] if [ "$a" < "$b" ] 在[]结构中"<"需要被转义. > 大于,在ASCII字母顺序下.如: if [[ "$a" > "$b" ]] if [ "$a" > "$b" ] 在[]结构中">"需要被转义. -z 字符串为"null".就是长度为0. -n 字符串不为"null"
文件比较:
-d file:检查file是否一个目录 -e file:检查file是否存在 -f file:检查file是否是一个文件 -r file:检查file是否存在且可读 -s file:检查file是否非空 -w file:检查file是否可写 -x file:检查file是否可执行 -O file:检查file是否属于当前用户 -G file:检查file存在的默认组是否与当前用户相同 file1 -nt file2:file1是否比file2新 file1 -ot file2:file1是否比file2旧
条件复合:
与: [ condition ] && [ condition ]
或: [ condition ] || [ condition ]
高级特性
双括号:在双括号内进行更复杂的数学运算
if ((高级运算)) 高级运算主要有: ++ -- ! ~ ** >> << & | && ||
双方括号:进行高级字符串比较运算
if [[高级字符串运算]] 高级字符串运算主要是指:模式匹配 例如: if [[$var == r*]]
case语句:
case $变量 in pattern1) commands;; #注意,两个分号! pattern2 | pattern3) commands;; *) #其他情况 commands;;
2:循环语句
for-in语句:
for var in list do commands done
列表中的符号、空格怎么处理:转义 或者 用双引号将符号与单词合并
list:可以是变量($变量)、可以是命令的输出( $(command) )、可以是某目录下的通配符( for file in /../../*)
for循环语句:
for ((i = 起始值;i < 临界值; i++)) do command done
while语句:
while [ condition ] do command done
until语句:
until [ condition ] do command done
跳出循环:
break:跳出当前循环
break n:跳出第n层循环,当前循环为1,往外数递增。
continue:终止当前次循环,开启下一次循环
重定向循环的输出:
各种循环语句
......
......
done > 输出文件