关于2>&1
注意:shell脚本是以 " .sh " 位后缀的文本文件,它可以被赋予可执行的权限,不要把某些的Linux的命令符号与shell脚本的命令符号搞混!(这个还是很少的,大部分应该都差不多)
Linux 和 shell脚本命令
Linux命令大全
shell脚本命令:
echo 相当于 print echo string --> string
echo it is echo "it is" echo " \"it is \" "
结果:
it is
it is
“it is”
-d filepath :如果 filepath目录存在,则为真
各种 " -x filename " 代表的含义
mkdir - p file_path : -p 表示递归,创建目录
eg : mkdir -p /tmp/dir/sss
ps -ef :用于查看全格式的全部进程
grep 命令用于查找文件里符合条件的字符串 grep -?命令大全
命令 | 描述 |
---|---|
grep -v 或 --invert-match | 显示不包含匹配文本的所有行 |
grep -i 或 --ignore-case | 忽略字符大小写的差别 |
-z :判断当前字符串长度是否为零
$? 简单介绍
命令 | 描述 |
---|---|
$# | 添加到shell的参数个数 |
$0 | shell本身的文件名 |
$1~$n | 添加到Shell的各参数值。$1是第1参数、$2是第2参数… |
shell中一些特殊符号的介绍 注意:不要与Linux命令行的符号搞混了
符号 | shell下的运算符描述 | Linux 命令行 描述 |
---|---|---|
x++ | 后增 | |
x– | 后减 | |
! | 逻辑求反 | |
~ | 位求反 | |
** | 幂运算 | 幂运算 |
<< | 左位移 | |
>> | 右位移 | >>文件追加;>文件覆盖 |
& | 位布尔和 | 放在启动参数后面表示设置此进程为后台进程 |
| | 位布尔或 | 管道符号;C1|C2 将c1的输出作为c2的输入 |
&& | 逻辑和 | 逻辑和 |
|| | 逻辑或 | 逻辑或 |
tips:当是两个运算符(&&,||)时,当第一个条件成立(||)或违反(&&),就不再继续判断之后的条件,所以效率高一点;当是一个运算符(&,|)时,无论第一个条件是否成立(|)或违法(&),都会继续执行剩下的判断语句,所以效率低一点。
eval [参数]
案例分析:双引号里面的参数可以不断解析;单引号不可以;
案例1:
# myfile.txt 存放的数据为:nice b="cat" c="$b /opt" a="$c/myfile.txt" # result: $a # nice "$a" # 出错! echo '$a;$a;$a' # 单引号 不解析 \$a;\$a;$a eval '$a;$a;$a' # eval 只要是参数就解析 nice nice nice echo "$a;$a;$a" # 双引号,解析 然后echo cat /opt/myfile.txt;cat /opt/myfile.txt;cat /opt/myfile.txt
案例2:
#!/bin/bash b='cat' c="$b /opt" a='$c /myfile.txt' echo $a eval echo $a
解释:
echo $a --> $a
eval echo $a
结果如下:
nice to meet you
if 语句
if [......] then ... else ... fi
case 语句:
case $变量名 in 模式1) command1 command2 command3 ;; 模式2) command1 command2 command3 ;; *) command1 command2 command3 ;; esac
#!/bin/bash HIVE_LOG_DIR=$HIVE_HOME/logs if [ ! -d $HIVE_LOG_DIR ] then mkdir -p $HIVE_LOG_DIR fi#检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口 function check_process() { pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}') ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut - d '/' -f 1) echo $pid [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1 } function hive_start() { metapid=$(check_process HiveMetastore 9083) cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &" [ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动" server2pid=$(check_process HiveServer2 10000) cmd="nohup hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &" [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动" } function hive_stop() { metapid=$(check_process HiveMetastore 9083) [ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动" server2pid=$(check_process HiveServer2 10000) [ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动" } case $1 in "start") hive_start ;; "stop") hive_stop ;; "restart") hive_stop sleep 2 hive_start ;; "status") check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行 正常" || echo "Metastore 服务运行异常" check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运 行正常" || echo "HiveServer2 服务运行异常" ;; *) echo Invalid Args! echo 'Usage: '$(basename $0)' start|stop|restart|status' ;; esac
案例相关用法借鉴:
A && B || C
说明:替换 if 语句;效率高点
A == True 执行 B 不执行 C
B == False 执行 C 不执行 B