汇总起来,备忘查看。
目录
1,脚本的参数传递与接收
2,判断是否有传入的参数、获得参数个数
3,获取传入的全部参数、遍历全部参数
4,获取当前脚本对应的进程pid
5,判断目录、文件等是否存在
6,判断变量是否为空
7,判断上一个命令是否执行正常
8,获取命令的结果
9,设置/删除全局环境变量
设置环境变量
将命令执行结果设置为环境变量
设置全局环境变量
修改
删除
10,获取字符串长度
11,内置可直接使用的环境变量
12,脚本如何执行
如下,执行x.sh脚本,传入两个参数a、b:
bash x.sh a b
脚本中接收标识:
$0:获取当前脚本文件名称,即x.sh
$1:第1个参数,即上述例子中的a
$2:第2个参数,即上述例子中的b
...
...
使用:
#!/bin/bash
a="hello"
# 双引号下使用
echo "$a"
# 单引号下使用
echo ''$a''
$#是特殊变量,表示参数个数:
echo "params length is $#"
if [ $# -eq 0 ]; then
# 没有参数
else
# 有参数
fi
如下脚本:
#!/bin/bash
echo "params length is $#"
# 打印所有参数
echo "all params: $*"
# 遍历所有参数
for x in $*
do
echo "get $x"
done
脚本名称b,带三个参数执行:
# sh b 1 2 3
params length is 3
all params: 1 2 3
get 1
get 2
get 3
用$$获取,编写如下脚本:
#!/bin/bash
echo "this is a, pid is $$"
验证:
# source a
this is a, pid is 11980
-d:检查目录是否存在、是否是目录
-f:检查文件是否存在、是否是文件
# 目录是否存在
if [ -d "/root/shell_test" ]; then
# 存在
echo "dir exists"
else
echo "dir does not exists"
fi
# 文件是否存在
if [ -f "/root/shell_test/a" ]; then
# 存在
echo "file exists"
fi
if [ -z "$a" ]; then
echo "is null"
else
echo "is not null"
fi
或使用test探测:
id=$(docker ps|grep mysql |awk '{print $1}')
if test !$id ; then # id为空
echo "mysql doesn't exists!"
fi
$? 可判断上一个命令是否执行正常,执行成功时会正常退出0状态码,通过结果是否为0即可判断是否正常。
如下脚本检查指定docker容器是否正在运行:
#!/bin/bash
# 方式1
get_state=`docker inspect --format '{{.State.Running}}' f10f6c02b276` # 此行反引号中的指令已执行
# 方式2
get_state2=$(docker inspect --format '{{.State.Running}}' f10f6c02b276)
res=$get_state # 结果保存在res中
echo "result is $res" # 使用res
echo "result is $get_state" # 直接使用get_state
echo "result is $get_state2" # 直接使用get_state2
即使用反引号或 $() 都可以。
那么如果命令对应的那一行仅是字符串保存一下,在需要的时候执行,而不是立即执行,怎么办?
#!/bin/bash
# 定义变量,保存命令
get_state="docker inspect --format '{{.State.Running}}' f10f6c02b276"
# 需要执行的时候
res=`$get_state` # 执行指令并将结果保存在res中,第一次执行
echo "result is $res" # 使用res
echo "result is `$get_state` " # 字符串中执行,反引号的形式,第二次执行
echo "result is $($get_state)" # 字符串中执行,使用$()的形式,第三次执行
echo "-----------------"
mk="mkdir ./yyy"
echo "over $($mk)" # 注意括号内给变量需带上$,否则会认为mk是一个可执行程序而报错:mk: command not found
如果不是全局环境变量,脚本结束后,环境变量将被清除。
export KEY=VAL # 即时生效
export KEY=$(command)
echo "export KEY=VAL" >> /etc/profile
文件外保存:
source /etc/profile
export KEY=NEW_VAL
unset KEY
a="123"
echo "${#a}"
${#a} 表示获取字符串a的长度
echo $BASH_VERSION # 当前使用的Bash版本号
echo $BASH_ENV # Bash的启动脚本文件路径
echo $HOSTNAME # 主机名
echo $MAIL # 邮箱文件路径
echo $OLDPWD # 上一个工作目录
echo $SHLVL # Shell嵌套层数
echo $TERM # 终端类型
echo $UID # 当前用户的UID
shell程序a,执行:
sh a
bash a
source a
chmod +x a && ./a
如上几种方式均可。