源码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