linux Shell Base
Shell
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 时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量。
- 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.