shell练习源码

源码1:shell基础(单引号,双引号,反引号)

#!/bin/sh
echo "This is echo command"

#This is a comment line

#This is a definition of a var
comment="This is comment"
#This is usage of a var
echo $comment


#单引号中的$将不会被当作变量计算,双引号中的$将会当作变量计算。

var="xidian university"

echo "This is $var"

echo 'This is $var'


#反斜线:通过前置反斜线,就可以引用任何元字符,包括$操作符。转义字符

echo "This is \$var"



#单引号:引用命令。将命令赋值给一个单引号的字符串。在以后就可以通过引用这个变量来执行这个命令。

result='ls -l'

$result

cd ..

$result

#反引号: `,一般位于键盘的左上角。同单引号不同的是,反引号中的命令会被首先执行,然后将结果赋值给一个变量,而不是保存命令本身。

#在testresult赋值的过程中,ls -l 命令已经执行,并将起结果保存在变量testresult中。所以,两次的echo $testresult将会输出同样的值
testresult=`ls -l`

echo $testresult

echo "--------------------------"

cd ..

echo $testresult

源码2:算数操作符使用(expr命令,let命令)

#!/bin/bash




#该程序使用 $* 可以引用所有的参数。这样用户可以使用不定数目的参数,对这些参数执行相同的操作。如下命令,则可以输出所有的输入文件
cat  $*
echo "-----------------------------"




#算数操作符的使用:
# 1) 使用expr命令:
#    可以使用操作符:+ - \* / %
#    在使用上述运算符前后需留有空白


i=1


#在使用的运算符前后要留空白
i=`expr $i + 5`
echo i=$i


#使用let命令:
#let命令和expr命令可以互换,let语句中不需要在变量前面加$符号,但必须将单个或带有空格的表达式用双引号引起来
let i=$i+10
echo i=$i
let i=i+20
echo i=$i

源码3:数组相关

#!/bin/bash

# 定义数组: data=(element1 element2 ....) 要特别注意,元素之间没有逗号。
#
# 在使用下标引用某一个数组变量的时候,通常要使用${data[i]} 即:使用{ }将要引用的变量括起来,以保证shell将会将data[i]当作一个完整的变量来解析。如果使用 $data[i]引用数组中的某一个变量, shell可能会将$data当作一个单独的变量来引用,而不能将 data[i]当作一个变量来引用.
#
# shell中和其他语言一样,数组名可以表示该数组中的第一个元素。

data=(masic007 hello world xidian university)

# $data[0] 这种引用,shell将会将data当作一个变量来解析,而不能将data[0]整体当作变量来解析
echo $data[0]

#以下引用可以正确的引用到数组中的值
echo data[1]=${data[1]}
echo data[2]=${data[2]}
echo data[3]=${data[3]}


#特殊的索引标识: * @
#两者都可以引用整个数组中所有元素。
#但是如果使用在双引号中,有所不同。*表示将原数组中的所有元素当作一个元素赋值给新数组,新数组只有一个元素。@表示将原数组的内容复制到新数组,生成的新数组和原数组内容相同
echo 使用data[*]打印:${data[*]}
echo 使用data[@]打印:${data[@]}

newdata_1=("${data[*]}")
newdata_2=("${data[@]}")

echo newdata_1 length: ${#newdata_1[*]}
echo newdata_2 length: ${#newdata_2[*]}


#数组的元素个数:${#name[*]}
echo The number of elements of array: ${#data[*]}


#数组某个元素的长度: ${#name[i]}
echo Length of the 2nd data: ${#data[2]}

源码4:简单的编译命令

#!/bin/bash

#取出参数1中的文件名,并去除后缀

basename=`basename $1 .c`
outname="$basename.out"

#如果该文件已经存在,则删除最终可执行文件
if(test -f $outname) then
	rm $outname
fi

echo
echo ----------build message------------
gcc -Wall -g $1 -o $outname
echo
echo ---------result message------------
if(test -f $outname) then
	echo build succesfully!!
else echo build failed !!
fi
echo

源码5:case语句相关

#!/bin/bash

#case结构:
# case 表达式 in
#      模式11 [|模式12] ...) 命令表1;;
#	   模式21 [|模式22] ...) 命令表2;;
#      .......
#	   *) 命令表n;;
# esac



#注意这里select将会对i进行"赋值"操作,所以使用的是i 而不是 $i
select i in 星期一 星期二 星期三 星期四 星期五 星期六 星期日 退出
do
{
#注意这里case结构中将i的值与所给出的模式进行"比较",如果符合某一模式则执行相应命令。比较操作需要取出i的值,则需要使用$i;
case $i in

	星期一 ) echo 今天是星期一,要加油呃 ;;
	星期二 ) echo 今天星期二,离周五还很早了 ;;
	星期三 ) echo 星期三 ;;
	星期四 ) echo 星期四 ;;
    星期五 ) echo 星期五 ;;
    星期六 ) echo 星期六 ;;
	星期日 ) echo 星期日 ;;
	退出   ) echo 退出; break;;
	*) echo 请重新选择;;
esac
}
done

源码6:函数定义

#!/bin/bash

#definition of the function

function cube()
{
    let result_1=$1*$1*$1
	return $result_1;
}

源码7:文件包含

#!/bin/bash

#通过source命令引用文件function.sh
source ./function.sh

echo please input the N:
read n

for i in 1 2 3 4 5 6 7 8
	do
		cube $i
		#通过预定义变量$? 获取函数返回值
		result=$?
		echo result=$result
		echo result_1=$result_1
	done

源码8:循环语句

#!/bin/bash


#shell提供了五种循环控制语句:while、until、for、forin、select;


# while command
# do 
#   command
# done
echo while测试
i=1
while(test $i -le 10)
do
{
	echo $i
#expr命令是一个表达式处理命令。如下所示,需要将该命令连同表达式放在反引号中。
	i=`expr $i + 1`
}
done




#until循环:与while循环判断条件相反。当且仅当command1命令结果为真时候退出循环,否则执行循环体 (do和done之间的语句) 
# until 
#   command1
# do
#   command2
# done
echo until 测试
i=1
until
[ $i -ge 10 ]
do
{
	echo $i
	let i=i+1
}
done






#for循环有两种风格:有" in list-values "; 没有" in list-values ";
#第一种:将由空格分隔的值列表中的每一个值依次赋给变量variable并执行循环体,当列表中的所有值都已经赋给variable一遍以后,循环终止;
# for variable [ in list-values ] 
# do
#   command
# done
echo for循环测试
for i in 2 4 6 8 10
do
{
	echo $i
}
done
#第二种:如果没有 " in list-values "那么系统会将该程序的位置参数当作list-values。将位置参数依次赋给变量variable,直到所有参数都已经赋过一遍以后才会终止; 
# for variable
# do
#   command
# done 
for i
do
{
	echo $i
}
done


#slect循环:
#使用select循环将会在屏幕上生成一个数字化的菜单,并提示用户进行选择,默认的提示符是:”#“。用户只需在提示符下输入对应菜单的数字,即可完成选择。
#如下所示,item-list列表是一个字符串组成的序列,当用户选择数字以后,将会将相应的菜单值赋值给string变量,并执行select循环体内容。
#select经常与cast一起使用,允许用户在菜单中选择,并基于选择执行相应的命令,当执行到break语句时候,将退出select结构
#select是一个循环体,可以使用break退出循环。
# select string in item-list 
# do
#   command
# done
echo selcet 测试
select i in 星期一 星期二 星期三 星期四 星期五 星期六 星期日
do
{
	case $i in
	星期一) echo 您选择的是周一;break;;
	星期二) echo 今天是星期二;;
	星期三) echo 您选择的是周三; break;;
	*) echo 今天既不是周一也不是周二更不是周三;;
	esac
}
done

源码9:read命令

#!/bin/bash


#该shell脚本主要用于测试shell程序设计中的read命令的使用,可以使用read命令对变量进行赋值
# 使用方式: read 变量1 变量2 变量3 .....
#
#read命令读取一个输入行,直到遇到换行符为止。
#遵循以下规则:
#多个数据或变量之间用空格分开
#若变量的个数等于输入数据的个数,则直接对应赋值
#若变量个数大于输入数据的个数,则没有输入数据的变量取空值
#若变量个数小于输入数据的个数,则将多余的数据赋值给最后一个变量
echo please input:name age grade
read name age grade
echo "name: $name"
echo "age : $age"
echo "grade: $grade"


#如果read读取的只有一个变量,那么输入行上面一整行数据都将赋值给该变量,无论该行上面是否有空格
echo plese input your university and province
read university
read province
echo university: $university
echo province : $province
#即:如果需要通过读入赋值的变量,可能的赋值包含空格,那么所在行的read命令不能同时读取其他变量,即该行read命令只读取该变量的值。因为shell会根据空格将输入的值进行分割。

源码10:递归调用

#!/bin/bash

function fb()
{
#如果$1为0或者1时候,返回值为1
	if [ $1 -eq 0 -o $1 -eq 1 ] 
		then
	        echo '$1' = 0 
			return 1
	else 
		fb `expr $1 - 1`
        local tmp1=$?
		fb `expr $1 - 2`
		local tmp2=$?
		local result=`expr $tmp1 + $tmp2`
		echo result=$result
		return $result
	fi
}

echo please input the n:
read n
fb $n
echo result=$?
		
源码11:测试命令test

#!/bin/bash

# shell测试命令: test 表达式
# 可以使用 [ 表达式 ]代替test命令,但是要注意在"["之后和"]"之前保留空格。


# 测试文件属性:
# -b file      如果为块文件,则表达式为真
# -c file      如果为字符设备,则表达式为真
# -r/w/x file  如果文件存在且为 可读/可写/执行 文件时候,表达式为真
# -s file      如果文件存在且为普通文件,并且长度大于零
# -d file      如果为目录,则表达式值为真
# -f file      如果文件为普通文件,则表达式为真
# -e file      如果文件存在,表达式为真


echo please input the filename:
read filename

if [ -e $filename ]; then
	echo $filename exist
	if [ -b $filename ]; then
		echo This is block file
	elif [ -c $filename ]; then
 	    echo This is character file
	elif [ -f $filename ]; then
   	    echo This is a normal file
	elif [ -d $filename ]; then
   	    echo This is a dirctory file
	fi
else
	echo $filename not exist
fi

源码12:文档类型检查

if [ -e $filename ] then
	echo $filename exist
elif [ -b $filename ] then
	echo This is block file
elif [ -c $filename ] then
    echo This is character file
elif [ -f $filename ] then
    echo This is a normal file
else [ -d $filename ] then
    echo This is a dirctory file
fi



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值