shell脚本编程
shell元字符,转义符
单引号硬转义符
双引号软"${a}bc"
斜杠\转义符
软转义符和正常的变量一样,硬转义就直接将内部直接转为符号,\转义是将后面的一位符号转为普通符号
特殊变量
输入输出:read、echo
读入数组
以脚本形式读入数组
函数
IF判断语句
while
FOR
case
#!/bin/bash
read num
case $num in
1)
echo "1234"
;;
2)
echo "2345"
;;
3)
echo "3456"
;;
esac
数组操作
变量参数展开、字符串展开
第一二个是用于删文件时,用的变量来代替文件名,这个时候变量可能会在内存中丢失,则采用这种表达就不会误删
${pate:?error}
path=/home/byl/test/test/
find ${pate:?error} name “*.c” -type f | xargs rm -f
在用上述find命令删除文件时,当找不到路径时就会从当前路径下开始找,则这个时后就会有问题所以要找不到报警
第三个不仅可以判断变量C是否存在,如果不存在,还会将该命令执行结果置1执行失败,问号后面可以输出执行失败后要打印的信息
第四个是变量存在输出后面的内容
第五个可以将变量打印出来
用线性筛求10000之内的素数和
在for循环,while循环,if语句中凡是在(())、[[]]、[]、中出现的变量名等同于在C语言中的变量,不需要再加上${}来取变量值,下列程序已经是很好的说明
默认shell中声明的所有变量为全局变量,需要声明局部变量时必须要专门声明
if判断非整数用下面这种操作,关键是bc命令是判断算式表达式
let表达式
#!/bin/bash #一个#号是注释的意思再加一个!号就是调用后面这个程序来
#执行下面的shell指令
max=10000 #数组长度赋值
prime_count=0 #用来计数出现了多少素数
declare -a prime #声明一个数组
for (( i=1; i<=${max}; ++i ));do #将数组内的所有元素初始化为0
prime[${i}]=0 #这里的${i}可以直接写i
done
declare -a prime_list #声明一个所有素数的数组
for (( i=2; i <= max; ++i ));do #逐一列举合数
if [[ prime[${i}] -eq 0 ]];then #判断合数的标记位是否时素数
prime_count=$[prime_count+1] #shell中的++必须要这样
prime_list[prime_count]=${i} #如果是素数将该素数按顺序记录下来
fi
for (( j=1;j <=prime_count ; ++j ));do #列举素数
if [[ prime_list[j]*i -gt max ]];then #判断素数与合数的乘积是否超过了范围
break
fi
count=$[prime_list[j]*i] #将乘积标记为合数
prime[${count}]=1
if [[ i%prime_list[j] -eq 0 ]];then #判断该素数是否是合数的最小素数,如果是就不用再往下循环了
break
fi
done
done
sum=0
for (( x=1;x <= prime_count; ++x ));do
sum=$[sum+prime_list[x]]
done
echo ${sum}
查找最长字符串
#!/bin/bash
function _seekmoststr_() {
for each1 in `ls -A $1`;do
#echo ${each1}
if [[ -f ${each1} ]];then #-f判断该文件是否是普通文件
file ${each1} | grep -q "ASCII text" #查看该文件是否是ASCII文件
if [[ $? -eq 0 ]];then
eval `cat ${each1} | tr -s -c 'a-zA_Z' '\n' | awk '{t=length($1);if(t>l){l=t; s=$1}} END{printf("s=%s\nl=%d",s,l)}'`
#找到最长字符串s和长度l,并赋值给shell环境中的全局变量s和l
ln=`grep -n ${s} ${each1} | cut -d : -f 1 | head -n 1`
#找到最长字符串所在的行号,并赋值给shell环境中的全局变量ln
awk -v path1=`pwd` -v name=${each1} -v s=${s} -v l=${l} -v ln=${ln} 'BEGIN{ printf("%s/%s:%d:%s:%s\n",path1,name,l,s,ln) } ' >> /home/byl/test.out
#按照要求的格式将路径,长度,字符串,行号打印出来
fi
elif [[ -d ${each1} ]];then
cd ${each1}
eachpath1=`pwd`
_seekmoststr_ ${eachpath1}
cd ..
fi
done
}
#echo $0
#echo $#
currentpath=`pwd`
if [[ ! $# -eq 0 ]];then
for each in $@;do
if [[ -f ${each} ]];then
# echo "0 file"
_seekmoststr_ ${each}
elif [[ -d ${each} ]];then
cd ${each}
eachpath=`pwd`
#echo ${each}
_seekmoststr_ ${eachpath}
cd ${currentpath}
fi
done
else
_seekmoststr_ . #不传参时默认为当前目录
fi
#cat /home/byl/test.out
path2=`cat /home/byl/test.out | awk -F : '{t=$2;if(t>l){l=t; pat=$1; s=$3; ln=$4 }} END{printf("s=%s:%d:%s:%d",pat,l,s,ln)}' | cut -d / -f 4-`
echo ./${path2}
rm /home/byl/test.out
touch /home/byl/test.out