Linux Shell编程整理
变量
shell中变量分系统自带的环境变量和自定义变量(用户自己定义的)
查看环境变更
env
使用自定义变量及获取自定义变量的值
#!/bin/bash
MYHOME=/home/oracle #定义变量
echo $MYHOME #取值
echo ${MYHOME} #取环境变量的值,这个是比较好的shell编程习惯
执行结果赋值给变量
CONTENT=`ls -l` #执行结果赋值
echo ${CONTENT}
$和参数
# shell中$参数的使用
$0 这个程式的执行名字,文件本身信息。
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用。 数组的使用情况使用。 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
${!#} 最后一个参数
示例:
#!/bin/bash
echo "\$0 执行程序的名称为: $0"
echo "\$# 输入参数的个数:$#"
echo "\${!#} 最后一个参数为: ${!#}"
for i in "$*"
do
echo "以一个字符串输出参数:"
echo $i
done
echo \n
echo "以多个字符串输参数:"
for i in "$@"
do
echo $i
done
执行结果 :
./test.sh
[root@shell]# ./test.sh para1 para2 para3
$0 执行程序的名称为: ./test.sh
$# 输入参数的个数:3
${!#} 最后一个参数为: para3
以一个字符串输出参数:
para1 para2 para3
以多个字符串输参数:
para1
para2
para3
数组
bash shell 只支持一维数组,不支持多维数组
数组定义:
以括号定义,内部元素以空格分析
array_name=(var0 var1 var2)
获取数据的元素:
${array_name[index]}
获取数组的内容:
${array_name[*]}
${array_name[@]}
获取数组的长度:(使用#获取数组的长度)
${#array_name[*]}
${#array_name[@]}
补充:获取字符串的长度
MYSTR=“hello world”
echo “MYSRT字符口中的长度为:${#MYSTR}”
输出结果为:
MYSRT字符口中的长度为:11
数组的删除:
# 每个元素,从左向右进行最短匹配
## 每个元素,从左向右进行最长匹配
% 每个元素,从右向左进行最短匹配
%% 每个元素,从右向左进行最长匹配
添加一个元素:
array_name[index_max+1]=var
示例:字符串转换为数组,以,为分隔符
str="var1,var2,var3"
IFS=,
arr=($str) #将str字符串转换为数组
echo "str:" $str
echo "数组arr: " ${arr[@]} # 显示数组所有的内容
echo "数组arr[1]: " ${arr[1]} # 显示数组下标为1的值
echo "length:" ${#arr} # 数组的长度
# 修改arr[1]下标为1位置的内容
arr[1]="aaa"
echo ${arr[@]}
shell当的运算符
数学运算
常用expr表达式,做数学运算
sum=`expr 1 + 1` # 计算1+1
echo ${sum}
multi=`expr 2 \* 3` # 乘法
div=`expr 6 \/3` #除法 ,注意转义字符
echo ${multi}
echo ${div}
解释说明:
expr表达式做数学运算
expr 1 + 1 :注意,expr和后面的是有空格的 。 1 + 1之间在+号的前后,都是有空格的,这个要注意。
若写成 1+1这个在bash shell表代表的是字符串,而不是表达式,会返回结果为:1+1。
使用let做计算
使用let计算,运行结果是没有返回值的
let expression
x=1
let x=$x+1 或者 let x+=1
echo ${x}
let 1+1 #在命令行是不返回结果的。 而且注意,这个是+号两边没有空格
注意:$x+1之间没有空格,x+=1之间没有空格, let没有返回值
((expression)) 和 $((expression))
((expression)) 用法:
x=10
((x+=1)) 其方法与let类似
$((expression))用法:
x=10
y=$(($x+1))
y=$((x+=1))
注意:两者的差别:(())没有返回值,$(())有返回值。 有返回值,则才进行相应的赋值。
((1+1)) : 命令行没有回显
$((1+1)) : 命令行返回结果为2
使用$[ ]格式
x=10
$[ $x + 1 ]
y=$[ x = $x + 1 ]
y=$[ $x + 1 ]
注意:注意空格的使用. []前后是需要有空格的,而+号前后可以没有空格。
在我们shell编程习惯中, 最好的习惯就是,当使用[]计算表达式时,如在if-else-fi或在算术运算时,则尽量在前后增加空格
使用declare格式
使用declare
declare -n i #定义的算术变量
i=$i+1
echo $i
算数关系运算符
关系运算符,这个只能用于比较数字,不能用于比较字符串
用于比较数值
可以参照test命令的帮助来看
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
字符串测试
用于字符串的比较
=:等于则为真 用于字符串的比较
!=:不相等则为真
-z 字符串:字符串长度伪则为真
-n 字符串:字符串长度不伪则为真
文件测试
用于测试文件的存在情况
-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真
布尔运算符 和 逻辑运算符
布尔:
! 非操作
o 或操作
a 与操作
逻辑:
&& 与
|| 或
a=10
b=20
if [ $a != 100 ]; then
echo "a不是100”
fi
if [ $a -gt 10 -o $b -lt 200 ]
then
echo "hello"
fi
if [ $a -gt 10 || $b -lt 200 ]
then
echo "hello"
fi
test命令
test命令可以比较数字,字符串和测试文件是否存在
test数值和字符串测试是可以使用如下判断参数
数值测试:
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
文件测试:
如前面说的是一样的,此处不再多述。
示例:
#!/bin/bash
num1=100
num2=200
if test $[num1] -lt 150 -o $[num2] -gt 200 #[]代表数值
then
echo 'aaa'
else
echo 'bbb!'
fi
# 输出结果 :
aaa