本文主要针对web项目自动安装shell脚本中常用linux命令总结如下:
#获取执行脚本的当前路径
zit_script_path=$(cd "$(dirname "$0")" && pwd)
#获取执行脚本的当前路径
zit_script_path=$(cd "$(dirname "$0")";pwd)
zit_path=`cd /usr/hello && pwd`
# hello不存在 zit_path等于空
./start.sh a b c
$# 是传给脚本的参数个数 : 3
$0 是脚本本身的名字 : start.sh
$1 是传递给该shell脚本的第一个参数 : a
$2 是传递给该shell脚本的第二个参数 : b
$@ 是传给脚本的所有参数的列表 : a b c
for key in "$@" # for key in $@ do echo $key done 有无双引号输出结果相同: a b c$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 :
for key2 in $* do echo $key2 done 输出结果: a b c for key2 in "$*" do echo $key2 done 带引号的输出结果: a b c$$ 是脚本运行的当前进程ID号 : 3324 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
dirname -[选项] 名称
输出名称中的目录部分,如果名称仅仅只是一个文件名,则输出".",表示当前目录
dirname /usr/install # install 为一个目录(文件夹)
输出:/usr
dirname /usr/install/install.sh
输出:/usr/install
dirname install.sh
输出. #.表示当前目录 无论上面的文件是否存在或者是否在当前目录
basename -[选项] 名称
-a : 移除多个名称的目录
-s : 移除相应的后缀名称
表示移除名称的目录,仅保留文件名
basename -a dir1/str dir2/str
输出: dir1
dir2
basename -a dir1/str dir2/str
输出: dir1
basename -s .jpg dir1/str.jpg
输出: str
basename --suffix=.jpg dir1/str.jpg
输出: str
source filename 或者 . filename: 通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
例如,当我们修改了/etc/profile文件,并想让它立刻生效,而不用重新登录,就可以使用source命令,
source /etc/profile
source filename 只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。因为不会建立新的子shell,变量的值都可以直接取到.
配置文件 db.ini:
db_username=root
db_port=3306
db_password=xxx
readConf.sh:
#!/bin/bash
source ./db.ini
# 会依次读取db.ini文件中的语句在当前shell中执行,而db_username=root刚好是linux中定义变量的方式,所有db_username这个变量
#会在当前的shell中生效,因此我们可以在这个shell文件中直接使用这个变量
dbUsername=${db_username}
dbPort=${db_port}
dbPassword=${db_password}
echo $dbUsername
sh filepath或者./filepath: 会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell,除非使用export。
参考文档:linux awk命令详解
简单来说awk就是把文件逐行的读入,以 空格 为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk -F'域分隔符' 'pattern + action' filenames -F后面跟域分割符号,默认是依空格进行分割的例如: awk -F: #依“:”进行行的域分割 pattern: 要查找的内容,支持正则表达式,将要查找的内容用"/"进行包围; awk -F':' '/root/{print $6}' /etc/passwd #查找到有root关键词的行,并输入第6个域的内容 action:执行的命令
有三种方式调用awk
1.命令行方式 awk [-F field-separator] '/pattern/{commands}' input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。 2.shell脚本方式 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。 相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk 3.将所有的awk命令插入一个单独文件,然后调用: awk -f awk-script-file input-file(s) 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
2.3 sed命令
sed 把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。
参考文档:
命令格式
sed [options] 'command' file(s) sed [options] -f scriptfile file(s)
-e