编写shell脚本的常用知识点

编写shell脚本的常用知识点

对字符串的处理

将字符串分割成数组

path="/back/task/subtask/partition/db/table"
OLD_IFS="\$IFS"
IFS="/" 
data=(\$path) 
IFS="\$OLD_IFS"
for i in \${!data[@]};do
echo "\$i=>\${data[i]}" 
done        
echo "num:\${#data[@]}"

去掉字符串的某个字符

DATE="2020-03-21"
DATE=\$(echo "\$PARTITIONID" | sed 's/-//g')

再输出DATE就是:20200321

判断字符串的最后一个字符

这里判断是不是以"/"结尾

if [ "${var: -1}" == "/" ];then
fi

删除字符串的最后一个字符

var=${var%?}

判断字符串是否包含另一字符串

这里为如果不包含
if [[ $restoredInfo != *"$str"* ]]

字符串判空

if [[ “x$errorLog” != “x” ]]

字符串替换

array=(${DISKPATH//,/ })(把","替换成了空格,正好转换成一个数组)

捕获异常并将异常传入变量

errorLog=$(echo -n $detachSQL|eval $CK_BIN | grep -i exception)

判断本地目录是否为空

[ "` ls -A ${Path}/data`" == "" ]

引用其他shell脚本的方法和全局变量

source task.sh
这个语句是引用同路径下的task.sh,如果要用绝对路径,在前面加上路径即可

&&和||的简单用法

命令1 && 命令2 || 命令3 :意思就是命令1返回为真,执行命令2;命令2返回为假,执行命令3

如:判断某目录是否存在,存在输出exist,不存在就创建(替代了if/else)
[ -d /data/DB/TABLE ] && echo “exist” || mkdir -p /data/DB/TABLE

远程服务器并执行命令

 #远程host,并删除某文件
 ssh -p$port root@$host "source /etc/profile; rm /path/a.txt"

| 的用法

command 1 | command 2
他的功能是把第一个命令command 1执行的结果作为command2的输入传给command 2
如:
errorLog=$(echo -n $detachSQL|eval $CK_BIN | grep -i exception)

awk的用法

# 以"#"为分隔符,$0表示所有 $1表示第一个 $NF表示最后一个 $(NF-1)表示倒数第二个
eval $(echo $var | awk -F "#" '{ printf("Id=%s;Path=%s;emptyDetach=%s",$1,$2,$3)}')

eval的用法

语法:eval cmdLine
eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。

如:

# 会把拆分后的结果的第一个,第二个,第三个分别赋值给Id,Path,emptyDetach
eval $(echo $var | awk -F "#" '{ printf("Id=%s;Path=%s;emptyDetach=%s",$1,$2,$3)}')

$?的用法

$?表示"最后一次执行命令"的退出状态.0为成功,非0为失败

 if [ $? -ne 0 ]; then
    restoredInfo="$restoredInfo,$ckHost:$ckPort#$partitionId#$ckDiskPath"
    errorCode=1
    break
 fi

exit 1

代表非正常运行导致退出程序
其实目的就是: 程序退出后, 用户可以 echo $? 来查看是 0 还是 1, 从而达到检测程序是正常结束退出还是产生错误而退出的目的.

while [ -n "$1" ]
do
    case "$1" in
		  -c|--command) COMMAND=$2; shift 2;;
		  -d|--db) DB=$2 ; shift 2;;
    	  --) break ;;
    	  *) echo "param not exist" ; exit 1 ;;
    esac
done

shift 2

shift n表示把第n+1个参数移到第1个参数, 即命令结束后 1 的 值 等 于 1的值等于 1n+1的值, 而命令执行前的前面n个参数不能被再次引用, 后面KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲-n+1到#的参数被unset, 参数的个数减少为$#-n个.

while [ -n "$1" ]
do
    case "$1" in
		  -c|--command) COMMAND=$2; shift 2;;
		  -d|--db) DB=$2 ; shift 2;;
    	  --) break ;;
    	  *) echo "param not exist" ; exit 1 ;;
    esac
done

遇到的错误及解决

/bin/bash^M: 坏的解释器: 没有那个文件或目录
解决:sed -i ‘s/\r$//’ test.sh

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值