在脚本中使用变量
命名方式与C一样,区分大小写
$变量名 在脚本中使用
unset 变量名 可取消变量
ps:type 字符串 可查询该字符串类型
$?表示上一个命令的返回值
#!/usr/bin/bash
ip=10.18.42.xxx
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ]; then 这里的;不可少,因为要分割命令 且其中方括号内表示判断上一条命令的返回值是否为0
echo "$ip is up"
else
echo "$ip is down"
fi
read 从键盘读入
如下例子 但是这种输入需在脚本运行以后再输入
#!/usr/bin/bash
read ip 或者 read -p "Please input a ip: " ip 其中-p参数,允许在read命令行中直接指定一个提示
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ]; then 这里的;不可少,因为要分割命令 且其中方括号内表示判断上一条命令的返回值是否为0
echo "$ip is up"
else
echo "$ip is down"
fi
read 可以一次键入多个变量 用空格分隔即可
read a b c d e f g
位置变量 $1 $2 $3
(这个是无需自己定义,系统内定的规定)
即将命令行脚本命令之后的第一个参数传给$1 第二个参数传给$2
环境变量和自定义变量
相当于C中的全局变量和局部变量
ip10 = xxx 自定义变量(局部)
export ip10 = xxx 环境变量(全局)
也可将已存在的自定义变量转为全局变量: export ip 即可
可以在脚本中包含另一个脚本的所有内容(这样就无需把需要共享的变量都转化为环境变量)
public.sh
(定义变量=处不能有空格!!!!!)
#!/usr/bin/bash
ip10=xxx(定义变量=出不能有空格!!!!!)
a.sh
#!/usr/bin/bash
. public.sh(.后必须有空格)
echo $ip10
env显示当前所有环境变量
ps:
最好甚至一定要在用变量的时候加{} 比如${ip}
这样就可以避免很多歧义 而且${#ip}可以查看变量的字符串长度
预定义变量
$0 脚本名(即文件名)
$* 所有的参数
$@ 所有的参数
$# 参数的个数(可看当前执行脚本的)
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值,0表示成功,非零表示失败
ps:-f 表示判断是不是文件
注意
设 ip=123
" “弱引用 双引号内会显示变量的值 如"$ip" 就会显示123
’ '强引用 而单引号内不会显示变量的值 如 ‘$ip’ 就会显示$ip
但是” " 里面要打印!之类的特殊字符就不好处理,最好用" "也用’ ’
` `命令替换 这个等价于$()
反引号(` `或者$())中的shell命令会先被执行
例如mkdir $(date)ppp 以当日日期命名文件夹
变量的运算
expr 运算式
$((运算式))
$[运算式]
let 运算式
-le 小于等于
echo “scale=2;6/4” |bc其中scale=2保留两位小数
内容的删除替换代替
删除但原变量没变
url=www.sss.xxx
echo ${url#.}
索引 切片
echo ${url:0:5}
取从第0个字符开始后的5个字符
echo ${url:5}
取从第5个字符开始后所有字符
替换
echo ${url/n/N} 将url中出现的第一个n改为N
echo ${url//n/N }将url中出现的所有n改为N
替代
${var1 -aaaaa} 若var1没有被赋值 则默认为aaaaaa
若var1有赋值 即便是空值也不会被aaaaaa替代
${var2:-aaaaa} 若var2没有被赋值 则默认为aaaaaa
若var2有赋值 是空值就会被aaaaaa替代
${var3+aaaaa}
${var3:+aaaaa}
${var3=aaaaa}
${var3:=aaaaa}
${var3?aaaaa}
${var3:?aaaaa}
++
和C一样 不多说
其他 各种符号
read -p "input number:" num
if[[ !"$num"=~^[0-9]+$ ]];then 检查是不是数字
echo "你输入的不是数字,程序退出!!!"
exit
fi
echo ccc
调试脚本:
sh -n 02.sh 仅调试syntax error
sh -vx 02.sh 以调试的方式执行,查询整个执行过程