常用linux shell脚本记录

时间:2022-11-07 00:12:03

遍历目录下所有的文件是目录还是文件

for file in ./*
do
    if test -f $file
    then
        echo $file 是文件
    fi
    if test -d $file
    then
        echo $file 是目录
    fi
done
filelist=`ls ./proto`
echo $filelist
 
for  file in $filelist;do
         #不能有判断if [-f $file ] ,为什么?因为文件是在当前目录的proto目录下,我们filelist输出的是文件列表,没有带路径,-f x.proto x.proto不在当前目录,肯定为false,if永远为假,加上路径才能为true,if [ -f ./proto/$file ];then 这样就可以了。

                #protoc -I=proto --cpp_out=cpp/ proto/ClientGate.proto
                 protoc -I=proto --cpp_out=cpp/ proto/$file
               
        #       protoc -I=proto -olua/$(basename $file .proto).pb  proto/$file

done

~                                                                                                                              
~          protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto



 在shell中的case结构与C/C++中的switch结构是相同的. 它允许通过判断来选择代码块中多条路径中的一条. 它的作用和多个if/then/else语句的作用相同, 是它们的简化结构, 特别适用于创建菜单. 
case  "$variable"  in   
  
 "$condition1"  )  
 command...  
 ;;  
  
 "$condition2"  )  
 command...  
 ;;  
  
esac  
Note     

 对变量使用""并不是强制的, 因为不会发生单词分割. 
        * 

          每句测试行, 都以右小括号)来结尾. 
        * 

          每个条件判断语句块都以一对分号结尾 ;;. 
        * 

          case块以esac (case的反向拼写)结尾. 

#!/bin/sh

case $1 in
    start|begin)
        echo "start something"
        ;;  
    stop)
        echo "stop !!"
        ;;  

    *)  
        echo "ignorant"
        ;;  

esac

 



shell中函数调用
说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法。
 
一、Shell中函数的定义
为了方便程序和管理和模块化并减少代码的重复,函数的确是一个好东西。而Shell中函数的定义有两种方法,如下:
function fname()
{
statements;
}
fname()
{
statements;
}
注意,()内是没有参数的,它并不像C语言那样,在()里可以有参数。
 
那大家可能就郁闷了,函数调用或多或少总是会需要一些参数,那么这些参数要怎么传递进来呢?其实参数传递方 式为:fname;(不需要传递参数)或fname agr1 arg2(需要传递两个参数);
 
二、自定义函数的例子
不知道大家的情况如何,反正一开始我就觉得很别扭,因为在C语言中,例如我定义一个函数int cmp(int a, int b),那么我就会在函数中使用到函数头中声明的变量a和b,而在Shell中却没有定义参数,那我的函数又需要用到这两个参数,怎么办好呢?下面就用一个例子来说明好了。
#!/bin/bash

function LoopPrint()
{
    count=0;
    while [ $count -lt $1 ];
    do
            echo $count;
            sleep 1 let ++count; 、、这里不能是++$count,否则无穷循环 done
    return 0; 
}

read -p "please input the times of print:" n;
LoopPrint $n; 
                             
先来说说这个程序的功能吧,就是输入一个数字n,然后从0开始每隔1秒输入一个数字,直到输出n-1为止。首先,程序会要求你输入一个数学,然后调用函数来进行输出的功能。
 注意注释1的那一句,里面有一个变量$1,大家应该还记得调用函数时参数的传递方式,即fname agr1 arg2,这里的$1就是表示第一个参数,依此类推,$2就是第二个参数,$3就是第3个参数,$n就是表示第n个参数。 所以$1就是变量n的值

 特别注意,传递参数时,(这个例子中)一定要写成LoopPrint $n;而不能写成LoopPrint n。为什么?例如你输入的是20,则n的值($n)为20,前者表示的是把n的值,即20传递给函数LoopPrint,而后者则表示把字符n传递给函数LoopPrint。这点与在静态语言中的函数参数传递是很不同的,因为在Shell中变量的使用并不需要先定义,所以要使用变量,让Shell知道它是一个变量,并要传递它的值时,就是用$n,而不能直接用n,否则只把n当作一个字符来处理,而不是一个变量。c

 

Linux常用Shell脚本珍藏