Shell编程汇总
- 一、变量说明
- 二、变量和符号
- 三、命令
- 0.dos2unix
- 1. which
- 2. cron
- 3. grep
- 4. && ||
- 5. sed
- 6. setfacl
- 四、信息安全
- 〇、三方件
一、变量说明
# 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
数组[@]表示所有元素。
- if 参数
# 当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]
- 比较字符参数
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
二、变量和符号
参考 0. local 和 global (1)shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。 (2)函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。 (3)如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。
- () 和 `` 在 bash shell 中,()与 ``(反引号) 都是用来做命令替换用(commandsubstitution)的,但
# 以下都可以得到Linux系统的版本信息
system=$(cat /etc/issue)
system=`cat /etc/issue`
${}
- 功能一 {}用于变量替换,一般情况下,var 与 {var} 并没有啥不一样。但是用 { } 会比较精确的界定变量名称的范围。
echo $AB
echo ${A}B
- 功能二
变量设定方式 | 说明 |
---|---|
${变量#关键词} | 若变量内容从头开始的数据符合[关键词],则将符合的最短数据删除 |
${变量##关键词} | 若变量内容从头开始的数据符合[关键词],则将符合的最长数据删除 |
${变量%关键词} | 若变量内容从尾向前的数据符合[关键词],则将符合的最短数据删除 |
${变量%%关键词} | 若变量内容从尾向前的数据符合[关键词],则将符合的最长数据删除 |
${变量/旧字符串/新字符串} | 若变量内容符合[旧字符串]则[第一个旧字符串会被新字符串取代] |
${变量//旧字符串/新字符串} | 若变量内容符合[旧字符串]则[全部旧字符串会被新字符串取代] |
- 功能三
var=${str-expr},中间可添加
- : = ?
,详情Google。
- [] (()) 它们是一样的,都是进行数学运算,支持 - * / %。但是注意,bash只能做整数运算,对于浮点数适当做字符串处理的。
$ 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
- [] 为test命令的另一种形式。 但要注意: 1)必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错; 2)test命令使用标准的数学比较符号来表示字符串的比较,而改用文本符号来表示数值的比较。 3)大于符号或小于符号必须要转义,否则会被理解成重定向。
- (()) [[]] 分别是[]针对数学比较表达式和字符串表达式的加强版。 其中(()),不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号:
符号 | 描述 |
---|---|
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规则。
# 给mateinfo用户在/opt/backupagent目录下增加读写权限
sudo setfacl -R -d -m user:mateinfo:rw /opt/backupagent
四、信息安全
- 权限安全
文件类型 | 设置值 |
---|---|
用户主目录 | 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。