#shell基本知识,入门级语法编程知识,顺着流程一边看一边跟着打
#!/bin/bash
echo "hello world"
#打印目录下的所有文件
for file in `ls /home/chongge`; do
echo "this file is ${file};"
done
#myname="chongge"
#echo "myname: ${myname}";
#myname="bb"
#echo "myname: ${myname}"
#myID="123456"
#echo "myID ${myID}"
#readonly myID
#myID="abcdef"
#echo "myID ${myID}"
#变量定义及使用
echo "unset command"
unset myname
echo "test myID unset:${myname}"
strsinglequote='this is a string'
person_name='qingkuai'
#后面还带了一个换行符
strdoublequote="hello I know are name\n";
echo ${strsinglequote}${person_name}
varcustorm="${strsinglequote} ${strdoublequote}"
echo ${varcustorm}
#数组基本知识
array_name=(b name c def)
echo ${array_name[@]}
length=${#array_name[@]}
echo ${array_name[2]}
echo ${length}
#declare -a array_name
#array_name[0]=${strsinglequote}
#array_name[1]=${varcustorm}
#echo ${array_name[@]}
echo "Shell 传递参数示例"
echo "执行的文件名: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "使用\$*演示"
for i in "$*"; do
echo $i
done
echo "原生bash不支持简单的数学运算,但是可以通过其他命令"
echo "实现,例如awk和expr expr最常用,expr是一款表达式计"
echo "工具,使用它能完成表达式的求值操作"
var=`expr 2 + 2`
echo "和为${var}"
a=10
b=20
echo "加法:`expr ${a} + ${b}`"
echo "乘法: 'expr ${a} \* ${b}'"
echo "取余: `expr ${a} % ${b}`"
a=${b}
echo "赋值: ${a}"
echo "下面的if表达式中间一定要有空格"
if [ ${a} == ${b} ]
then
echo "a等于b"
fi
if [ ${a} != ${b} ]
then
echo "a 不等于b"
fi
echo "乘号(*)前面必须加(\)才能实现乘法运算"
echo "******************"
echo "关系运算符"
a=10
b=20
echo "-eq 两个数是否相等"
if [ $[a] -eq ${b} ]
then
echo "a等于b"
else
echo "a不等于b"
fi
aS="abc"
bS="abc"
echo "字符串比较方法"
if [ ${aS} == ${bS} ]
then
echo "字符串a等于字符串b"
else
echo "字符串a b不祥等"
fi
echo "-ne 检查两个数是否相等,不相等返回true"
if [ $[a] -ne ${b} ]
then
echo "a不等于b"
else
echo "a等于b"
fi
echo "-gt 检查左边的数是否大于右边的,是就返回true"
if [ ${a} -gt ${b} ]
then
echo "a大于b"
else
echo "a不大于b"
fi
echo "-lt 检查左边的数是否小于右边"
if [ $[a] -lt ${b} ]
then
echo "a小于b"
else
echo "a不小于b"
fi
echo "-ge 检查左边的数是否大于等于右边的"
echo "-le 检查左边的数是否小于等于右边的"
echo "*********************"
echo "布尔运算符"
echo "! 非运算"
echo "-o 或运算"
echo "-a 与运算"
a=10
b=20
echo "! 运算符演示"
if !([ ${a} -eq ${b} ])
then
echo "对a等于b求反,即!(${a}==${b}) 返回true"
else
echo "对a等于b求反,即!(${a}==${b}) 返回false"
fi
echo "-a 与运算符演示"
if [ ${a} -lt 100 -a ${b} -gt 15 ]
then
echo "a 小于100 或 b 大于15 ,返回true"
else
echo "a 小于100 或 b 大于15 ,返回false"
fi
#逻辑运算符
# "&&" 逻辑的AND
# "||" 逻辑的or
# 使用方法和效果和布尔运算符应该一样
#使用方法略有不同
#-s file 文件是否为空(文件大小是否大于0)
#-e file 检查文件(包括目录)是否存在
echo "文件操作符"
file="/home/chongge/service.c"
if [ -e ${file} ]
then
echo "${file} 存在"
else
echo "${file} 不存在"
fi
if [ -r ${file} ]
then
echo "${file} 可读"
else
echo "${file} 不可读"
fi
if [ -w ${file} ]
then
echo "${file} 可写"
else
echo "${file} 不可写"
fi
if [ -d ${file} ]
then
echo "${file} 是目录"
else if [ -f ${file} ]
then
echo "${file}是个普通文件"
fi
fi
#测试输出转义字符
echo "\"It is a test"
#显示结果定向至文件
outputfile="/home"
if [[ -e ${outputfile} && -w ${outputfile} ]]
then
echo "It is a test" > test.file
else
echo "输入文件不存在或者不可写"
fi
#显示当前日期
date=`date`
echo ${date}
#printf命令使用,基本上c的printf使用方式相同
#里面的格式控制符基本上和c相同
printf "%d, %s\n" 1 冲哥
#shell test 命令用于检查条件是否成立,可以进行数值,字符和文件三个方面的测试
#其中数值,字符和文件的判断都适用于通用运算符
#使用方式也很简单
test 1 > 2 ;
#输出上面的结果
echo $?
ac=10
bc=20
if test ${ac} == ${bc}
then
printf "%s\n" ac等与bc
printf "ac: %c, bc: %c\n" ${ac} ${bc}
#也可以直接用 ">"符号
elif [ ${ac} -gt ${bc} ]
then
printf "%s\n" ac大于bc
printf "ac: %c, bc: %c\n" ${ac} ${bc}
#也可以直接使用 "<"符号
elif [ ${ac} -lt ${bc} ]
then
printf "%s\n" ac小于bc
printf "ac: %c, bc: %c\n" ${ac} ${bc}
fi
ac='b'
bc='a'
if test ${ac} == ${bc}
then
printf "%s\n" ac等与bc
printf "ac: %c, bc: %c\n" ${ac} ${bc}
elif [ ${ac} > ${bc} ]
then
printf "%s\n" ac大于bc
printf "ac: %c, bc: %c\n" ${ac} ${bc}
elif [ ${ac} < ${bc} ]
then
printf "%s\n" ac小于bc
printf "ac: %c, bc: %c\n" ${ac} ${bc}
fi
#循环for演示
a=10
b=20;
c=`expr ${a} + ${b}`
echo ${c}
sum=0
#array={1,2,3,4,5,6,7,8}
for index in 1 2 3 4 5 6 7 8
do
printf "current num:%d\n" ${index}
sum=`expr ${sum} + ${index}`
done
echo "求1加到8的和:${sum}"
#while循环演示
sum=0
index=1
while(( ${index}<=8 ))
do
sum=`expr ${sum} + ${index}`
# index=`expr ${index} + 1`
#下面使用一种更加简便的方式自加1
let "index++"
done
echo "while 方式求1加到8的和:${sum}"
#break 演示
sum=0
int=1
while true
do
sum=`expr ${sum} + ${int}`
# int=`expr ${int} + 1`
#下面使用一种更加简便的方式自加1
let "int++"
echo "int的值: ${int}"
#尽量严格的按照数据类型的比较方式,这里使用 ">"会直接第一次就跳出循环
if [ ${int} -gt 8 ]
then
echo "循环中断"
break
else
echo "循环继续"
continue
fi
done
echo "添加break while 方式求1加到8的和:${sum}"
#break 可直接跳出多重循环
#打印乘法口诀
i=1
while true
do
j=1
while true
do
ji=`expr ${i} \* ${j}`
printf "${i}*${j}=%d " ${ji}
let "j++"
#尽量严格的按照数据类型的比较方式,这里使用 ">"会直接第一次就跳出循环
if [ ${j} -gt ${i} ]
then
echo "循环中断"
#指定跳到第几层循环,如果为2则直接跳出第二层循环,即循环结束
break 1
fi
done
printf "\n"
let "i++"
if [ ${i} -gt 9 ]
then
break
fi
done
echo "添加break while 方式求1加到8的和:${sum}"
#unit 循环刚好和while相反,格式如下,执行命令至条件为真时停止
# unit condition
# do
# command
# done
#case命令示例,case命令多了esac(刚好与case相反)结束
array=(1 2 3 4 5)
for i in ${array[@]}
do
echo ${i}
case ${i} in
1)
echo 1
;;
2)
echo 2
;;
3)
echo 3
esac
done
#shell函数调用
#示例从标注输入读入加法,然后输出
funWithReturn(){
echo "该函数进行加法"
echo "请输入第一个数字:"
read aNum
echo "输入第二个数字:"
read anotherNum
echo "两个数字分别为 ${aNum} 和 ${anotherNum}"
return $((${aNum}+${anotherNum}))
}
funWithReturn
echo "输入的两个数字之和为$?"
#函数返回值在调用该函数后可通过 $?来获得
#函数参数,通过$n的形式来获取参数的值,n代表1,2,...
funWithParam(){
echo "first param: ${1}"
echo "second param: ${2}"
echo "10th param: ${10}"
echo "total param counts: $#"
echo "output as a string: $*"
}
funWithParam 1 2 3 4 5 6 7 8 9 10
#下面是一些需要特殊处理的字符
# $# 传递到脚本的参数个数
# $* 以一个单字符串显示所有
# $$ 脚本运行的当前进程ID号
# $! 后台运行的最后一个进程的ID号
# $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
# $- 显示shell使用的当前选项,与set命令功能相同。
# $? 显示最后命令的退出状态,0 表示没有错误,其他任何值表明有错误
#shell 重定向
#将当前登录名信息吃重定向到users文件中,如果文件不存在会新建,然后再重定向
file="/home/chongge/users"
echo ${file}
rm ${file}
if [ -e ${file} ]
then
echo "users 文件存在"
else
echo "user 文件不存在"
fi
who > users
if [ -e ${file} ]
then
echo "users 文件存在"
else
echo "user 文件不存在"
fi
cat users
echo "添加一行测试到users中" > users
cat users
echo "添加一行测试到users中" >> users
cat users
#sh文件包含
#shell也可以包含一些共用的代码的独立的文件
#引用外部创建的测试文件
. /home/chongge/test2.sh
echo "引用了test2.sh 中的url: ${url}"