Bash Shell编程简记

Shell编程简记

  经常在linux环境下开发的同学,难免要使用shell的一些命令或者编写小的脚本,我这里也总结和整理下,自己对Shell的理解和常用的一些shell脚本。

  按照目录分为如下3个节:

  1. shell的简介和常用的两种方式
  2. shell的语法,包括变量,循环,条件判断,运行终端命令
  3. 我常用的一些shell

Shell简介

  shell可以看作是一种命令脚本语言,属于解释性的语言。主要运行在linux, unix ,mac 等平台下。 具有的特点是:简单易懂,并且编写开发速度块。

语法也比较通俗易懂。

     我使用shell的地方,主要是包括两个方面

第一方面:在终端里,运行简单的linux的shell命令,查看和修改配置文件,查看环境变量,解压缩和上传和下载软件,切分文件,这方面主要使用的是一些常用的linux命令。

第二方面:就是编写简单的shell脚本,比如运行spark的脚本,执行批量的下载和压缩命令等。 这里就涉及到

 shell的一些语法和程序设计了,之前看shell的书籍,基于shell的程序设计,可以写一本书,我使用的主要是自己常用的一些脚本,所以比较简单。

 只涉及 shell的运行,shell的注释, shell命令行参数, shell中执行终端命令,shell循环, shell条件判断语句, 以及shell的函数。这几个。下面分别介绍。

Shell的运行

 shell脚本文件,一般以*.sh作为文件后缀。在文件内容中, 

行首以 # 开头(除#!之外)的是注释。#!是用于指定当前脚本的解释器

一般如下所示:

 #!/bin/bash
echo "hello world"

 脚本执行:一般可以为:

  sh  filename

  bash  filename ;

      ./ filename

 注意给脚本添加执行权限:chmod  +x hello.sh

  Shell的基本语法

    shell的语句,一般不需要分号; 只有一行有多个命令时,需要分号,比如:

 #!/bin/bash

  echo hello; echo there

 Shell的变量

   Shell中的变量只有两种类型,一种为字符串类型,一种为整形,不需要声明。 变量的赋值通过=赋值,如下语法: 

#!/bin/bash
 a="asbc"
 b=12
 echo $a
 echo $b

 

  变量一般通过$美元符号引用, $var或者 ${var}的形式

 shell中定义的变量一般作用域为全局变量,

从命令行传递到脚本的参数:$0,$1,$2,$3...$0就是脚本文件自身的名字,$1 是第一个参数,$2 是第二个参数,$3 是第三个参数

 shell的条件判断和循环

   shell中的if判断格式为:

  if 

  then 

  fi

  举例如:

  #!/bin/bash
   a="asbc"
   if a="asbc"
   then echo "a equals asbc"
   fi

 写的时候,一定要注意fi的结束标识符。

   shell中的条件判断, 可以使用

 一对方括号包含条件测试[ ] 或者 test 关键字;

  需要注意的是,方括号中的内容,两边必须有空格,具体的一个例子,如下图,个人感觉用 test 关键字比较好理解一些; 

 #!/bin/bash
  if [ $# -eq 0 ]
   then
       echo "no parameter "
   fi
   if test $# -eq 0
   then
     echo "use test formate no paramter "
   fi

   在bash shell中对文件的判断是非常方便的, 可以使用如下的关键字:

    -e  -f  -d  等。

   举例如: if test -e $filename 等

  对于字符串的判断,可以使用 =, == , != 等关键字符号

   对于整数,可以使用 -eq -ne, -lt 等关键字

  if [ "$a" -eq "$b" ]

   逻辑与 操作为  -a 

   逻辑或, 操作为  -o

 Shell 中的 循环语句

  shell中的循环包括 for , while 等形式,这里只介绍 for循环的使用

  for 循环形式包括如下三种形式:

#数字段形式
 

 for i in {1..10}
  do
  echo $i
 done

#详细列出(字符且项数不多)

for File in 1 2 3 4 5 
do 
    echo $File 
done

#对存在的文件进行循环

for shname in `ls *.sh`
do 
          name=`echo "$shname" | awk -F. '{print $1}'`           
          echo $name
done

  在第三种可以看到,bash shell 中可以嵌入awk的语法处理文字信息

shell中定义函数

  shell函数的定义可以有两种形式,

第一种形式:

   函数名(){
    command1
    command2
    ...
    commandN
    [ return value ]

 第二种形式:

 function 函数名(){
    command1
    command2
    ...
    commandN
    [ return value ]
}

 具体里的一个例子:

   function traversedir(){
       for element in ` ls $1 `
       do
           dir_or_file=$1"/"$element
           if test -d $dir_or_file
           then
              traversedir $dir_or_file
           else
             echo $dir_or_file
         fi
          #   echo $1"/"$element
       done
       for i  in {1..10}
       do
         echo $i
       done
  }

   

 Shell的函数调用

  函数名  参数, 举例如:

  tranversedir   "/home/wang/test"

 自己常用的几个Shell

1  遍历文件夹的脚本

 #!/bin/bash
 function traversedir(){
      for element in ` ls $1 `
      do
          dir_or_file=$1"/"$element
           if test -d $dir_or_file
           then
             traversedir $dir_or_file
          else
             echo $dir_or_file
          fi
          #   echo $1"/"$element
       done
   }
 root_dir='/Users/wanggang09/exercise/helloPython'
 traversedir $root_dir

 

2 spark的提交脚本

 

#!/bin/bash
num_executor=2
executor_memory=64G
src_file='hdfs://test_imei'
imei_file='hdfs:/sample_wifi_list_simular_2'
spark-submit --master yarn --deploy-mode client --py-files geohash.py  wifi_list_simular.py  $src_file $imei_file

 

  

  

posted @ 2017-08-14 16:42  xiaotuan123  阅读(321)  评论(0编辑  收藏  举报