Post

linux Shell Base

Shell

Github

helloworld

  • 创建与写

    1
    2
    3
    4
    5
    6
    7
    8
    
    touch helloworld.sh
    vim helloworld.sh
    
    #!/bin/bash
    echo "Hello World !"
    
    // #! 是个约定标记
    // echo 向窗口输出文本
    
  • 执行

    1
    2
    3
    4
    
    chmod +x ./helloworld.sh
    ./helloworld.sh
    就可以看到控制台输出
    Hello World !
    

Shell 变量

命名规则

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用 bash 里的关键字(可用 help 命令查看保留关键字)。

操作

  • 创建使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    #!/bin/bash
    user_name="lcc"
    age=23
    sex="男"
    echo $user_name
    echo $age
    # 建议使用${变量名}
    # 为了帮助解释器识别变量的边界
    :<<EOF
    echo "I am good at ${skill}Script"
    EOF
    echo ${sex}
    
  • 只读
1
2
3
4
5
6
7
8
9
#!/bin/bash
user_name="lcc"
readonly user_name
user_name="Cc"
echo ${user_name}

结果会提示:
lcc
script.sh: line 4: user_name: readonly variable
  • 删除
1
2
3
4
#!/bin/bash
user_name="lcc"
unset user_name
echo ${user_name}

运行结果 什么都不会输出,建议提示变量不存在

  • 变量类型 运行 shell 时,会同时存在三种变量:
  1. 局部变量 局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量。
  3. shell 变量 shell 变量是由 shell 程序设置的特殊变量。shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 shell 的正常运行

字符串

单引号与双引号

  • 单引号
1
2
3
4
5
#!/bin/bash
name='C\sadf@$@#!$@#@#!c\'
echo ${name}
url='"lichaoche's'ng.top"'
echo ${url}
1
2
3
运行结果
C\sadf@$@#!$@#@#!c\
"lichaochesng.top"
  • 双引号
1
2
3
4
5
6
#!/bin/bash
name='Cc'
str="Hello, I know you are \"${name}\"! \n"
echo  -e ${str}
运行结果
Hello, I know you are "Cc"!
  • 区别
    • 单引号
      • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
      • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
    • 双引号
      • 双引号里可以有变量
      • 双引号里可以出现转义字符

字符串操作

  • 拼接
1
2
3
4
5
6
7
8
9
10
11
    #!/bin/bash
    your_name="Cc"

    # 使用双引号拼接
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting  $greeting_1
    # 使用单引号拼接
    greeting_2='hello, '$your_name' !'
    greeting_3='hello, ${your_name} !'
    echo $greeting_2  $greeting_3
1
2
3
运行结果
hello, Cc ! hello, Cc !
hello, Cc ! hello, ${your_name} !
  • 获取长度
    1
    2
    3
    4
    5
    
    #!/bin/bash
    name="CcAndHyperAndLccAndChaoChengLi"
    echo ${#name} #输出 30
    sex="Male"
    echo ${#sex}#输出4
    
  • 提取字符串
    1
    2
    3
    4
    5
    6
    
    #!/bin/bash
    name="lcc"
    # 0 开始计算
    echo ${name:0:2} #输出 lc
    echo ${name:1:2} #输出cc
    echo ${name::2} #输出 lc
    
  • 查找字符串 shell #!/bin/bash name="lcc shell" # 哪个字母先出现就计算哪个 echo `expr index "${name}" l` #输出 1 ps:为什么查找从1开始计算 echo `expr index "${name}" e` #输出 7

    ps:是 ` 不是 ‘

数组

创建、查看、获取、修改、[二维数组….]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    #!/bin/bash
    # 数组没有逗号分隔
    arrayName=("lcc" "Cc" "Hyper" 10)
    arrayAge=(
    23
    18
    6
    )
    # 下面查看数组
    echo ${arrayName[1]}	 #输出 Cc
    echo ${arrayAge[1]}		#输出 18
    # 获取所有元素
    echo ${arrayName[@]}	#输出 lcc Cc Hyper 10
    # 数组长度
    length=${#arrayName[@]}
    echo ${length}	#输出 4
    echo ${#arrayAge[*]}	#输出 3
    # 通过下标修改元素
    arrayName[0]="yes"
    echo ${arrayName[@]}	#yes Cc Hyper 10
    #--------
    # 二维数组
    # https://www.jianshu.com/p/543fa9df3469
    # https://www.cnblogs.com/wyf-349/p/11236939.html
    #--------

传递参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@iz2zeb00z6vr5gix5utl11z parameter]# cat demo1.sh
#!/bin/bash
echo "运行时参数传递";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数:$#"
echo "传递的参数作为一个字符串显示:$*"


echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@iz2zeb00z6vr5gix5utl11z parameter]# ./demo1.sh lcc 23 M
运行时参数传递
执行的文件名:./demo1.sh
第一个参数为:lcc
第二个参数为:23
第三个参数为:M
参数个数:3
传递的参数作为一个字符串显示:lcc 23 M
-- $* 演示 ---
lcc 23 M
-- $@ 演示 ---
lcc
23
M

区别

  • #$* 与 $@ 区别:
    • 相同点:都是引用所有参数。
    • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

运算符

operator

算术运算符

算术运算符

代码 operator/t2.sh 注意:

  • 乘号(*)前边必须加反斜杠()才能实现乘法运算;
  • if…then…fi 是条件语句,后续将会讲解。
  • 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 “*” 不需要转义符号 “" 。

关系运算符

关系运算符

代码 operator/t3.sh

布尔运算符

算术运算符

代码 operator/t4.sh

逻辑运算符

逻辑运算符

代码 operator/t5.sh

字符串运算符

字符串运算符

代码 operator/t6.sh

文件检测运算符

文件检测运算符

代码 operator/t7.sh

This post is licensed under CC BY 4.0 by the author.