1. 自定义变量
定义变量: 变量名=变量值
eg:ip=192.168.1.14
引用变量:$变量名 或 ${变量名}
eg:$ip ${ip}
查看变量:echo $变量名
eg: echo ${ip}
取消变量: unset 变量名
eg: unset ip
作用范围: 仅在当前shell中有效
2.环境变量:
定义环境变量:法一: export ip=192.168.1.14
法二:ip=192.168.1.14
export ip
查看当前环境变量: env | grep ip
read ip
read -p "please input ip " ip
read -t 5 -p "please input ip: " ip
read -n 2 ip
3. 多个脚本之间共享变量
eg: sc1.sh
ip=192.168.1.14
sc2.sh 脚本 要使用 sc1.sh 中变量
. sc1.sh
echo ${ip}
4. 位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 $(10]
5. 预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值
basename 文件名 不包含 路径
dirname 文件路径
#!/bin/bash
if [ $# -ef 0 ];then
echo "usage: `basename $0` file"
exit
if
if [ ! -f $1 ];then
echo "error file"
exit
if
for ip in `cat $1`
do
ping -c1 $ip &>/dev/null
if [ $? -ef 0 ];then
echo "$ip is up."
else
echo "$ip is down"
if
done
6. 强引用和弱引用、反引号和括号
“ ” 弱引用
' ' 强引用
school=1000p
echo "${school} is goog"
echo '${school} is good'
`` 等价于$() : 反引号和括号中的命令会被先执行
touch `date +%F`_file1.txt
touch $(date +%F)_file2.txt
7. 变量的运算
1. 整数运算
方法一:expr
expr 1 + 2
expr $num1 + $num2
+ - \* %
方法二:$(()) + - * / %
echo $(($num1+$num2))
echo $((num1+num2))
echo $((5-3*2))
echo $((2**3))
sum=$((1+2));echo $sum
方法三:$[] + - * / %
echo $[5+2]
echo $[5**2]
方法四:let
let sum=2+3;echo $sum
let i++;echo $i
#!/bin/bash
ip=10.18.42.1
for i in {1..5}
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up..."
fi
done
#!/bin/bash
ip=10.18.42.1
i=1
while [ $i -le 5 ]
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up..."
fi
let i++
done
7. 小数运算
echo "2*4" | bc
echo "2^4" | bc
echo "scale=2;6/4" | bc
awk 'BEGIN{print 1/2}'
echo "print 5.0/2" | python
8. 变量内容 删除
url=www.baidu.com
echo ${#url} # 获取变量的长度
echo ${url} # 标准查看
echo ${url#*.} # 从前往后, 最短匹配
ehco ${url##*.} # 从前往后,最长匹配,贪婪匹配
echo ${url%.*} # 从后往前,最短匹配
echo ${url%%.*} # 从后往前,最长匹配,贪婪匹配
9. 索引及切片
echo ${url:0:5} # 索引0 开始向后 5个
echo ${url:5:5}
echo ${url:5}
10.内容替换
echo ${url/baidu/google}
echo ${url//n/N} # 贪婪匹配
11.变量替代
echo ${var1}
echo ${var1-bbbb} # 若没有定义 var1 则默认值为bbbb
${变量名-新的变量值}
变量没有被赋值:会使用 新的变量值 替代
变量有被赋值(包括空值):不会被替代
${变量名:-新的变量值}
变量没有被赋值:会使用新的变量值替代
变量有被赋值(包括空值): 不会被替代
var= # 空值
echo ${var:-aaa} # 空值不会被替代
echo ${var:+aaa} #仅在变量非空才输出
echo ${var+aaa} # 就算变量为空也会输出
echo ${var3=aaa} # var3 不存在或 为空值 赋值 为aaaa
echo ${var3:=aaa} # var3 不存在 或者为空值
12. 条件测试
格式1:test 条件表达式
格式2: [ 条件表达式 ]
格式3:[[ 条件表达式 ]]
-e :文件或目录是否存在
-d: 是否是一个路径
-f: 是否存在,而且是文件
-r : 当前用户是否有读权限
-x: 是否有执行权限
-w: 是否有写权限
-L: 是否为一个存在的软链接
数值比较:
[ 1 -gt 10 ] 大于
[ 1 -lt 10 ] 小于
[ 1 -eq 10 ] 等于
[ 1 -ne 10] 不等于
[ 1 -ge 10] 大于等于
[1 -le 10] 小于等于
c语言风格的数值比较
((1<2))
((1==2))
((1>2))
((1>=2))
((1<=2))
((1!=2))
((`id -u`>0))
(($UID==0))
13. 是字符串比较
使用双引号
[ "$USER" = "root" ]
[ "$USER" == "root" ]
[ -z $var ] #字符长度为0
[ -n $var ] # 字符串长度不为0
# 条件测试
[ 1 -lt 2 -a 5 -gt 10 ];echo $?
[ 1 -lt 2 -o 5 -gt 10 ];echo $?
# 双中括号用法
[[ 1 -lt 2 && 5 -gt 10 ]];echo $?
[[ 1 -lt -2 || 5 -gt 10 ]];echo $?
[[ "$USER" = ~ r ]];echo $?
14.总结
() 子shell中执行
(()) 数值比较,运算C语言
$() 命令替换
$(()) 整数运算
{}
${}
[] 条件测试
[[]] 条件测试,支持正则 =~
$[] 整数运算