Shell编程汇总——持续更新

2022-10-25 16:04:24 浏览数 (3)

Shell编程汇总

  • 一、变量说明
  • 二、变量和符号
  • 三、命令
    • 0.dos2unix
    • 1. which
    • 2. cron
    • 3. grep
    • 4. && ||
    • 5. sed
    • 6. setfacl
  • 四、信息安全
  • 〇、三方件

一、变量说明

代码语言:javascript复制
# Shell本身的PID(ProcessID) 
$$

# Shell最后运行的后台Process的PID 
$! 

# 最后运行的命令的结束代码(返回值),`if [ ! $? -eq 0 ]`用来判断系统退出情况
$? 

# 使用Set命令设定的Flag一览 
$- 
 
# 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$*

# 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$@ 
 
# 添加到Shell的参数个数 
$#
 
# Shell本身的文件名 
$0
 
# 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 
$1~$n

数组[@]表示所有元素。

  1. if 参数
代码语言:javascript复制
# 当file存在并且是块文件时返回真
–b 

# 当file存在并且是字符文件时返回真
-c 

# (*)当pathname存在并且是一个目录时返回真
-d 

# 当pathname指定的文件或目录存在时返回真
-e 

# (*)当file存在并且是正规文件时返回真
-f 

# 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-g 

# 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-h 

# 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-k 

# 当file存在并且是命令管道时返回为真
-p 

# 当由pathname指定的文件或目录存在并且可读时返回为真
-r 

# 当file存在文件大小大于0时返回真
-s 

# 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-u 

# 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-w 

# 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
-o 

# “string”的长度为零则为真 
[-z string] 

# “string”的长度为非零non-zero则为真
[-n string] or [string]  
  1. 比较字符参数
代码语言:javascript复制
-eq    等于

-ne    不等于

-gt     大于

-lt      小于

-le     小于等于

-ge   大于等于
 
-z      空串

=       两个字符相等

!=      两个字符不等

-n      非空串

二、变量和符号

参考 0. local 和 global (1)shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。 (2)函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。 (3)如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。

  1. () 和 `` 在 bash shell 中,()与 ``(反引号) 都是用来做命令替换用(commandsubstitution)的,但
代码语言:javascript复制
# 以下都可以得到Linux系统的版本信息
system=$(cat /etc/issue)
system=`cat /etc/issue`
  1. ${}
  • 功能一 {}用于变量替换,一般情况下,var 与 {var} 并没有啥不一样。但是用 { } 会比较精确的界定变量名称的范围。
代码语言:javascript复制
echo $AB
echo ${A}B
  • 功能二

变量设定方式

说明

${变量#关键词}

若变量内容从头开始的数据符合[关键词],则将符合的最短数据删除

${变量##关键词}

若变量内容从头开始的数据符合[关键词],则将符合的最长数据删除

${变量%关键词}

若变量内容从尾向前的数据符合[关键词],则将符合的最短数据删除

${变量%%关键词}

若变量内容从尾向前的数据符合[关键词],则将符合的最长数据删除

${变量/旧字符串/新字符串}

若变量内容符合[旧字符串]则[第一个旧字符串会被新字符串取代]

${变量//旧字符串/新字符串}

若变量内容符合[旧字符串]则[全部旧字符串会被新字符串取代]

  • 功能三 var=${str-expr},中间可添加- : = ?,详情Google。
  1. [] (()) 它们是一样的,都是进行数学运算,支持 - * / %。但是注意,bash只能做整数运算,对于浮点数适当做字符串处理的。
代码语言:javascript复制
$ a=5;b=7;c=2
$ echo $((a b*c))
19

$ echo $(((a b)/c))
6

$ echo $(((a*b)%c))
1
代码语言:javascript复制
在$(())中的变量名称,可在其前面加$符号来替换,也可以不用,如:
$(($a   $b * $c))也可以得到19的结果
此外,$(())还可作不同进位的运算,只是输出的结果均为十进制:
echo $(()16#2a)结果为42
  1. [] 为test命令的另一种形式。 但要注意: 1)必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错; 2)test命令使用标准的数学比较符号来表示字符串的比较,而改用文本符号来表示数值的比较。 3)大于符号或小于符号必须要转义,否则会被理解成重定向。
  2. (()) [[]] 分别是[]针对数学比较表达式和字符串表达式的加强版。 其中(()),不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号:

符号

描述

val

后增

val–

后减

val

先增

–val

先减

!

逻辑求反

-

位求反

**

幂运算

<<

左位移

>>

右位移

&

位布尔和

|

位布尔或

在[[]]中增加了另一个特性:模式匹配。

三、命令

0.dos2unix

dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。也可以vi后使用:set ff=unix。 DOS下的文本文件是以rn作为断行标志的,表示成十六进制就是0D 0A。而Unix下的文本文件是以n作为断行标志的,表示成十六进制就是0A。

1. which

which指令会在环境变量$PATH设置的目录里查找符合条件的文件。

代码语言:javascript复制
which bash    # 输出:/bin/bash

# 可以用这种方法来避免crontab命令not found的错误
CRON_PATH=$(which crontab > cron_path & cat cron_path)
if [[ "${CRON_PATH}X" == "X" ]]; then
	# TODO...
else
	# TODO...
fi

2. cron

代码语言:javascript复制
cron
echo "0 */4 * * * su - mateinfo -c 'sh /opt/mateinfo/flink/bin/savepoint.sh backup' > /dev/null 2>&1" > cron_temp
crontab cron_temp
rm -f cron_temp

# 不希望收到系统消息,在命令最后加上该命令
> /dev/null 2>&1 

3. grep

代码语言:javascript复制
# 只显示目录包含conf的列
ls | grep -wq "conf"

4. && ||

&&只有在左边的命令返回真时才会执行右边,||只有在左边的命令返回假才会执行后边。

代码语言:javascript复制
# 表示当数组中包含1时赋值YES,否则赋值NO
EXIST=$(echo ${ARRAY[@]} | grep -wq "1" && echo "YES" || echo "NO")

5. sed

代码语言:javascript复制
# 从$3的配置文件中读取$1的值,若无则使用默认值$2
readFromConfig() {
    local key=$1
    local defaultValue=$2
    local configFile=$3

    local value=$(sed -n "s/^[ ]*${key}[ ]*: ([^#]*).*$/1/p" "${configFile}" | sed "s/^ *//;s/ *$//" | tail -n 1)
    [ -z "$value" ] && echo "$defaultValue" || echo "$value"
}

6. setfacl

在命令行设置ACL(访问控制列表)

代码语言:javascript复制
# 删除所有扩展的acl规则,基本的会被保留
-b, --remove-all

# 设定默认的acl规则
-d, --default

# 从文件恢复备份的acl规则
--restore=file

# 递归的对所有文件及目录进行操作
-R, --recursive

# 表示命令行参数结束,其后的所有参数都将被认为是文件名
--

-m-x后面跟acl规则,多条规则以,隔开,-M-X从文件或标准输入读取acl规则。 --set--set-file用来设置文件或目录的acl规则,先前设定的脚背覆盖。 -m (--modify)-M (--modify-file)修改文件或目录的acl规则。 -x (--remove) -X (--remove-file)删除acl规则。

代码语言:javascript复制
# 给mateinfo用户在/opt/backupagent目录下增加读写权限
sudo setfacl -R -d -m user:mateinfo:rw /opt/backupagent

四、信息安全

  1. 权限安全

文件类型

设置值

用户主目录

750(rwxr-x—)

程序文件(含脚本文件、库文件等)

550(r-xr-x—)

程序文件目录

550(r-xr-x—)

配置文件

640(rw-r-----)

配置文件目录

750(rwxr-x—)

日志文件(记录完毕或已经归档)

440(r–r-----)

日志文件(正在记录)

640(rw-r-----)

日志文件目录

750(rwxr-x—)

Debug文件

640(rw-r-----)

Debug文件目录

750(rwxr-x—)

临时文件目录

750(rwxr-x—)

维护升级文件目录

770(rwxrwx—)

业务数据文件

640(rw-r-----)

业务数据文件目录

750(rwxr-x—)

密钥组件、私钥、证书、密文文件目录

700(rwx------)

密钥组件、私钥、证书、加密密文

600(rw-------)

加解密接口、加解密脚本

500(r-x------)

〇、三方件

1.Tomcat Tomcat的核心分为3个部分: (1)Web容器,处理静态页面; (2)Catalina,一个servlet容器; (3)还有就是JSP容器,它就是把jsp页面翻译成一般的servlet。

1 人点赞