前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell编程汇总——持续更新

Shell编程汇总——持续更新

作者头像
matt
发布2022-10-25 16:04:24
7470
发布2022-10-25 16:04:24
举报
文章被收录于专栏:CSDN迁移CSDN迁移

Shell编程汇总

一、变量说明

代码语言: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下的文本文件是以\r\n作为断行标志的,表示成十六进制就是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。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shell编程汇总
  • 一、变量说明
  • 二、变量和符号
  • 三、命令
    • 0.dos2unix
      • 1. which
        • 2. cron
          • 3. grep
            • 4. && ||
              • 5. sed
                • 6. setfacl
                • 四、信息安全
                • 〇、三方件
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档