Linux之Shell脚本基本语法
1.变量定义
变量命名规则:
可以包含字母,数字,下划线,首字母不能用数字开头,中间不能又空格;
为变量赋值等号之间不能为空格;
变量命名不能使用标点符号,不能使用bash的关键字;
shell中默认的变量的类型都是字符,就算是数字字符也会被认为是字符串,如果需要进行数值相加,则必须指定变量为数值;
如果定义的变量中没有空格,则定义变量时可以使用单引号或双引号,也可以使用,如:
name=zs
,如果变量中包含了空格,则必须使用单引号或双引号引起来,如:"Kent Beck”
;可以使用命令的结果作为变量的值,但必须使用 `` 或 $() 符号,如: d=$(ls /etc) 获取etc目录下的所用文件赋给d;
环境变量一般用大写,编程习惯;
变量命令示例:
# 以下时合法的变量名 ABC ROOT__PATH _var var2 # 以下时非法的变量名 12abc ?abc
1.1.变量赋值
# 显示负值 name="zs" #正确 name = "zs" #错误 # 变量的使用 echo $name echo ${name} #也可以这样写,花括号是可选的 # 使用语句为变量赋值 for f in $(ls /etc) # 将/etc目录下的所有文件循环赋给f变量 for f in `ls /etc` # 这样写也可以 # 变量可以重新定义 name="ww" echo $name name="zl" echo $name
双引号和单引号的区别?
root@zking:~# var=1 2 3 2: command not found root@zking:~# VAR="1 2 3" root@zking:~# echo $VAR 1 2 3 root@zking:~# VAR='1 2 3' root@zking:~# echo $VAR 1 2 3 root@zking:~# ^C root@zking:~#
在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令。
看不出什么区别,再举个说明:
root@zking:~# N=3 root@zking:~# VAR="1 2 $N" root@zking:~# echo $VAR 1 2 3
单引号是告诉
Shell
忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。
1.2.只读变量
# 定义只读变量,该变量不能修改 name="avdfd" readonly name # 运行时会提示该变量是只读变量
1.3.删除变量
# 删除name变量 unset name # set可以查看所有的变量,包括环境变量和用户自定义的变量 set
删除只读变量?
1.4.变量引用
Shell
中所有变量引用使用$符,后跟变量名。
root@zking:~# VAR=123 root@zking:~# echo $VAR 123 root@zking:~# VAR+=456 root@zking:~# echo $VAR 123456
还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:
root@zking:~# VAR=123 root@zking:~# echo $VAR 123 root@zking:~# echo $VAR456 root@zking:~# echo ${VAR}456 123456
将命令结果作为变量值:
root@zking:~# VAR=`echo 123` root@zking:~# echo $VAR 123 root@zking:~# VAR=$(echo 123) root@zking:~# echo $VAR 123
2.变量类型
自定义变量:用户自己定义的变量,或者叫作本地变量;
环境变量:保存和系统操作环境相关的变量,可以添加环境变量;
位置变量:主要用于向脚本中传递参数或数据,变量名不能自定义,作用固定;
预定义变量:在Bash中已经定义好的变量,变量的作用也是预先定义好的;
2.1.自定义变量
用户自定义的变量也叫本地变量,只在定义它的当前shell中才也可以使用。
参考变量定义中的变量赋值即可。
2.2.环境变量
在命令行提示符直接执行 env、set
查看系统或环境变量。env
显示用户环境变量,set
显示Shell预先定义好的变量以及用户变量。可以通过 export
导出成用户变量。
可以理解为环境变量与本地变量的区别就是作用范围不同。
一些写 Shell 脚本时常用的系统变量:
变量 | 说明 |
---|---|
$SHELL | 默认 Shell |
$HOME | 当前用户家目录 |
$IFS | 内部字段分隔符 |
$LANG | 默认语言 |
$PATH | 默认可执行程序路径 |
$PWD | 当前目录 |
$UID | 当前用户 ID |
$USER | 当前用户 |
$HISTSIZE | 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间 |
$RANDOM | 随机生成一个 0 至 32767 的整数 |
$HOSTNAME | 主机名 |
export
是一个Shell内置命令,用于将变量设置为环境变量,使其在当前Shell及其子Shell中都能被访问。环境变量通常用于配置Shell环境、系统行为、应用程序参数等。基本语法:
export VARIABLE_NAME=value
2.3.位置变量
位置变量指的是函数或脚本后跟的第 n 个参数。
参数 | 说明 |
---|---|
$n | n是数字,$0表示命令的本身,$1-9表示第1到第9个参数,10以上的参数需要用{}括起来,例如${10} |
$* | 表示命令行中的所有参数,$*把所有参数看成一个整体 |
$@ | 表示命令行中的所用参数,与$*不同的是$@把每个参数区分对待,可以将这个整体看作是一个数组,数组中的每个元素都是独立的 |
$# | 代表命令行中所有参数的个数 |
示例一:
root@zking:~# vim paramdemo.sh#!/bin/bash echo $0 echo $1 echo $2 echo $3# 赋权 root@zking:~# chmod 755 paramdemo.sh root@zking:~# ./paramdemo.sh 1 2 3 4 ./paramdemo.sh 1 2 3
示例二:
root@zking:~# vim paramdemo02.sh#!/bin/bash echo "参数个数:$#" echo "所有的参数(作为一个整体):$*" echo "所有的参数(区分对待每个参数):$@"root@zking:~# root@zking:~# chmod 775 paramdemo02.sh root@zking:~# ./paramdemo02.sh 1 2 3 4 7 参数个数:5 所有的参数(作为一个整体):1 2 3 4 7 所有的参数(区分对待每个参数):1 2 3 4 7
2.4.预定义变量
参数 | 说明 |
---|---|
$? | 最后一次执行命令的返回状态,如值为0则说明成功,如值为非0,则说明命令执行不正确 |
$$ | 当前进程的进程号 |
$! | 后台运行的最后一个进程的进程号 |
示例一:
root@zking:~# ls a.txt paramdemo02.sh paramdemo.sh snap workspace root@zking:~# echo $? 0 root@zking:~# ls /fafaf ls: cannot access '/fafaf': No such file or directory root@zking:~# root@zking:~# echo $? 2
3.键盘输入
read
命令从标准输入读取,并把输入的内容复制给变量。
命令:read [选项] [变量名]
参数说明:
选项 | 说明 |
---|---|
-p | 提示信息,等待输入时的提示 |
-t | 秒数,用于指定等待的时间,单位时秒 |
-n | 字符数,只要接收到指定的字符数就会执行 |
-s | 隐藏输入的数据,用于机密信息的输入,比如密码 |
更多参数,请使用
read -help
查看。
示例一:
root@zking:~# vim readdemo.sh#!/bin/bash read -t 60 -p "请输入账号: " userName echo "输入的账号是: $userName" read -s -t 60 -p "请输入密码:" password echo -e "\n" echo “输入的密码: $password” read -n 1 -t 30 -p "请选择[y/n]" select echo -e "\n" echo "输入的选择是: $select"root@zking:~# chmod 775 readdemo.sh root@zking:~# ./readdemo.sh 请输入账号: admin 输入的账号是: admin 请输入密码:“输入的密码: 1234” 请选择[y/n]y输入的选择是: y
4.数值运算
4.1.为什么数值需要特殊处理
在shell
中变量默认都是字符型的,不管是其字面值是不是数值,所以当两个变量相加时,默认是字符串拼接的操作,例如:
root@zking:~# num1=1 root@zking:~# num2=2 root@zking:~# num3=$num1+$num2 root@zking:~# echo $num3 1+2
4.2.声明变量类型
格式: declare [+/-][选项] 变量名
参数说明:
参数 | 说明 |
---|---|
- | 给变量设置类型属性 |
+ | 取消变量的类型属性,注意与我们的日常习惯不同 |
-i | 将变量指定为整型 |
-x | 将变量声明为环境变量 |
-p | 显示指定变量被设置的类型 |
示例一:
root@zking:~# num1=1 root@zking:~# num2=2 root@zking:~# num3=$num1+$num2 root@zking:~# echo $num3 1+2 # 此处是数值相加,而不是字符串相加了 root@zking:~# declare -i num4=$num1+$num2 root@zking:~# echo $num4 3
4.3. expr或let数值运算工具
除了 Shell
本身的算数运算表达式,还有几个命令支持复杂的算数运算:
root@zking:~# a=1 root@zking:~# b=2 root@zking:~# let c=$a+$b root@zking:~# echo $c 3# 注意空格问题 root@zking:~# c=$(expr $a+$b) root@zking:~# echo $c 1+2 root@zking:~# c=$(expr $a + $b) root@zking:~# echo $c 3
4.4.$((表达式))或$[表达式]
root@zking:~# a=5 root@zking:~# b=6 root@zking:~# c=$((a+b)) root@zking:~# echo $c 11 root@zking:~# b=8 root@zking:~# a=9 root@zking:~# c=$[a+b] root@zking:~# echo $c 17
5.运算符
优先级 | 运算符 | 说明 |
---|---|---|
1 | =, +=, -=, *=, /=, %=, &=, ^= | 各种赋值 |
2 | && | 逻辑与 |
3 | ^ | 按位异或 |
4 | & | 按位与 |
5 | ==, != | 等于,不等于 |
6 | >, <, <=, >= | 大于,小于,大于等于,小于等于 |
7 | >>, << | 按位左移,按位右移 |
8 | +, - | 加,减 |
9 | *, /, % | 乘,除,取余 |
10 | !, ~ | 逻辑非,按位取反,或补码 |
11 | -,+ | 单目,正负运算符 |
优先级的数值越大,优先级越高,注意和其他语言的数值越低优先级越高不同。
root@zking:~# num=$[(15+34)*5/2] root@zking:~# echo $num 122 root@zking:~# b=$((19%2)) root@zking:~# echo $b 1 root@zking:~# c=$((1&&0)) root@zking:~# echo $c 0
空格总结
定义变量时,=号两边不可以留空格
使用反引号的时候,运算符两边必须留空格;使用$()的时候,运算符两边不可以留空格
if条件测试语句的时候,[ ]两边要留空格,比较符两边也要留空格
命令和其之后的参数或对象之间一定要有空格
$后不能有空格