This commit is contained in:
2021-11-14 15:50:55 +08:00
parent f810ebf1d9
commit 915c231124
27 changed files with 1862 additions and 1890 deletions

View File

@@ -17,126 +17,126 @@ categories: ["shell"]
- $1...$n #shell 位置参数
# BASH 字符串处理
```bash
#字符串 str 长度
${#str}
expr length "$str"
#子串 substr 出现位置,找不到返回 0
expr index "$str" "$substr"
#子串 substr 开头匹配,找不到返回 0
expr match "$str" "$substr"
#字符串 str 抽取左起位置 pos 后 长度 len 的子串
${str:$pos}
${str:$pos:$len}
expr substr "$str" $pos $len
#字符串 str 抽取右起位置 pos 前的子串
${str: -pos}
${str:(pos)}
#正则 pat 抽取字符串 str 开头子串
expr match "$str" "\($pat\)"
expr "$str" : "\($pat\)"
#正则 pat 抽取字符串 str 结尾子串
expr match "$str" ".*\($pat\)"
expr "$str" : ".*\($pat\)"
#删除字符串 str 开头的最短子串 sub
${str#$sub}
#删除字符串 str 开头的最长子串 sub
${str##$sub}
#删除字符串 str 结尾的最短子串 sub
${str%$sub}
#删除字符串 str 结尾的最长子串 sub
${str%%$sub}
#替换字符串 str 第一个子串 sub 为字符串 rep
${str/"$sub"/"$rep"}
#替换字符串 str 所有子串 sub 为字符串 rep
${str//"$sub"/"$rep"}
#替换字符串 str 开头的子串 sub 为字符串 rep
${str/#"$sub"/"$rep"}
#替换字符串 str 结尾的子串 sub 为字符串 rep
${str/%"$sub"/"$rep"}
#var为空或没有设置代入word否则代入var值
${var:-word}
#如果var已经被设置且不为空则代入它的值否则代入word并且在后面var始终为word的值。位置参量不能用这种方式赋值。
${variable:=word}
#如果变量var已被设置且值为非空代入word值否则什么也不代入
${variable:+word}
#如果变量var已被设置值且为非空就代入它的值否则输出word并从shell中退出如果有省略了word,就会显示信息parameter null or not set.
${var:?word}
```
```bash
# 字符串 str 长度
${#str}
expr length "$str"
# 子串 substr 出现位置,找不到返回 0
expr index "$str" "$substr"
# 子串 substr 开头匹配,找不到返回 0
expr match "$str" "$substr"
# 字符串 str 抽取左起位置 pos 后 长度 len 的子串
${str:$pos}
${str:$pos:$len}
expr substr "$str" $pos $len
# 字符串 str 抽取右起位置 pos 前的子串
${str: -pos}
${str:(pos)}
# 正则 pat 抽取字符串 str 开头子串
expr match "$str" "\($pat\)"
expr "$str" : "\($pat\)"
# 正则 pat 抽取字符串 str 结尾子串
expr match "$str" ".*\($pat\)"
expr "$str" : ".*\($pat\)"
# 删除字符串 str 开头的最短子串 sub
${str#$sub}
# 删除字符串 str 开头的最长子串 sub
${str##$sub}
# 删除字符串 str 结尾的最短子串 sub
${str%$sub}
# 删除字符串 str 结尾的最长子串 sub
${str%%$sub}
# 替换字符串 str 第一个子串 sub 为字符串 rep
${str/"$sub"/"$rep"}
# 替换字符串 str 所有子串 sub 为字符串 rep
${str//"$sub"/"$rep"}
# 替换字符串 str 开头的子串 sub 为字符串 rep
${str/#"$sub"/"$rep"}
# 替换字符串 str 结尾的子串 sub 为字符串 rep
${str/%"$sub"/"$rep"}
# var为空或没有设置代入word否则代入var值
${var:-word}
# 如果var已经被设置且不为空则代入它的值否则代入word并且在后面var始终为word的值。位置参量不能用这种方式赋值。
${variable:=word}
# 如果变量var已被设置且值为非空代入word值否则什么也不代入
${variable:+word}
# 如果变量var已被设置值且为非空就代入它的值否则输出word并从shell中退出如果有省略了word,就会显示信息parameter null or not set.
${var:?word}
```
# BASH 数组
```bash
#定义数组,有三种方式
declare -a array
array=()
array[0]='value0'
#打印数组第一个元素
echo ${array[0]}
#打印数组所有元素,有两种方式
echo ${array[@]}
echo ${array[*]}
#打印数组所有索引,有两种方式
echo ${!array[@]}
echo ${!array[*]}
#打印数组的元素个数,有两种方式
echo ${#array[@]}
echo ${#array[*]}
#移除数组中索引为2的元素
unset array[2]
#添加id为3的元素
array[3]=""
```
```bash
# 定义数组,有三种方式
declare -a array
array=()
array[0]='value0'
# 打印数组第一个元素
echo ${array[0]}
# 打印数组所有元素,有两种方式
echo ${array[@]}
echo ${array[*]}
# 打印数组所有索引,有两种方式
echo ${!array[@]}
echo ${!array[*]}
# 打印数组的元素个数,有两种方式
echo ${#array[@]}
echo ${#array[*]}
# 移除数组中索引为2的元素
unset array[2]
# 添加id为3的元素
array[3]=""
```
# BASH 字典
```bash
#定义字典
declare -A dict
#新增或修改键 k1 的值
dict['k1']='v1'
#打印对应键的值
echo $['k1']
#打印字典所有元素,有两种方式
echo ${dict[@]}
echo ${dict[*]}
#打印字典所有键,有两种方式
echo ${!dict[@]}
echo ${!dict[*]}
#打印字典的元素个数,有两种方式
echo ${#dict[@]}
echo ${#dict[*]}
#移除键 k1
unset dict['k1']
```
```bash
# 定义字典
declare -A dict
# 新增或修改键 k1 的值
dict['k1']='v1'
# 打印对应键的值
echo $['k1']
# 打印字典所有元素,有两种方式
echo ${dict[@]}
echo ${dict[*]}
# 打印字典所有键,有两种方式
echo ${!dict[@]}
echo ${!dict[*]}
# 打印字典的元素个数,有两种方式
echo ${#dict[@]}
echo ${#dict[*]}
# 移除键 k1
unset dict['k1']
```
# 终端环境变量 PS1 参数
- \d 日期格式为weekday month date例如"Mon Aug 1"
@@ -187,24 +187,24 @@ unset dict['k1']
- 去掉头部 AA 和尾部 ZZ
# expect 自动输入密码
```bash
expect<<END
spawn ssh $DEST_HOST "REMOTE_COMMAND"
expect {
"*yes/no*" { send "yes\r"; exp_continue }
"*assword*" { send "password\r" }
}
expect eof
END
```
```bash
expect<<END
spawn ssh $DEST_HOST "REMOTE_COMMAND"
expect {
"*yes/no*" { send "yes\r"; exp_continue }
"*assword*" { send "password\r" }
}
expect eof
END
```
# 普通用户(username)免密 sudo
```bash
echo "username ALL = (root) NOPASSWD:ALL" >> /etc/sudoers
echo "cephdeploy ALL = (root) NOPASSWD:ALL" > /etc/sudoers.d/username
chmod 0400 /etc/sudoers.d/username
```
```bash
echo "username ALL = (root) NOPASSWD:ALL" >> /etc/sudoers
#
echo "cephdeploy ALL = (root) NOPASSWD:ALL" > /etc/sudoers.d/username
chmod 0400 /etc/sudoers.d/username
```
# 用户登陆操作记录
- 创建日志共存目录
@@ -212,13 +212,14 @@ chmod 0400 /etc/sudoers.d/username
mkdir /var/log/user_history -p
chmod 0777 /var/log/user_history -R
```
- 配置 history 历史文件 /etc/profile.d/history.sh
```bash
#!/bin/bash
#
export HISTSIZE=10000
export HISTTIMEFORMAT="[%F %T] "
#
LOG_DIR=/var/log/user_history
mkdir -p $LOG_DIR/$USER
if [ 0 -eq $? ]; then