shell编程基础知识

熟悉shell小脚本的一些基本语法,对我们的系统运维和控制非常有用,下面散仙介绍一些比较有用的知识.


1,如何向脚本里传参并打印,写一个小脚本测试传参,a,b,c并打印出来,注意接收来自命令行传入的参数,第一个参数用$1表示,第二个参数$2表示,。。。以此类推。注意:$0表示脚本文件名。另外一个在shell编程中经常用到 的是“$@”这个代表所有的参数,。你可以用一个循环来遍历这个参数。如果用java来类比的话,可以把$@看作是man函数中定义的那个数组


echo $1

echo "上面是输出,下面是测试"


for arg in $@

do

echo $arg

done

输出如下:
a
上面是输出,下面是测试
a
b
c

遍历根目录下的所有文件的代码
for  filename in *
do
echo  $filename
done


//遍历并拷贝文件至一个新的目录pp下
for  filename in *
do

[ -f $filename ] && cp $filename /root/pp

echo  $filename

done



1、条件测试操作:
需要在Shell脚本中有选择性地执行任务时,首先面临的问题就是,如何设置命令执行的条件?
在Shell环境中,可以根据命令执行后返回状态值来判断该命令是否成功执行,当返回值为0是表示成功执行,否则(非0值)表示执行失败。用于特定条件表达式的测试时,可以使用Linux系统中提供的专用工具——test命令、
使用test测试命令时,可以有以下两种形式。
test       条件表达式
【 条件表达式 】
这两种方式的作用完全相同,但通常后一种形式更为常用,也更贴近编程习惯。需要注意的是,方括号“[”或者“]”与条件表达式语句之间至少需要有一个空格进行分隔。
根据需要判断的条件内容不同,条件操作也不同,最常用的条件主要包括文件状态测试,比较整数值大小,比较字符串,以及同时判断多个条件时的逻辑关系,下面将分别进行讲解。以下主要采用方括号的测试形式。
1.1、测试文件状态
文件状态测试是指根据给定的路径名称,判断该名称对应的是文件还是目录,或者判断文件是否可读,可写,可执行等。根据判断的状态不同,在条件表达式中需要使用不同的操作选项。

if判断:
?b当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
-eq   等于
-ne   不等于
-gt   大于
-lt   小于
-le   小于等于
-ge   大于等于
-z    空串
=     两个字符相等
!=    两个字符不等
-n    非空串
-e filename     如果 filename存在,则为真
-d filename     如果 filename为目录,则为真
-f filename     如果 filename为常规文件,则为真
-L filename     如果 filename为符号链接,则为真
-r filename     如果 filename可读,则为真
-w filename     如果 filename可写,则为真
-x filename     如果 filename可执行,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真
filename1 -ot filename2 如果 filename1比 filename2旧,则为真
-z string               如果 string长度为零,则为真
-n string               如果 string长度非零,则为真
string1 = string2       如果 string1与 string2 相同,则为真
string1 != string2      如果 string1与 string2 不同,则为真
num1 -eq num2           等于
num1 -ne num2           不等于
num1 -lt num2           小于
num1 -le num2           小于或等于
num1 -gt num2           大于
num1 -ge num2           大于或等于


1.4:逻辑测试:
逻辑测试是指同时使用的两个(或多个)条件表达式之间的关系。用户可以同时测试多个条件,根据这些条件是否同时成立或者只要有其中一个条件成立等情况,来决定采取何种操作。逻辑测试可以使用的操作选项如下。
>  &&:逻辑与,表示前后两个表达式都成立时整个测试结果才为真,否则结果为假。在使用test命令形式进程测试时,此选项可以改为" -a"。
>   ||:逻辑或,表示前后两个条件至少有一个成立时整个测试结果即为真,否则结果为假。在使用test命令形式进行测试时,此选项可以改为"-o“。
>  !:逻辑否,表示当指定的条件表达式不成立时,整个测试命令的结果为真。
在上述逻辑测试的操作选项中,”&&“和”||“通常也用于间隔不同的命令操作,其作用是相似的。同时使用多个逻辑运算操作时,一般安装从左到右的顺序进行测试。

多重if语句例子:

#! /bin/bash



#接受外界传参,注意加x是为了防止输出空时,报的异常



if [ $1x = "a"x ] ;  then
   
   echo "it is a";

elif [ $1x = "b"x  ] ; then

   echo "it is b";

elif [ $1x = "中国"x ]; then
   echo "输入的是中国";

else
 
   echo "nothing";

fi


if单独测试:
if [ 1 -gt  2   ] ;then

   echo "1 > 2 ";
else

   echo " 1 < 2 ";

fi



for循环测试:


case语句小例子:

case $1 in

1|one) echo "out put is 1 or one" ;;

2|two) echo "out put is 2 or two" ;;

3)   echo aaa
     echo bbb
     echo ccc;;

*)   echo "this is non match";;


esac





统计当前登录系统用户数
who | wc -l

统计行数: wc -l  txt.file



猜你喜欢

转载自qindongliang.iteye.com/blog/2054154