shell变量
命名规范: 字母数字下划线组成,字母打头
在shell这中大概分为三种变量即系统变量、环境变量、用户自动定义变量
系统变量常见的:
$0 当前脚本的名称
$n 当前脚本的第n个参数
$* 当前脚本的所有的参数
$# 当前脚本的参数的个数
$? 指令执行完成的状态,0表示执行成功
$$ 程序本身的PID
环境变量常见的:
$PATH
$HOME 打印当前用户的家目录
$SHELL 显示当前的shell类型
$USER 打印当前用户
id 打印当前用户id信息
pwd 显示当前的路径
$TERM 显示当前的终端类型
$HOMENAME 打印当前主机名
$RANDOM 随机生成一个0-32767之间的整数
用户自定义变量:
普通变量 name="test" 等号两边不能有空格
局部变量 local name="test" 只能在函数体内部使用,外部无法访问
只读变量 readonly name="test" 只读变量,定义后只能读取不能修改,且unset无法销毁
使用变量:
$变量名 或者 ${变量名}
$和${}的区别:可以指定变量的边界、对字符串变量的截取
var=http://www.baidu.com/index.html
1、#号截取,从左边开始,删除匹配的字符以及左边的,保留右边的
${var#*//} www.baidu.com/index.html
2、##号截取,从右边开始,删除匹配的字符以及左边的,保留右边的
${var##*/} index.html
3、%号截取,从左边开始,删除匹配的字符以右边的,保留左边的
$var{var%/*} http://www.baidu.com
4、%%号截取,从右边开始,删除匹配的字符以及右边的,保留左边的
${var%%/*} http:
5、从左边第几个字符开始,以及截取字符长度
${var:0:3} htt
${var:0} 缺省长度表示inde以后的所有字符长度
6、从右边第几个字符开始,以及截取字符的长度
${var:0-3:3} tml
${var:0-3} 缺省长度表示inde以后的所有字符长度
流程控制
1、if判断
if单分支
if [ 条件表达式 ];then 语句 fi
if双分支
if [ 条件表达式1 ];then 语句1 else 语句2 fi
if多分枝
if [ 条件表达式1 ];then 语句1 elif [ 条件表达式2 ];then 语句2 else 语句3 fi
2、for循环
for 变量名 in 取值列表;do 语句 done
chmod 755 ${ele}
echo $ele
done
案例:查找环境中的所有权限为777的权限修改为755
#!/bin/bash
name=`find /root ! -type l -perm 777 2>/dev/null`
array=(${name// / })
for ele in ${array[*]}
do
chmod 755 ${ele}
echo $ele
done
3、while循环
while (表达式) do 语句 done
4、case选择
case 模式名 in
模式名1)
语句1
;;
模式名2)
语句1
;;
*)
不符合上述模式执行语句
esac
案例:查找环境中的所有权限为777的权限修改为755
3、while循环
while (表达式) do 语句 done
4、case选择
case 模式名 in
模式名1)
语句1
;;
模式名2)
语句1
;;
*)
不符合上述模式执行语句
esac
条件判断
条件判断命令
[]与test用作判断,[]是test命令的另一种形式,用于判断表达式返回值是否是0或者非0
test $a == "linux" 等价于 [ $a == "linux" ]
备注:[] 与[[]] 的区别,[[]]是增强版本的[],也是用作判断的增强点:
1、在[[]]中使用<>符号不需要转义,在[]中使用需要转移
[ $1 \> 5 ] 等价于[[ $1>5 ]]
2、在[[]]中可以使用&& 或者 ||连接且只能连接 != 或者 ==的判断
[[ $1 !=2 && 2==3 ]]
或者分来写来规避
[[ $1 > 1 ]] && [[ 2 < 3]]
条件判断文件判断、字符串比较、数值比较
文件判断
-e 路径存在时返回真 test -e /paasdata
-f 路径存在且是文件时返回真 [ -f /paadata/test.sh ]
-d 路径存在且是目录时为真 [[ -d /paasdata]]
字符串比较
-z 当str为空时返回真
-n 当str为非空时返回真
= 当两个str相等时返回真
== 当两个str相等时返回真
!= 当两个str不相等时返回真
数值比较
-eq 相等
-ne 不等
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
逻辑运算
-a 逻辑于 tes 1>1 -a 2=2
-o 逻辑或
! 逻辑非
数值运算
整数运算
$[]与$(())表达式用作数值运算,运算符两侧可以无空格、引用变量可以省去$符号、无需转义
echo $[a+25]
使用let命令,let命令可以直接对变量值做运算再保存新的值
let x+=1;
echo $x
expr命令,乘法操作应采用 * 转义、运算操作符之间需要以空格分开、引用变量时必须加$符号
expr $x - 56
数组
shell的 数组只支持一维数组,初始化时不需要定义数组的大小,数组的下标从0开始
数组的定义,用括号表示,元素用空格分隔开:(A B C)
arry = (a b c)
arry[3]=4
读取数组
#单个值读取
${arry[0]}
#获取数组的所有的值
${arry[*]}
${arry[@]}
#获取数组的长度
${#arry[*]}
数组循环遍历
#for循环
for(( i=0;i<${arry[@]};i++))do
echo ${arry[i]};
done;
#for...in循环
for ele in ${arry[*]}do
echo $ele
done
#while循环
i=0
while [ 1 /> 2 ]do
echo "1大于2"
done
字符串转换为数组
方案1:按空格转换为
#!/bin/bash
arry=(A B C)
array=(${name// / })
方案2:$IFS
IFS(Internal Field Seprator),内部域分隔符,是shell的内置变量,当shell处理替换命令时,会根据IFS的值(默认是space/tab/newline)来进行变量分割
#!/bin/bash
arry=(A,B,C)
array=(${name// / })
IFS=$IFS #保留原始的
IFS=","
array=($arry)