经常用到,有时候就会忘,收藏起来备忘查看。
目录
如下,执行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
如上几种方式均可。