Linux shell 自动安装总结

本文主要针对web项目自动安装shell脚本中常用linux命令总结如下:

1. 将一条命令的执行结果赋值给一个变量:

#获取执行脚本的当前路径
zit_script_path=$(cd "$(dirname "$0")" && pwd)
#获取执行脚本的当前路径
zit_script_path=$(cd "$(dirname "$0")";pwd)

1.1 Linux 中常用的转义字符

  • 反斜杠(\) :  使反斜杠后面的一个变量变为单纯的字符串;
  • 单引号(''):  转义其中所有的变量为单纯的字符串;
  • 双引号(""): 保留其中的变量属性,不进行转义处理;
  • 反引号(``): 把其中的命令执行后返回结果。等价于 $();

1.2 Linux 下多个命令连续执行

  • 分隔符(;): 无论前面的命令执行成功与否,都会执行后一条命令;
  • 分隔符(&&): 只有前面的命令执行成功了,才会执行后一条命令;相当于 短路与
zit_path=`cd /usr/hello && pwd`
# hello不存在 zit_path等于空
  • 分隔符(||): 只有当前面的命令执行失败了,才会执行后面的命令;相当于 短路或

1.3 Linux中传递给脚本shell的参数表示

./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表示没有错误,其他表示有错误

1.4 Linux 的 dirname 和 basename

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

2. Linux shell 读取配置文件中的变量

2.1 source命令的巧妙用法

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。

2.2 awk命令

参考文档:linux awk命令详解

简单来说awk就是把文件逐行的读入,以 空格 为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法

awk -F'域分隔符' 'pattern + action' filenames
    -F后面跟域分割符号,默认是依空格进行分割的例如: awk -F: #依“:”进行行的域分割
    pattern: 要查找的内容,支持正则表达式,将要查找的内容用"/"进行包围;
        awk -F':' '/root/{print $6}' /etc/passwd 
        #查找到有root关键词的行,并输入第6个域的内容
    action:执行的命令

调用awk

有三种方式调用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内置变量

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
                    
                    

你可能感兴趣的:(Linux)