Shell编程——极简教程
Shell的基础在 Linux 下,我们通常会出于以下原因或优点而使用 Shell 脚本:
Shell脚本的一般格式 Shell脚本通常不是复杂的程序,并且它是按行解释的。脚本第一行通常会以类似于 #!/usr/bin/awk
#!/bin/sed
Shell命令的通配符 星号“ $ ls file*
file file1 file2 file3 file_test
注意:在通配符里,一个星号“ * ”可以代表0个或多个任意字符。 问号“ $ ls file?
file1 file2 file3
注意:一个问号“ ? ”要匹配1个任意字符。 方括号“ $ ls file[0-9]
file1 file2 file3
方括号“ $ ls file*[!0-9]
file_test
Shell命令的输入和输出 在 Shell 脚本中,可以用几种不同的方式读入数据,可以使用标准输入(缺省为键盘),或者指定一个文件作为输入。 echo string
echo 命令支持转义字符,比如:
echo -e "hellotworldn"
可以使用 read var1 var2 ... ...
通常,我们希望在读取输入的同时给出一些提示信息: read -p "Please input your name: " name
上面这句话是 Unix 的一个设计哲学,我们通常也会想到 Unix 的另一个设计哲学——一个程序只做好一件事。 命令1 | 命令2
表示把命令1的输出通过管道传递给命令2作为输入。 $ ls | wc -w
下面再来扯一下标准输入、标准输出和错误输出,每个程序开始运行时都会默认打开这三个文件,其文件描述符(fd)分别为0、1、2。
那我们怎么重新指定命令的标准输入、标准输出和错误输出呢?要实现这一点就需要使用文件重定向! 在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是 necessary。比如: Shell命令的执行顺序 在执行某个命令的时候,有时需要依赖于前一个命令是否执行成功。例如,你希望将一个目录中的文件全部拷贝到另一个目录中后,再删除源目录中的全部文件。因此,再删除之前,你希望能够确保拷贝成功,否则就可能丢失所有的文件。 cp -rf dir1/* dir2/* && rm -rf dir1/*
使用“ 命令1 && 命令2 这种命令执行方式相当地直接:&& 左边的命令(命令1)返回真(即返回0,成功被执行)后,&& 右边的命令(命令2)才能够被执行。
相应的还有“ 命令1 || 命令2
与 && 相反,|| 的作用是:如果 || 左边的命令(命令1)未执行成功,那么就执行 || 右边的命令(命令2)。
举个例子:我们希望从一个审计文件中抽取第1个和第5个域,并将其输出到一个临时文件中,如果这一操作未能成功,我们希望能够看到错误提示。 awk '{print $1 $5}' acc > a.tmp || echo "operation failed"
grep命令 grep 是 Unix/Linux 中使用最广泛的命令之一。grep(Globally search a Regular Expression and Print)是一个强大的文本搜索工具,它能使用特定模式匹配搜索文本,并默认输出匹配行。grep 支持基本正则表达式,也支持其扩展集,Unix 的 grep 家族还包括 egrep 和 fgrep。 grep [选项] 基本正则表达式 [文件]
这里基本正则表达式可为字符串。在 grep 命令中输入字符串参数时,最好将其用双引号括起来,这样做有两个好处:一是以防被误解为 shell 命令,二是可以用来查找多个单词组成的字符串。 以下是一些常用的 grep 选项:
正则表达式 随着对 Unix 和 Linux 熟悉程度的不断加深,需要经常接触到正则表达式这个领域。
上古神器:awk 与 sedawk命令有3种方法调用 awk awk [-F 分隔符] 'awk命令' <待处理文件>
注意:[-F 分隔符] 是可选的,awk 使用空格作为缺省的分隔符。 (2)将所有 awk 命令插入一个单独的文件,然后调用: awk -f '包含awk命令的文件' 待处理文件
(3)将所有 awk 命令插入一个文件,并使 awk 程序可执行,然后用 awk 命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。 awk 的模式和动作 任何 awk 语句都由模式和动作组成。在一个 awk 脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作,如果省略模式部分,动作将时刻保持执行状态。 awk 的域和记录 awk 执行时,其浏览域标记为 awk '{print $1}' file
(注意:上面示例中没有模式,只有动作,即 { } 里面的语句。) awk 的条件操作符示例
sed命令 sed 是一个非交互性文本流编辑器,它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘,文件重定向,字符串或变量,又或者是一个管道的文本。 sed [选项] 'sed命令' 输入文件
注意:在命令行使用 sed 命令时,实际命令要加单引号,sed 也允许加双引号。 (2)将 sed 命令插入脚本文件,然后调用 sed sed [选项] -f sed脚本文件 输入文件
(3)将 sed 命令插入脚本文件,并使 sed 脚本可执行 sed脚本文件 [选项] 输入文件
Shell脚本控制结构化命令使用 if-then 语句,语法如下: if [ command ]; then
other commands
fi
或者: if [ command ]; then
other commands
else
other commands
fi
注意:当 command 退出码为0时(即正常退出),执行 if 语句,否则执行 else 语句。 test condition
Bash 提供了另一种在 if-then 语句中使用 test 的方法: if [ confition ]; then
...
fi
其中的条件判断可分为3类:
(2)字符串比较
(3)文件比较
虽然 if-then 语句可以胜任条件判断/分支执行的工作,但是如果分支过多,则会导致代码臃肿。因此,可以使用 case 语句来替代,避免过长的 if-then 语句。shell 中的 case 语句类似于 C 语言的 switch 语句,一般形式如下: case varible in
pattern1 | pattern2) command1;;
pattern3) command2;;
*) command3;;
esac
Shell 同样支持循环语句,包括 for 命令和 while 命令。 for varible in list
do
commands
done
在 list 参数中,需要提供迭代中一系列要使用的值,在每个迭代中,varible 会包含列表中的当前值,一次使用一个值,以此类推。 while test command
do
other commands
done
用户输入Shell 脚本允许你在运行它的同时给它传递参数,例如: ./somescript.sh abcd 100
这两个参数,在脚本里面可以使用 #!/bin/bash
count=1
for param in $*
do
echo "$* : #$count = $param"
count=$(($count + 1))
done
我们输入 $* : #1 = a
$* : #2 = b
$* : #3 = c
脚本函数函数的定义格式如下: function_name() { commands }
需要注意的是:
虽然函数的定义中没有出现参数列表,但是在调用函数的时候,依然可以传参,像这样: function_name 12 34 这样的话,在函数定义内部,我们就可以使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |