shell 编程入门,知识点整理一

大家好:今天给大家介绍一下shell:

1.shell认识:

shell 本身是一个命令解释器,类似于python解释器,它可以解释Linux命令,我们可以把Linux命令写入shell脚本中,通过运行这个脚本,来执行一系列Linux命令。这就是shell编程。

由于历史原因shell有很多种,常用的shell 有sh、bash

查看shell种类: vim  /etc/passwd  #最后一列显示的是shell 的种类

shell注释:  # 开头

Linux终端执行shell脚本实质是:shell会fork 一个子进程,并exec这个程序,执行完毕后会回到终端(内建命令不会创建新的进程,which查不到的命令,没有单独的man手册)

查看内建命令:man bash-builtins #内建命令不会创建新的进程,但是也有退出码(Exit Status) 0 表示成功,1表示失败

查看上一个程序的退出码:echo $?  

注意:当写好shell 脚本后,怎样去执行呢?

  方法一:chmod a+x  test.sh #为脚本增加执行权限

      ./test.sh #执行脚本

  方法二: /bin/sh  test.sh  #指定解释器 去 执行脚本 ,脚本名称作为解释器的参数  类似于用python 解释器去执行python脚本一样 ;  python  脚本名

  方法三:source test.sh   或者 .   test.sh 

如果在终端一次执行对个Linux 命令:

比如:(cd ..; ls-l) # 多个命令用分号隔开,会fork 一个子进程 运行结果不会影响到终端

   cd .. ; ls -l # 多个命令分号隔开,会影响到终端

2.变量:

命名规范:由全大写字母加下划线组成。

环境变量:printenv 可以查看环境变量  环境变量可以从父进程传给子进程

本地变量:set 可以查看所有变量 包括本地变量和环境变量,变量定义等号两边不能有空格;

     export 本地变量  #将本地变量导入环境变量。 

     unset 变量  #删除变量

     所有的变量都是字符串

     echo $SHELL #查看当前shell 类型

3.文件名替换:[] * ?

  类似正则表达式去匹配文件名

  * :0个或者多个任意字符

  ? :匹配一个任意字符

  [a-z] :匹配 字符集中的任意一个字符的一次出现

4.命令替换:$()或 ` `

  将一个命令的结果赋值给另外一个变量

  DATE=`date` 或 DATE=$(date)

5.算数替换 :$(()) 、$[]

  VAR=45

  echo $(($VAR+45)) #结果为90 等价于 echo $[$VAR+45]

  $[base#n] :其中 base 表示进制, n表示按照base 进制解释 

  echo $[2#10+11] #以二进制去解释10 就是2,加上11 ,结果就是13

6.转义字符:\

  touch \$\ \$\ #创建 名为 \$\ \$\的文件

  创建一_开头的文件: touch ./-hello 或者 touch --  -hello

  续行: \ 后面敲回车

7.单引号:用于保持字符的字面值

8.双引号:允许变量扩展 

  VAR=45

  echo "$VAR" #结果为45

  echo  '$VAR' #结果为$VAR

9.条件测试:test 、[ ]

  VAR=2

  test $VAR -gt 1 #结果为0  0 表示真,1 表示假

  [ $VAR -gt 5 ] #结果为1 

常见的测试:

  [ -d DIR]  #测试DIR是否为一个目录

  [ -f FILE ] #测试FILE 是否为一个文件

  [ -z STRING ] #测试STRING的长度是否为零

  [ -n STRING ] #测试STRING 的长度是否非零

  [ STRING1 = STRING2 ] #测试两个字符串是否相同

  [ STRING1 != STRING2 ] #测试字符串是否不同

  [ 变量1 OP 变量2 ] #OP可以为 -eq (等于)、-ne(不等于)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)

  !:逻辑非 ; -a:逻辑与 ;-o :逻辑或

10.分支语句

 if分支:

if [ -f ~/.bashrc ];then  #如果条件成立  执行then 后面的语句
    . ~/.bashrc
fi

 if -else分支:

if [ -f /bin/bash ]
then echo "/bin/bash is a file" #语句分开写不用加分号
else echo "/bni/bash is NOT a file" #else分支
fi

if :;then  echo "alwalys true"; fi  #多个语句写在一行要加分号 冒号表示总是真的,什么相当于True

if -else-if 分支:

echo "It is morning? Please answer yes or no."
read YES_OR_NO #从屏幕中读取值存于变量中
if [ "$YES_OR_NO" = "yes" ];then
    echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ];then
    echo "Gooding afternoon!"
else
    echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
    exit 1  #程序退出码
fi
    exit 0 #程序退出码

 && 相当于 if ..then   等价于 -a

 || 相当于 if not then   等价于-o

case分支:

#! /bin/sh

echo "It is morning? Please answer yes or no."
read YES_OR_NO
case "$YES_OR_NO" in
yes|y|Yes|YES)
    echo "Gooding Morning!";;
[nN]*)
    echo "Gooding afternoon";;
*)
    echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
    exit 1;;

esac
exit 0

11.循环语句:

 while 循环:

echo "Enter password:"
read TRY
while [ "$TRY" != "secret" ];do
    echo "Sorry, try again"
    read TRY
done

for 循环:

for FRUIT in apple banana pear;do
    echo "I like $FRUIT"
done

  

  

猜你喜欢

转载自www.cnblogs.com/yanhonghong/p/11628419.html
今日推荐