1、shell的语法
-
shell 中的变量
创建变量
variable=value
访问变量
$variable、"hello"$variable"、"$variable"、'$variable'
默认符号以空白符分隔,单引号中的’$‘符号不会展开变量,双引号中的’$'符号会对后续符号进行展开
-
shell中的环境变量
环境变量 说明 $HOME 当前用户的加目录 $PATH 以冒号分隔的用来搜索命令的目录列表 $IFS 输入分隔符,它们通常是空格、制表符和换行符 $0 shell脚本的名字 $# shell脚本的参数个数 $$ shell脚本的进程号 $1,$2,… 脚本程序的参数 $* 所有参数,参数之间以$IFS的第一个字符分隔开 $@ 所有参数,参数默认以空格分隔开 -
shell中的控制流
- test 或 [ 判断语句
- if…then…elif…fi判断语句
- for语句
- while语句
- case语句
- break命令
- continue命令
-
shell中的与或非
- &&
- ||
- !
-
shell中命令的执行
-
$(command)
-
`command`
-
算术扩展
x=2 y=$(($x+1))
两对圆括号用户算术替换
-
参数扩展
for i in 1 2 do process $(i)_tmp done //1_tmp 2_tmp
展 说明 param:-default} 如果param为空,就把它设置为default值 aram} 给出param的长度 ram%word} 从param的尾部开始删除与word匹配的最小部分,然后返回剩余部分 ram%%word} 从param的尾部开始删除与word的最长部分,然后返回剩余部分 ram#word} 从param的头部开始删除与word匹配的最小部分,然后返回剩余部分} ram##word} 从param的头部开始删除与word匹配的最长部分,然后返回剩余部分
-
-
shell中的函数
- function定义函数
- return 返回值
2、shell中的可执行程序
- echo
- read
- .命令
通常,当一个脚本执行一条外部命令时,它会创建一个新的环境,在命令执行完后,留下退出码返回给父shell - exec命令
exec的典型用法,exec wall "hell world"
ecec第二种用法是修改但钱文件的描述符exec 3< file
,这使得文件描述符3被打开便从文件file中读取数据 - exit
- export
export命令将作为它参数的变量导出到子shell中,并使之在子shell中有效 - return
- set
set建立变量,影响$1、$2等变量 - shift
shift n 把所有参数左移指定n的次数 - find
- grep
- eval
foo=10 x=foo y='$'$x echo $y >> $foo ------------------------ foo=10 x=foo y='$'$x eval $y >> 10
3、here文档
在shell脚本程序中向一条命令传递输入的一种特殊方法是使用here文档,它允许一条命令在获得输入数据时就好像在读取一个文件或键盘一样,而实际是从脚本程序中得到输入数据。
4、sed和awk命令
sed命令
sed是一个很好的文件处理工具,主要是以行为单位进行处理,可以将数据进行替换、删除、新增、选取等特定工作。
sed [-nefri] 'command' 输入文本
/*
* -n:使用silent模式,在一般sed的用法中,一般输出都会列出到STDIN,加上此参数后,则只有经过**sed处理的那一行**才会被列出来。
* -i:直接修改输入文本内容,而不是在屏幕输出
* /
/*
* a:追加,a得后面可以接字符串,而这些字符串出现在新一行(支持转义)
* c:取代,c的后面接字符串,这些字符串取代n1,n2之间的行
* d:删除,后面不接任何字符串
* i:插入,同a
* p:打印,
* s:取代,参考vim
- sed中的模式查询
//输出test.txt文件中包含关键字$的所在行
sed -n '/\$/p' test.txt
//替换匹配行中的某个字符串
sed -n '/pattern/s/replacesrc/replacedst/g' test.txt
awk命令
awk是一个解释器,用法为awk pattern {action} input
,它将文本的每一行作为输入来处理。
- pattern的形式
BEGIN
END
expression
expression, expression
- awk中的环境变量
变量名 | 说明 |
---|---|
ARGC | number of command line arguments |
ARGV | array of command line arguments |
FILENAME | name of the current input file |
NF | number of fields in the current record |
NR | current record number in the total input stream |
FNR | current record number in FILENAME |
RS | input record separator, initially = “\n” |
FS | split records into fileds as a regular expression |
- 用例
//读入有'\n'换行符分割的一条记录,将records按指定域分割符划分,$0表示所有域,$1表示第一个域,$n表示第n个域。
last -n 5 | awk '{print $1}'
cat /etc/passwd | awk -F ':' '{print $1}'
cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'
//先执行BEGIN(仅执行一个{}),然后读入文件,接着输出BEGIN后面的花括号,最后执行END后面的语句
cat /etc/passwd | awk -F':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
//awk的模式匹配
awk -F: '/root/{print $7}' /etc/passwd