shell编程笔记

shell就是以文件形式运行一些shell命令的脚本。

sh文件运行方式

  • bash aa.sh

  •  source aa.sh

  •  ./aa.sh 如果以此种方式执行脚本,这个脚本必须要有可执行权限

    chomd a+x aa.sh 给文件赋权 执行权限

脚本第一行

  • #!/bin/sh

  • #!/bin/bash

  • #!/usr/bin/env bash

python 的第一行是!/usr/bin/env python

第一行的注释,电脑在运行脚本时,会解析。用来表示默认的脚本命令

第一个shell脚本

shell.sh 文件内容如下:

#!/bin/bash   
a=10    
echo $a
echo 'hello$a'
echo I am `whoami`
echo "good afternoon$a"

 执行文件 bash shell.sh

执行结果如下:

10
hello$a
I am ftpuser
good afternoon10

 

解析:

定义变量的时候  a=10  等号前后不能有空格

引用变量使用 $ 符号

单引号、双引号、反引号的区别:

单引号:原样输出。可以看出以上代码    echo 'hello$a' 输出结果为hello$a

双引号:双引号里边的内容会读取变量的值

反引号:反引号里边的内容会被解释成linux命令。如上命令 `whoami` 是linux命令

 

变量

 变量种类

  1. 位置变量:$1  $2    ......$n  表示第n个参数的值
  2. 预定义变量 :  主要是$的使用

    1.     shell.sh 文件内容

      # $的使用
      echo $0
      echo '$1的值'$1
      echo '$2的值'$2
      echo '$#的值'$#
      echo '$*的值'$*
      echo '$@的值'$@
      echo '$?的值'$?
      echo $(whoami)
      echo $((1+2))
      

        

        执行shell文件

        bash shell.sh  12 23 aa  传入3个参数

      执行结果:

      shell.sh
      $1的值12
      $2的值23
      $#的值3
      $*的值12 23 aa
      $@的值12 23 aa
      $?的值0

      ftpuser
      3

       

      总结: $0 是指文件名称

      $1 是指传入的第一个参数的值

      $*、$@ 是指输出所有传入参数的值

      $?是指上个程序执行的结果,成功为0,不成功为其他。

      $#  是指参数个数

      $(命令)是指执行括号里的命令 相当于  `whoami`

      $((表达式))  计算表达式的值,需要用2个小括号

          

  3. 环境变量:

定义环境变量:export x=aa

要取文件里的环境变量的值,需要使用source来执行文件,然后echo $x才会出来结果

#环境变量的使用
export X=aaa

  执行文件:

source shell.sh

执行完后打印X的值:

echo  $X  会输出aaa的值。

如果使用bash执行该脚本,则不会打印出X的值

    修改环境变量:

      如果将一个命令 从原来的文件下/usr/bin挪走,挪到/home/chris/mybin 这个目录下。那么如果使用该命令的话会报错命令未找到,如何解决呢?

      export PATH=$PATH:/home/chris/mybin 在原有的环境变量下加上现在命令所在的目录即可。

      但是这是暂时的,如果需要持久化,需要改~/.bashrc文件内容,最后一列加上

      export PATH=$PATH

      然后执行该文件 source ~/.bashrc 即可

 

变量运算

expr 1 + 2 注意有空格,否则不是运算结果值

或者是如下写法

$((1+2)) 多个表达式用逗号隔开

$[1+2]

-bash-3.2$ a=((1+2))

-bash-3.2$ echo a

3

 if语句的基本使用 

  • 语法结构
    • if conditions; then  
          语句块
      else
          语句块
      fi
      

        条件后边的分号不加也行

  • 数值比较
    • -eq  等于   -ne不等于
    • -lt  小于  -gt  大于
    • -le 小于等于   -ge  大于等于
    • if [ 3 -gt 2 ]
      then
          echo '3>2'
      else
          echo '3不等于2'
      fi
      

        注意:if后边的条件 用中括号。中括号前后必须有空格。

  • 字符串比较
      • read -p "请输入一个字符串" x
        read -p "请再输入一个字符串" y
        if [ $x = $y ];
        then
            echo 'x=y'
        else
            echo 'x!=y'
        fi
        

          != 不等于   [[ a>b ]] 大于和小于要用2个中括号。条件中等号两边也必须要有空格

  • 判断是否是文件
read -p "请输入一个路径" path
if [ -d $path ]
then
    echo '是文件夹'
else
    echo '不是文件夹'
fi

  -d  判断是否是文件夹。还有判断是否是文件等,可以自行查询了解。

 

case语句

read -p '输入一个值' op
case $op in
	1)
		echo 添加用户
		;;
	2)
		echo 删除用户
		;;
	3)
		echo 查询用户
		;;
	*)
		echo 无操作
esac

  case只判断等于的情况

for循环语句

for循环有2个方式

  1. for i in `seq 1 10`
    1. do
      1. 语句块
    2. done
  2. for  ((i=0;i<=10;i++))

do

  语句块

done

#for循环的使用
for i in `seq 1 10`
do
    echo $i
done

  

函数的使用

function可以省略不写。直接在最后传参

function foo()
{
echo $0
echo $1
echo $2
echo $#
}
foo 12 34 45 gg   调用函数。不加括号

  结果:

shell.sh
12
34
4

数组

bash shell 只支持一维数组 [1,2,3,4,5] 类似python中的list

多维数组就是数组嵌套数组

[1,2,3,[hello],5]

 

names=(hello good 12 34 8) #定义一个数组
echo $names[1] #结果为hello[1] 而不是good 原因是 $names 当成一个整体,默认获取数组里的第0个数据。解决方法:加上大括号
echo ${names[1]} #获取第一个值
echo ${names[*]}或者echo ${names[@]} # 获取所有值
echo ${#names[@]} #获取长度

 

遍历数组

for i in ${names[*]}
do
echo $i
done

 

for((x=0;x<${#names[*]});x++)
do
echo ${names[x]}
done

 

posted @ 2020-08-25 16:24  Python-萍  阅读(215)  评论(0)    收藏  举报