linux学习笔记之shell变量
系统变量: env可以查看系统变量
变量名作用
$0当前脚本的名字
$n传递给脚本或者函数的参数,n表示第几个参数
$#传递给脚本或函数的参数个数
$*传递给脚本或函数的所有参数
$@传递给脚本或者函数的所有参数
$$当前shell脚本进程的PID
$?函数返回值,或者上个命令的退出状态
$BASHBASH的二进制文件问的路径
$BASH_ENVBASH的启动文件
$BASH_VERSINFO[n]BASH版本信息,有六个元素
$BASH_VERSIONBASH版本号
$EDITOR脚本所调用的默认编辑器
$EUID当前有效的用户ID
$FUNCNAME当前函数名
$GROUPS当前用户所属组
$HOME当前用户家目录
$HOSTTYPE主机类型
$LINENO当前行号
$OSTYPE操作系统类型
$PATHPATH路径
$PPID当前shell进程的父进程ID
$PWD当前工作目录
$SECONDS当前脚本运行秒数
$TMOUT不为0时,超过指定的秒将退出shell
$UID当前用户ID
变量的赋值方式:
一、直接赋值
显示赋值 abc=123 name="郑 俊雄",有空格需要用引号。默认都为string类型。
boy="$name is good" 一个变量引用另一个变量。
echo boy 输出为: 郑俊雄 is good
命令替换
1、反引号`` 表示命令替换,用于双引号里面执行命令语句。
2、() 与反引号功能相同。 today="今天是(date+%F)"
二、变量赋值 read
read -p "please input a ip : " ip
read -n 2 name 只取两个字符
read -t 5 延时5秒
read ip1 ip2 ip3 ip4 依次输入参数值 1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4
应用例子:
#!/usr/bin/bash
read -p "输入姓名:" name
read -p "输入性别:" sex
echo "你输入的姓名是:$name, 性别:$sex "
chmod a+x read.sh
以上方式过于麻烦可以优化
read -p "请输入姓名,性别,年龄:" name sex age //用于同时定义多个变量。
"" '' 单引号是强引用,双引号为弱引号。
'$name' //无法读取name的值,输出为$name
disk_free="df -Ph |grep '/$' |awk '{print $4}'" //输出错误
disk_free=`df -Ph |grep '/$' |awk '{print $4}'` //输出正确
disk_free=(df -Ph |grep ''/$ |awk '{print $4}') //输出正确
三、变量的计算
整数运算
sum2=(($num+$num2)) 或者 sum2=((num+num2))
expr 1+2
sum=$[1+2] //推荐使用方括号[]和let
let num=1+2#!/usr/bin/bash
例子:计算内存占用率
#!memery used script
#!author zhengjx
mem_used=`free -m |grep '^Mem' |awk '{print $3}'`
mem_total=`free -m |grep '^Mem' |awk '{print $2}'`
let mem_percent=$mem_used*100/$mem_total
echo "内存使用百分比为:$mem_percent%"
例子2: while循序的计算
#!usr/bin/bash
#!ping script
#!Athor zhengjx
ip=www.baidu.com
i=1
while [ $i -le 5 ]
do
ping -c2 $ip &>/dev/null
if [ $? -eq 0 ];then
echo $ip is up
fi
let i++
done
四: 变量的替换和删除
变量的删除
echo ${#url} //获取变量长度
echo ${ip#*.} //从前往后截取*.后的内容 输出为baidu.com,删掉www.
echo ${ip##.} //贪婪删除. 输出为com 从前往后 贪婪匹配。
echo ${ip%*.} //从后往前
echo ${ip%%.} //贪婪匹配 从后往前
echo ${ip%com} //从后往前 删掉com
变量切片
ip=www.baidu.com //索引从0开始 0 1 2 3 4 5 6 7 8 9
echo ${ip:0:5} // www.ba
内容替换
echo ${ip/baidu/sina} //baidu替换为sina
echo ${ip//w/W} //贪婪替换 小写w全部替换为大写W
内容替代
unset ip 重置ip变量
ehco {ip-aaaa} //未定义的变量可以替代
echo {ip:-aaaa} //可替换空值和未定义的值
扩展:变量i++ ++i的区别 shell脚本中基本只注重i的值,对于i++和++i没什么区别。
对变量值来说
i++ 和 ++i 值都是一样,不影响
对表达式来说,影响xy的值
let x=i++ //先赋值,再计算 x=1 i=2
let y=++j //先计算再赋值 y=2 j=2