shell本身是擅长运行指令,是一种弱数据类型语言
它与c语言中定义变量有所不同
- C中:
- 存储类型 数据类型 变量名;
-
- shell中:
- 变量=变量的值 ----->如果变量的值中间没有空格直接使用
- 变量='变量的值' ----->变量的值中间有空格
- 变量="变量的值" ----->使用一个已有的变量给新的变量赋值,并且赋值中有空格时
- ''内,$变量名,不会被展开
注意:shell中等号两边不允许有空格,空格会被识别为一个指令
使用变量时在变量前加$
$变量名 ${变量名} 无法区分变量名时使用
不使用${变量名}
- name="John"
- echo "$nameDoe" # 这将不会输出任何东西,因为Shell会尝试查找一个名为nameDoe的变量
使用${变量名}
- name="John"
- echo "${name}_Doe" # 这将输出 "John_Doe"
shell脚本的本质:命令的集合
- readonly ---->只读不能修改
- unset ---->清空变量(不能清空只读(readonly)的变量)
- local ---->定义局部变量(只能在函数中使用)
用来接收脚本的外部传参(在命令行传递过来)
$数字
注意:9以上的数字需要加{}如${10} ${11}...
拿到指令输出的结果(赋值给变量)
sudo apt-get install lolcat
- 自动换行
-
- `` :反引号,esc键下面就是`` ----->常用
- $()
二者是一个效果,只是想要使用反引号得需要下载
$()
:命令替换 ${}
:变量替换或变量操作
- C中
- int arr[4]={1,2,3,4};
-
- shell:
- 数组名=(1 2 3 4) ----->每个元素之间以空格作为分隔
-
- shell中支持稀疏数组
- 数组名=([下标]=初始值1 [下标]=初始值2 ·····)
-
- #!/bin/bash
- arr=(12 90 89 100)
-
- #shell中支持稀疏数组,下标不连续的数组
- brr=([0]=90 [3]=70 [7]=900)
-
- crr[0]=29 #给crr数组中下标为0的元素赋值
- crr[3]=78 #给crr数组中下标为3的元素赋值
-
- #再重新给brr中没有提供的下标的元素赋值
- brr[4]=67
-
- echo ${brr[4]}
- echo ${crr[3]}
${数组名[*]} ${数组名[@]}
${#数组名[#]}
echo 默认不解析转义字符并且会自动换行
-e:让echo指令解析转义字符
-n:取消换行
read 变量名
read -s 变量名 ---->输入的内容不回显
read -p "提示信息" 变量名 ----->-p回显提示信息
read -n 字符个数 变量名 ----->控制输入的字符个数,当超过会自动停止
read -t 秒数 变量名 ----->控制读入数据的时间,如果指定时间内不输入会自动停止
read -a 数组名 ---->输入数组
shell本身不擅长算术运算,需要借助于运算符和其他指令
(()) $[] let expr
使用方法:
使用方法: (仍然支持幂运算和自增自减运算)
使用方法:
expr是一条指令
使用方法:
expr对字符串的运算
- match str1 str2
- 返回str2在str1中完全匹配的个数(str2可以作为str1中子串)
-
- substr STRING POS LENGTH
- 如果字符串长度不够截取长度,就把字符串中所有的内容都截取出来
- 从string中的第pos个位置开始截取长度为length的子串(pos从1开始)
- index STRING CHARS
- 返回字符在字符串中第一次出现的位置,如果是多个字符,返回最先在字符串中出现的字符的下标
- (下标从1开始)
- length STRING
- 求字符串的长度
- []就是test指令
- #单分支结构
- if [ test语句 ] -----> if test 表达式
- then
- 语句块
- fi
-
- #双分支
- if [ test语句 ] -----> if test 表达式
- then
- 语句块
- else
- 条件不成立执行的语句块
- fi
-
- #多分支语句
- if [ test语句 ] -----> if test 表达式
- then
- 语句块
- elif [ test语句 ] ------> elif test 表达式
- then
- 条件不成立执行的语句块
- fi
-
- #!/bin/bash
- num1=90
- num2=300
- #if [ $num1 -le $num2 ]
- if test $num1 -le $num2
- then
- echo "num1<=num2"
- fi