目录
1. ps
ps是一款显示系统进程状态的工具,类似于top,只不过top是实时的,而ps是静态的,也就是抓取系统进程的一个快照。
1.1 命令格式
ps -p [pid] -o [cloumn]
选项:
选项 | 描述 |
---|---|
-p | 指定进程PID |
-o | 指定显示列 |
1.2 查看进程CMD
[root@master-zeus ~]#ps -p $$ -o comm=
java
注意:$$
表示当前进程PID,comm=
表示获取进程启动命令
2. 变量
2.1 数组
Bash Shell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。
2.1.1 语法
Shell数组用括号来表示,元素用"空格
"符号分割开。
array_name=(value1 value2 ... valuen)
2.1.2 获取元素
索引读取元素
${array_name[index]}
读取所有元素
${array_name[@]} 或 $array_name[@]
备注:下标为*
或@
得到整个数组内容
2.1.3 数组长度
${#a[@]}
备注:下标为*
或@
得到整个数组内容
2.1.4 删除
unset 数组[下标]
注意:不带下标,清除整个数组数据
2.1.5 分片
返回切片字符串
${数组名[@或*]:起始位置:长度}
返回切片数组
(${数组名[@或*]:起始位置:长度})
对原数组进行切片,返回是字符串,中间用“空格”分开。如果加上"()"
,将得到切片数组
2.1.6 替换
${数组名[@或*]/查找字符/替换字符}
注意:该操作不会改变原先数组内容,如果需要修改,需要重新定义数据。
2.2 特殊变量
变量 | 描述 |
---|---|
$0 | 当前脚本文件名 |
$n | 传递给脚本或函数的参数。n 为数字,表示第几个参数。 |
$# | 传递给脚本或函数参数个数 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或函数的所有参数 |
$? | 执行上次命令的退出状态,或函数的返回值 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID |
$BASH_SOURCE | 表示脚本的第一个参数。如果第一个参数是bash ,则自动转换为第二个参数 |
2.3 $*
和$@
的区别
$*
和$@
都表示传递给函数或脚本的所有参数,不被双引号(" "
)包含时,都以"$1" "$2" … "$n"
的形式输出所有参数。
但是,当它们被双引号(" "
)包含时,"$*"
会将所有参数作为一个整体,以"$1 $2 … $n"
的形式输出所有参数;"$@"
会将各个参数分开,以"$1" "$2" … "$n"
的形式输出所有参数。
#!/bin/bash
# 调用命令 cmd.sh a b c
# 输出$*和"$*"
# $*= a b c
# "$*"= a b c
echo "\$*=" $*
echo "\"\$*\"=" "$*"
# 输出$@和"$@"
# $@= a b c
# "$@"= a b c
echo "\$@=" $@
echo "\"\$@\"=" "$@"
# 循环输出$*
# print each param from $*
# a
# b
# c
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
# 循环输出$@
# print each param from $@
# a
# b
# c
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
# 循环输出"$*"
# print each param from "$*"
# a b c
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
# 循环输出"$@"
# print each param from "$@"
# a
# b
# c
echo "print each param from \"\$@\""
for var in "$@"
do
echo $var
done
2.3 shift
位置参数可以用shift
命令左移。比如shift 3
表示原来的$4
现在变成$1
,原来的$5
现在变成$2
等等,原来的$1
、$2
、$3
丢弃,注意:$0
不移动。不带参数的shift
命令相当于shift 1
。
shift
是Unix
非常有用的命令。我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当Shell
程序不知道其个数时,可以把所有参数一起赋值给变量$*
。若用户要求Shell
在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在$1
后为 $2
,在$2
后面为$3
等。在shift
命令执行前变量$1
的值在shift命令执行后就不可用了。
3. if
3.1 语法
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
3.2 特性选项
选项 | 描述 |
---|---|
[ -a FILE ] | 如果FILE存在,则为真 |
[ -b FILE ] | 如果FILE存在且是一个块特殊文件,则为真 |
[ -c FILE ] | 如果FILE存在且是一个字特殊文件,则为真 |
[ -d FILE ] | 如果FILE存在且是一个目录,则为真 |
[ -e FILE ] | 如果FILE存在,则为真 |
[ -f FILE ] | 如果FILE存在且是一个普通文件,则为真 |
[ -g FILE ] | 如果FILE存在且已经设置了SGID则为真 |
[ -h FILE ] | 如果FILE存在且是一个符号连接,则为真 |
[ -k FILE ] | 如果FILE存在且已经设置了粘制位,则为真 |
[ -p FILE ] | 如果FILE存在且是一个名字管道,则为真 |
[ -r FILE ] | 如果FILE存在且可读,则为真 |
[ -s FILE ] | 如果FILE存在且大小不为0,则为真 |
[ -t FD ] | 如果文件描述符FD打开且指向一个终端,则为真 |
[ -u FILE ] | 如果FILE存在且设置了SUID,则为真 |
[ -w FILE ] | 如果FILE如果FILE 存在且可写,则为真 |
[ -x FILE ] | 如果FILE存在且可执行,则为真 |
[ -O FILE ] | 如果FILE存在且属有效用户ID,则为真 |
[ -G FILE ] | 如果FILE存在且属有效用户组,则为真 |
[ -L FILE ] | 如果FILE存在且是一个符号连接,则为真 |
[ -S FILE ] | 如果FILE存在且是一个套接字,则为真 |
[ FILE1 -nt FILE2 ] | 如果FILE1比FILE2更近修改, 或者FILE1存在且FILE2不存在,则为真 |
[ FILE1 -ot FILE2 ] | 如果FILE1比FILE2旧, 或者FILE2存在且FILE1不存在,则为真 |
[ FILE1 -ef FILE2 ] | 如果FILE1和FILE2指向相同的设备和节点号,则为真 |
[ -o OPTIONNAME ] | 如果shell选项 OPTIONNAME"开启,则为真 |
[ -z STRING ] | STRING长度为零,则为真 |
[ -n STRING ] or [ STRING ] | STRING长度为非零,则为真 |
3. 命令
3.1 特殊命令
命令 | 描述 |
---|---|
$(cd "$(dirname "$0")"; pwd) | 获取命令所在全路径 |
echo $(cmd) | 执行cmd 一次命令,得到其标准输出,再将此输出放到原来命令 |
( ) | 执行一串命令,重新开一个shell进程执行该串命令 命令间用 ; 隔开,最后一个命令可以不用分号,括号和符号间需要有空格 |
{ } | 执行一串命令,在当前shell执行该串命令 命令间用 ; 隔开,最后一个命令要用分号,花括号和符号间可以没有空格 |