Shell脚本

管理整个硬件的是核心(kernel),用户通过shell来与核心沟通,让核心达到我们所想要的目的。

而shell是人类语言与内核直接的桥梁,通过它才能控制内核,进而控制硬件。


linux默认的shell是/bin/bash shell
它的主要功能有:命令记忆、命令补全、命令别名、通配符等。

内部命令和外部命令的区别:

linux命令有内部命令和外部命令之分。内部命令实际上是shell程序的一部分,其中包含的是一些比较简练的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统

加载运行时shell就被加载并驻留在系统内存中。外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以它们包含的程序量也会很大,在系统加载时并不随系统一起被加载

到内存中,而是在需要时才将其调进内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell 程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执


内部命令是指shell中的内置指令。并要需要安装就可以使用,默认情况下bash共有50几个内置命令。
而外部命令与其相反,并不属于shell本身。并不一定有的系统中就有。而且有的可以通过软件包安装得到


shell脚本就是将一些命令汇总起来,一次执行,不需要编译。

脚本的注意事项:

1.如果读取到一个enter(CR),就尝试开始执行该行命令;
2.如果一行内容太多,则可以使用\enter来扩展至下一行;
3.#是行注释;
4.#!/bin/bash,用来声明这个脚本所使用的shell名称,以便在执行该脚本时,加载相关shell的环境设置文件


数值运算可以使用 declare -i total=$no1*$no2 也可以使用
var=$(($no1*$no2))


$? 用于检测上一次命令执行后的状态

为0时,表示true,大于0时表示false

echo $? 可以这样读取


test 命令用于检测文件及相关属性是否存在,返回为真或假

test -e sh01.sh //判断文件名是否存在(如果该文件存在,返回true,不存在返回false)
test -f sh01.sh//判断文件名是否为文件;
test -d sh01.sh//判断是否为目录(如果是目录返回true,如果不存在,或者不是目录则返回false)
test file1 -nt file2 //判断file1是否比file2新,new than
test file1 -ot file2 //判断file1是否比file2旧
test file1 -ef file2//判断是否为同一文件

test str1 = str2 //比较两个字符串是否相等,等号两边要有空格
test str1 != str2 //比较是否不同

test -z string //判断该变量是否设置,若没设置则为true,例如 [ -z "$cxm3" ] cxm3变量没设置,返回true,[ -z "" ]字符串为空,同样返回true

test -n string //这个和上面的相反,没有设置返回false,-n可以省略

使用test的地方,也可以使用[]中括号
例如:[ -e sh01.sh ]
但必须注意,
1)每个组件必须使用空格隔开,且中括号内的变量最好使用双引号来设置
2)中括号比较字符串相等时,要用两个=号,例如:[ "$cxm1" == "$cxm2" ],其实用一个等号也可以,但习惯上两个等号是逻辑判断;
3)中括号内还可以输入多个条件,用-o连接,表示或的意思 [ "$y" = "y" -o "$y" = "Y" ]


可以在脚本后面直接加参数,它们的对应关系是这样:

/etc/init.d/zxesb start restart stop
$0 $1($@) $2 $3

$1可以提取第一个参数的值($1可以用$@替换)


echo -n 参数表示它后面的命令跟在这一行之后显示,不是另起一行显示,例如

echo -n hello
echo world
显示为 hello world



条件判断:

if [] || [];then

echo "OK"

elif []; then
echo "en"

else
echo "hao"
fi

注意,条件判断以分号结束


case...esac判断,例如:

case $1 in

"hello")
echo "sdfs"
;;
"")
echo "sdfess"
;;
*) //如果变量内容不是上面所有的内容,就执行下面的语句
echo "sdfs”

;;

esac

上面就是例子
例如:
case "$ans" in
y*|Y*) 表示以y或Y开头
return 0
;;
*)
return 1
;;
esac


脚本中变量的获取,有2种方式:
1.直接获取式(在执行脚本命令时,通过其后面的参数获取,大多数/etc/init.d/程序都是这样);
2.交互式(通过read命令);


定义函数的格式为:
函数名()
{
命令1
. . .
}
或者
函数名(){
命令1
. . .
}
两者方式都可行。如果愿意,可在函数名前加上关键字f u n c t i o n,这取决于使用者。
f u n c t i o n 函数名()
{ ...
}
可以将函数看作是脚本中的一段代码,但是有一个主要区别。执行函数时,它保留当前
shell和内存信息。此外如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的
shell,因而去除所有原脚本中定义的存在变

函数的设置一定要在程序的最前面,这样才能在执行时找到可用的程序段

在函数里面,也可以使用 $1、$2等来引用函数名称后面的变量,例如:
fname 1,这个1就可以通过$1来引用
调用函数时,直接写函数名称不加括号,例如
fname;
即可调用函数


循环有3种

while [] //但条件满足时
do
程序段
done

until []//但条件不满足是
do
done


for((int=1;i<=100;i=i+1))
do
done

还有一种:
for animal in dog cat elephant
do
echo "sdfsf"
done
每次循环,aninal分别取dog、cat、elepant等

filelist=`ls $dir'
for filename in $filelist
do

done

例1:
num=0

for((i=0;i<100;i++))
do
num=$((num+i))
#或者 num=$(($num+$i))
done

是数字类型,在计算时可以加$,也可以不加

例2:
Rosetta_path=/home/test/test.txt
if [ -e $Rosetta_path ] ;then //这个地方可以对变量加双引号,也可以不加
mv $Rosetta_path $dirnameBak
Log "[~3.Backuping old file is successful.$Rosetta_path~]"
else
Log "[~3.There is no corresponding the file.$Rosetta_path~]"
fi
判断文件是否存在,存在返回true,不存在返回false


例3

判断数值类型是否大于10,大于返回true,小于等于返回false
if [ $FILENUM -gt 10 ]; then //这个地方可以对变量加双引号,也可以不加
Log "[~2.Clear very old files aready.~]"
else
Log "[~2.There are no very old files.~]"
fi

-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于


但建立一个新的文件或目录时,它的默认属性是什么呢?这与umask有关

查看方式有2种:
umask //以数字方式查看,第一组是特殊权限用的,暂不管他
umask -S//以字符方式查看

在默认权限上,文件和属性是不一样的,文件没有有x权限,目录有x权限


umask以数字方式显示时,表示默认权限需要减掉的权限。当要去掉w时,就输入2;要去掉r权限就输入4;要去掉rw权限就输入6;

如果umask为022
建立文件时:文件所有者为默认权限rw,没有减掉;用户组减掉w权限(默认也是rw);其他用户减掉w权限(默认也是rw);
建立目录时:目录所有者为默认权限rwx;其他和上面一样了,用户组和其他用户默认也是(默认也是rwx)

如果想改变默认的权限,直接在umask后面写上要数字即可,例如:
umask 002
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值