不到500行代码学完shell基本语法知识

#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}"






  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值