注意, 这里在运行时一定要写成./test.sh,而不是 test.sh, 运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH(环境变量) 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
案例2:使用root用户帐号创建并执行test2.sh,实现创建一个shelltest用户,并在其家目录中新建文件try.html。
脚本执行的另外一个方式:/bin/bash 脚本的路径(了解)
Shell脚本分为简单的写法(简单命令的堆积)和复杂写法(程序的设计)
三、shell进阶(重点)
1、变量(重点)
1.1、变量的含义
a. 什么是量:量就是数据.
b. 什么是变量:数据可以发生改变就是变量.
在一个脚本周期内, 其值可以发生改变的量就是变量.
c. 什么叫做一个脚本周期:一个脚本周期我们可以简单的理解为当前的shell文件
变量是shell中不可或缺的一部分,也是 最基础、最重要的组成部分。
1.2、变量的定义与使用(重点)
变量,先定义后使用。
定义形如:class_name =”yunwe “
使用形如:echo $class_name
变量就是由2部分组成,一个是变量名(左边),另外一部分是变量的值(右边)
在使用变量的时候一定需要在变量名前面添加一个$符号,该要求在其他语言中也存在的(例如php)。
变量名的规范:
请注意,变量名后的等号周围不能有空格,这可能与您熟悉的所有编程语言不同。同时,变量名的命名必须遵循以下规则:
[En]
Note that there can be no spaces around the equal sign after the variable name, which may be different from all the programming languages you are familiar with. At the same time, the naming of variable names must follow the following rules:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线”“。_
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
案例1:使用变量改写入门脚本中的第1个shell脚本。
关于单双引号的问题:
双引号能够识别变量,双引号能够实现转义(类似于”* “)
单引号是不能识别变量,只会原样输出,单引号是不能转义的
案例2:定义一个变量,输出当前时间,要求格式为”年-月-日 时:分:秒”。
注意:反引号(esc 键下方的那个键),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用”反引号”。
1.3、只读变量(了解)
语法:readonly 变量名
案例:定义变量a并且其值为10,随后设置其为只读变量,再去尝试重新赋值
1.4、接收用户输入(重点)
语法:read -p 提示信息 变量名
案例:编写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径),然后自动为用户创建该文件
1.5、删除变量(了解)
语法:unset 变量名path
案例:定义变量b=20,再输出b的值,随后删除b,最后再输出下b
2、条件判断语句
语法1(一个条件):
if condition
then
command1
command2
…
fi
单行写法(一般在命令行中执行的时候):if [ condition ]; then command; fi
语法2(两个条件):
if condition
then
command1
command2
…
else
command
fi
语法3(多个条件):
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
3、运算符
在shell中,运算符和其他编程脚本语言一样,常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、 文件测试运算符等
3.1、算数运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符
说明
举例
+
加法
expr $a + $b
结果为 30。
–
减法
expr $a - $b
结果为 -10。
*
乘法
expr $a \* $b
结果为 200。
/
除法
expr $b / $a
结果为 2。
%
取余
expr $b % $a
结果为 0。
=
赋值
a=$b 将把变量 b 的值赋给 a。
==
相等。用于比较两个数字,相同则返回 true(真)。
[ $a == $b ] 返回 false(假)。
!=
不相等。用于比较两个数字,不相同则返回 true。
[ $a != $b ] 返回 true。
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
原生bash不支持简单的数学运算 ,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ‘):
!/bin/bash
val=expr 2 + 2
echo “两数之和为 : $val”
两点注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
3.2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符
说明
举例
-eq
检测 两个数是否相等,相等返回 true。
[ $a -eq $b ] 返回 false。
-ne
检测 两个数是否相等,不相等返回 true。
[ $a -ne $b ] 返回 true。
-gt
检测左边的数 是否大于右边的,如果是,则返回 true。
[ $a -gt $b ] 返回 false。
-lt
检测左边的数 是否小于右边的,如果是,则返回 true。
[ $a -lt $b ] 返回 true。
-ge
检测左边的数 是否大于等于右边的,如果是,则返回 true。
[ $a -ge $b ] 返回 false。
-le
检测左边的数 是否小于等于右边的,如果是,则返回 true。
[ $a -le $b ] 返回 true。
-eq:equal
-ne:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal
案例:使用a=10,b=20来实现本案例
案例:编写一个脚本来确定当前输入的用户是否存在。如果存在,则提示“用户存在”或“用户不存在”。
[En]
Case: write a script to determine whether the currently entered user exists. If it exists, it prompts “user exists” or “user does not exist”.
3.3、逻辑运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符
说明
举例
!
非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。
-o
或(或者)运算, 有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a
与(并且)运算, 两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false。
或运算:一个为真即为真 ,全部为假才是假
与运算:一个为假即为假 ,全部为真才是真
3.4、字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
运算符
说明
举例
=
检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。
!=
检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。
-z
检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。
-n
检测字符串长度是否为0,不为0返回 true。
[ -n $a ] 返回 true。
str
检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。
3.5、文件测试运算符(重点)
文件测试运算符用于检测 Unix/Linux 文件的各种属性。
属性检测描述如下:
操作符
说明
举例
-b file
检测文件是否是块设备文件,如果是,则返回 true。
[ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。
[ -c $file ] 返回 false。
-d file
检测文件是否是目录,如果是,则返回 true 。
[ -d $file ] 返回 false。
-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true 。
[ -f $file ] 返回 true。
-g file
检测文件是否设置了 SGID 位,如果是,则返回 true。
[ -g $file ] 返回 false。
-k file
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
[ -k $file ] 返回 false。
-p file
检测文件是否是有名管道,如果是,则返回 true。
[ -p $file ] 返回 false。
-u file
检测文件是否设置了 SUID 位,如果是,则返回 true。
[ -u $file ] 返回 false。
-r file
检测文件是否可读,如果是,则返回 true 。
[ -r $file ] 返回 true。
-w file
检测文件是否可写,如果是,则返回 true 。
[ -w $file ] 返回 true。
-x file
检测文件是否可执行,如果是,则返回 true 。
[ -x $file ] 返回 true。
-s file
检测文件是否为空(文件大小是否大于 0 ),不为空返回 true。
[ -s $file ] 返回 true。
-e file
检测文件(包括目录)是否存在,如果是,则返回 true 。
[ -e $file ] 返回 true。
案例研究:测试上述增稠的效果
[En]
Case study: test the effect of the above thickening
注意:有几种权限判断,如果只有一个部分满足,则认为它有权限。
[En]
Note: there are several judgments of permissions, and if only one part meets, it is considered to have permissions.
4、shell脚本附带选项(重点)
问题描述:在linux shell中如何处理tail -10 access.log这样的命令行选项?
步骤:
调用tail指令
系统把后续选项传递给tail
Tail先去打开指定的文件
取出最后10行
问题:自己写的shell是否也可以像内置命令一样传递一些选项呢?
答:是的,送货方式和上面描述的一样,关键是如何接收。例如:
[En]
A: yes, the delivery method is the same as the above description, the key is how to receive it. For example:
传递:
./test.sh a b c
接收:
在脚本中可以用”$1″来表示a,”$2″来表示b,以此类推。
接收可以用”$ “加上选项对应的序号即可。
测试:编写test14.sh,传递a,b,c,输出其值
练习:创建自定义 指令” user “,可以直接执行,要求该指令具备以下语法和功能:
a. #user -add 用户名 【添加用户】
b. #user -del 用户名 【删除用户及其家目录】
同时,标题中的要求是一种说明,因此您可以添加个人姓名:
[En]
At the same time, the requirement in the title is an instruction, so you can add an individual name:
Original: https://www.cnblogs.com/zzc1102/p/16030182.html
Author: and脱发周大侠
Title: Linux_shell基础
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523982/
转载文章受原作者版权保护。转载请注明原作者出处!