一、shell技术
2.shell 变量
shell变量使用一个特定的字符串表示不固定的内容
$variable
引用变量的值
#!/bin/bash # "#!"she bang 解释用哪个执行
ip=127.0.0.1 #本地还回
ping -c1 $ip &>/dev/null && echo "$ip is up " ||echo "$ip is down";
2.1自定义变量
定义变量: 变量名=变量值 变量名必须是以字母或下划线开头,区分大小写。如:ip=127.0.0.1
引用变量: 变 量 名 或 变量名 或 变量名或{变量名}
查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量: unset变量名
作用范围: 仅在当前shell有效
#!/bin/bash
ip=127.0.0.1 #本地还回#变量和等号和值之间不能有空格#显示赋值
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then#注意空格 ,否则出错
echo "ip is up"
else
echo "ip is down"
fi
#!/bin/bash
read -p "please input a ip: "ip #从键盘读取
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then#注意空格 ,否则出错
echo "ip is up"
else
echo "ip is down"
fi
#!/bin/bash
ping -c1 $1 &>/dev/null
if [ $? -eq 0 ];then#注意空格 ,否则出错
echo "$1 is up"
else
echo "$1 is down"
fi
$1与$2表示脚本执行时跟的变量。
如:
./ping02.sh 127.0.0.1 127.0.0.2
$1 $2
显示如下:
2.2环境变量
定义环境变量:方法一 expor back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量: 变 量 名 或 者 变量名或者 变量名或者{变量名}
查看环境变量:echo $变量名 env 例如env |grep back_dir2
env显示所有环境变量
取消环境变量:unset变量名
变量作用范围:在当前shell和子shell有效
一个脚本用另个脚本里变量:
方法一:另一个脚本变量设为全局变量
方法二:在一个脚本里加载另一个脚本
#!/bin/bash
. 1.sh #v1在1.sh里#当前shell 执行
echo -e "$v1"
如上图所示,如果在1.sh与2.sh中用到public.sh,可以直接在1.sh与2.sh中添加. public.sh
2.3位置变量
$1 $2 $3 $4 ${5} 与上面的 $1和$2一样
2.4预定义变量
$0 | 脚本名 |
---|---|
$* | 所有的参数 |
$@ | 所有的参数 |
$# | 参数的个数 |
$$ | 当前进程的PID |
$! | 上一个后台进程的PID |
$? | 上一个命令的的返回值 0表示成功 |
测试脚本:
#!/bin/bash
#如果脚本没有参数
if [ $# -eq 0 ]; then
echo -e "usage: `basename $0` file" #反引号,执行引号里面命令
exit
fi
if [ ! -f $1 ]; then
echo "error file"
exit
fi
for ip in `cat $1`
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then #if后面有空格
echo "$ip is up"
eles
echo "$ip is down"
fi
done
#反引号,执行引号里面命令
basename 基本文件名
dirname 基本目录名
2.5 显示赋值
变量名=变量值
示例:
ip=127.0.0.1
school=“HDU_University”
today1=`date +%F`
today2=$(date +%F)
2.6read从键盘读入变量值
read 变量名
read -p “提示信息:” 变量名
read -t 5 -p “提示信息:” 变量名 //等待5s时间
read -n k 变量名 //需要k个字符
2.7""与’'的区别
""弱引用
''强引用
示例:
name="mary" ;boy1="$name is good";boy2='$name is good'
boy1=mary is good,boy2=$name is good;
touch ` date +%F`_file_txt
2.8变量运算
2.8.1整数运算方法一expr
expr 1+2
expr v 1 + v1+ v1+v2
expr v 1 ∗ v1\\* v1∗v2
2.8.2整数运算方法二$(())
echo ( ( (( ((v1+$v2))
echo $((v1+v2))
echo $((5-3*))
echo $(((5-3)*2))
echo $((5**3)) //5的立方n**k n的k方
sum=$((1+2))
2.8.3整数运算方法三$[]
和方法二一样
2.8.4整数运算方法四let
let sum=2+3;
let i++
示例:
#!/bin/bash
ip=1.0.0.127
i=1
while [ $i -le 5 ] #-le 表示小于#记住[] 两头都要用[]隔开
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up"
fi
let i++
done
2.9整数运算
echo “2*4” |bc
echo “2^4” |bc
echo “scale=n;6/4” |bc //小数点后n位
2.10变量的内容和替换
${#v1} 显示v1几个字符
删除变量部分(本身不变)
前删
name=www.baidu.com
echo ${name#*.} 删除www.
echo ${name##*.}删除www.baidu.//贪婪匹配删除到最后一个.之前
后删
echo ${name%.*}删除.com
echo ${name%%.*}删除.baidu.com//贪婪匹配删除到最后一个.之前
切片
echo ${name:0:5}//取位置0开始后面5位
echo ${name:5:5}//取位置5开始后面5位
echo ${name:5}//取位置5后面所有
替换
echo ${name/baidu/sina}//把baidu替换为sina
echo ${name/b/B}//修改第一个字符b为B
echo ${name//w/W}//把所有w变成W
变量替代
变量已定义
${变量名-新的变量值} 变量没有被赋值:会被新值替代,否则不会被替代(包括空值)
${变量名:-新的变量值} 变量没有被赋值(包括空值):会被新值替代,否则不会被替代
2.11i++与++i
和C语言一样,不在赘述