Shell编程
#!/bin/sh
str_name="jack" #变量赋值,等号俩边不能有空格,比如str_name = "jack"、str_name= "jack"
echo $str_name
echo ${str_name}
readonly str_name #定义只读,不带$
unset str_name #删除变量,不带$
str_say = "hello, ${str_name} !" #拼接字符串
str_say = "hello", ${str_name} ! #拼接字符串
str_say = hello, ${str_name} ! #拼接字符串
len = ${#str_say} #获取字符串长度
len = ${#str_say[0]} #获取字符串长度,一样效果
str_sub = ${str_name:1:3} #字符串截取:${字符串:开始位置:截取长度},第一个字符的位置为 0
#数组:
arr=(a b 1 2 "cc") #定义数组,shell只支持一维数组,没有多维数组;
echo ${arr[0]} ${arr[1]} ${arr[2]} #读取数组,第一个位置为0
echo ${arr[@]} #读取所有数组,使用@
len=${#array_name[@]} #获取数组的长度,使用@
len=${#array_name[*]} #获取数组的长度,使用*,效果一样
#关联数组
declare -A arr=(["aaa"]="111", ["bbb"]="222", ["ccc"]="333") #定义关联数组,方法1
declare -A arr #定义关联数组,方法2,先声明再赋值
arr["aaa"]="111"
arr["bbb"]="222"
echo ${arr["aaa"]} #输出关联数组的元素
echo ${!site[@]} #输出数组所有的键,加了个叹号
echo ${!site[*]} #输出数组所有的键,效果一样
#遍历数组
for (( i=0; i<${#array[@]}; i++ ))
do
echo ${array[i]};
done
#echo使用方法:
echo -e "OK! \n" # -e 标识开启转义
echo "It is a test" > file #把显示结果写入文件,覆盖原有内容
echo "It is a test" >> file #把显示结果追加到文件末尾
echo '${name}' #单引号内的原样输出
echo `ls -l` #显示命令执行结果,使用反引号`
#算术运算:加+、减-、乘\*、除/、取余%
a=`expr 3 + 2` #也可以这样写:a=$[3 + 2]
a=`expr $a - $b` #也可以这样写:a=$[a - b]
a=`expr $a \* $b` #乘法,需用\*
#关系运算:等于:-eq、==; 不等于:!=、-ne; 大于:-gt; 大于等于:-ge; 小于:-lt; 小于等于:-le
if [ $a == $b ] …… #等于
if [ $a -eq $b ]…… #不等于
if [ $a -gt $b ]…… #大于
if [ $a -lt $b ]…… #小于
#逻辑运算:或:||,-o、 且:&&,-a、 非:!
if [ $a -lt 10 && $b -gt 15 ]…… #且运算
if [ $a -lt 10 -a $b -gt 15 ]…… #且运算
if [ $a -lt 10 || $b -gt 15 ]…… #或运算
if [ $a -lt 10 -o $b -gt 15 ]…… #或运算
if [ ! $a == 10 ]…… #非运算
#字符串的判断:-z:字符串长度是否为0、-n:字符串长度是否不为0、
if [ $str ]…… #字符串是否为空
if [ -z $str ]…… #字符串长度是否为0
#字符串的比较:= 、!=
if [ $str1 = $str2 ]…… #字符串是否 相等
if [ $str1 != $str2 ]…… #字符串是否 不相等
#文件检测(常用):-e是否存在、目录-d、文件-f、可读-r、可写-w、可执行-x
file="/var/1.txt"
if [ -e $file ]…… #是否存在
if [ -r $file ]…… #是否可读
if [ -w $file ]…… #是否可写
if [ -d $file ]…… #是否为目录
#使用test 取代 [ ],egg:
if test $a -eq $b … #相当于:if [ $a -eq $b ]
if test -e "/data/" … #相当于:if [ -d "/data/" ]
if [ $a -lt 10 && $b -gt 15 ] … #相当于:if test $a -lt 10 && $b -gt 15
#条件判断语句中,使用((...)) 取代[...],适用于变量比较,可以方便使用符号:> >= < <= ,取代字符:-gt -ge -lt -le,egg:
if (( $a > $b )) … #相当于:if [ $a -gt $b ]
if (( $a >= $b )) … #相当于:if [ $a -ge $b ]
if (( $a < $b )) … #相当于:if [ $a -lt $b ]
备注:if (( -e "/home/1.txt" )) 这样写是不可以的!只能用作变量比较!
expr用法:
echo `expr length $str_say` #获取字符串长度;
echo `expr substr $str_say 3 2` #字符串截取,后俩个数字表示:开始位置和截取长度,第一个字符的位置为 1;
echo `expr index $str_say "el"` #查找字符位置,非字符串,如果输入字符串,只会查找第一个字符,比如查找"ello",实际只是查找字符e;
#流程控制:
if (( $a > 1 ))
then
echo 'a>1'
fi
if (( $a > 1 ))
then
echo 'a>1'
else
echo 'a<=1'
fi
#for循环
for i in {1..10}
do
echo "i=" i
done
for (( i=1; i<10; i++ ))
do
echo "i=" i
done
#for循环:脚本命令
for i in `ls -l` #反引号里面是命令,也可以使用$(…),比如:for i in $( ls -l )
do
echo "i=" i
done
#while循环
while (( $i < 10 ))
do
echo $a
let i++
done
其他:
read name #从标准输入中读取一行,并把输入赋值给变量name;