编写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的值等于 1的值等于n+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