输入输出
输出:echo
echo 字符串
echo '字符串'
echo "字符串"
echo -n "字符串" 取消换行
echo -e "字符串" 使转义字符生效
输入:read
输入一个或多个变量:数据元素之间用空格,Tab表示数据输入的结束,回车表示read的结束
read a
read a b c d
显示提示语句
read -p "字符串" a
例:
read -p "please enter a:" a
please enter a:
输入n个字符自动结束
read -n num a //输入num个字符自动结束
n秒不输入自动结束
read -t num a //num秒不输入自动结束
隐藏输入(密码输入)
read -s a //隐藏输入
输入数组
read -a arr
echo ${arr[0]} //数组的输出
shell的字符串
C语言的字符串是一个数组,shell的字符串是一个变量
计算字符串长度
格式:
${#str}
字符串拼接
格式:
a="hello"
b="world"
c="$a $b"
字符串截取
正向截取
${str:m} //从左到右,从0开始,截取第m以后的所有字符串
${str:m:n} //从左到右,从0开始,截取第m开始n个字符
反向截取
${str:0-m} //从右到左,从1开始,截取第m以后的所有字符串
${str:0-m:n} //从右到左,从1开始,截取第m开始n个字符
# ## % %%
string:分隔符
${str#*string} //从左到右,截取第一个分隔符以后的所有字符串
${str##*string} //从左到右,截取最后一个分隔符以后的所有字符串
${str%string*} //从右到左,截取第一个分隔符以后的所有字符串
${str%%string*} //从右到左,截取最后一个分隔符以后的所有字符串
shell的数组
C语言中存在多维数组,shell中只有一维数组,不存在多维数组
shell中输入的每个元素是字符串
数组的定义格式以及初始化
数组的定义及初始化
arr=(100 11 22 33) //()是shell中数组的标志
shell支持稀疏数组,数组长度为2
arr=([0]=100 [3]=hello)
shell的单个赋值
arr[0]=100
arr[3]=300
shell可以追加赋值
arr=(11 22 33)
arr[3]=hello
数组拼接
a=(11 22)
b=(33 44)
c=(${a[*]} ${b[*]})
c=(${a[@]} ${b[@]})
数组的引用
arr=(11 22 33)
单个引用
${arr[0]}
引用所有数组元素,默认中间用空格隔开
${arr[*]}
${arr[@]}
计算数组长度
${#arr[*]}
${#arr[@]}
练习:
定义数组初始化为当前目录下的所有.sh文件名,打印.sh文件的个数
定义数初始化为终端输入的字符串,打印所有字符串
输入一个数组,打印数组的所有元素
运算符
shell不擅长算数运算,擅长字符串以及文件的相关操作
shell的运算符:
(()):实现算数运算,关系运算,逻辑运算,条件运算,逗号等 针对整数
$[]:实现算数运算,关系运算,逻辑运算,条件运算,逗号等 针对整数
let:实现算数运算,关系运算,逻辑运算,条件运算,逗号等 针对整数
expr:实现字符串,关系运算,逻辑运算
(())
格式:
((表达式))
引用:
((变量=表达式))
变量=$((表达式))
特点:
表达式的空格可有可无
表达式的$可有可无
(())可以实现任意复杂的运算:算数,关系,逻辑,条件等
(())可以实现自增自减运算
(())可以实现幂运算
((2**3)) //只能有两个*
练习:
输入一个数,判断是否是水仙花数,如果是水仙花数则赋值为1,否则赋值为0
输入一个秒数,计算几时几分几秒
$[]
格式:
变量=$[表达式]
特点:
表达式的空格可有可无
表达式的$可有可无
$[]可以实现任意复杂的运算:算数,关系,逻辑,条件等
$[]可以实现自增自减运算
$[]可以实现幂运算
$[2**3] //只能有两个*
练习:
输入三个数,计算最大值
let
格式:
let 变量=表达式 //不可以存在空格
let "变量=表达式" //可以存在空格
特点:
表达式的空格可有可无
表达式的$可有可无
let可以实现任意复杂的运算:算数,关系,逻辑,条件等
let可以实现自增自减运算
let可以实现幂运算
let a=2**3 //只能有两个*
expr
expr是一个指令,可以用man手册查看
expr可以进行整数(算数,关系,逻辑),字符串运算
格式:
变量=$(expr 表达式)
变量=`expr 表达式`
特点:
表达式的空格必须存在
表达式的$必须存在,在必要需要时添加""
expr可以实现算数,关系,逻辑,条件等运算
expr不可以实现自增自减运算,不可以实现幂运算
算数运算
ARG1 < ARG2
ARG1 is less than ARG2
ARG1 <= ARG2
ARG1 is less than or equal to ARG2
ARG1 = ARG2
ARG1 is equal to ARG2
ARG1 != ARG2
ARG1 is unequal to ARG2
ARG1 >= ARG2
ARG1 is greater than or equal to ARG2
ARG1 > ARG2
ARG1 is greater than ARG2
value=`expr ARG1 > ARG2`
逻辑运算
ARG1 | ARG2
ARG1 if it is neither null nor 0, otherwise ARG2
如果ARG1为真,ARG2为真,则结果是ARG1
如果ARG1为真,ARG2为假,则结果是ARG1
如果ARG1为假,ARG2为真,则结果是ARG2
如果ARG1为假,ARG2为假,则结果是0
ARG1 & ARG2
ARG1 if neither argument is null or 0, otherwise 0
如果ARG1为真,ARG2为真,则结果是ARG1
如果ARG1为真,ARG2为假,则结果是0
如果ARG1为假,ARG2为真,则结果是0
如果ARG1为假,ARG2为假,则结果是0
变量=`expr ARG1 & ARG2`
字符串运算
返回REGEXP在STRING中出现重复的字符个数,REGEXP需要是STRING的子串且从头开始
match STRING REGEXP
same as STRING : REGEXP
a=he
str=hello
value=`expr match $str $a`
value=`expr match $str $a` //a在str中相同字符的个数
字符串截取
substr STRING POS LENGTH
substring of STRING, POS counted from 1
格式:
变量=`expr substr $str 5 5`
str=www.baidu.com
value=`expr substr $str 5 5` baidu
查找字符在字符串中出现的下表,不存在返回0
index STRING CHARS
index in STRING where any CHARS is found, or 0
格式:
变量=`expr index $str $a`
str=hello
a=l
value=`expr index $str $a`
计算字符串长度
length STRING
length of STRING
格式:
变量=`expr length $str`
str=hello world
value=`expr length $str`
shell的选择结构
C语言的选择结构:单分支if 双分支if...else 多分支if...else if switch
shell的选择结构:单分支if 双分支if...else 多分支if...elif case...in
选择结构格式
单分支
if 表达式
then
shell语句
fi
双分支
if 表达式
then
shell语句1
else
shell语句2
fi
多分支
if 表达式1
then
shell语句1
elif 表达式2
then
shell语句2
......
else
shell语句n
fi
练习:
输入一个数判断是否是偶数
输入两个变量实现两个数的排序(单分支)
输入一个数,判断是否时水仙花数(双分支)
输入一个分数,实现等级判断(多分支)
90-100 A
80-89 B
780218
test指令
- 一般if语句不直接和运算符结合,多和test指令结合
- test是个指令,必须存在空格,必须添加$,必要时加""
- test指令实现:逻辑运算,整数关系,字符串,文件
- test等价于[]
if test 表达式
then
shell语句
fi
关系运算
判断两个整数相等
if test $a -eq $b --->if [$a -eq $b]
判断整数1大于等于整数2
if test $a -ge $b --->if [$a -ge $b]
判断整数1大于整数2
if test $a -gt $b --->if [$a -gt $b]
判断整数1小于等于整数2
if test $a -le $b --->if [$a -le $b]
判断整数1大于整数2
if test $a -lt $b --->if [$a -lt $b]
判断两个整数不等
if test $a -ne $b --->if [$a -ne $b]
练习:
输入三个数,实现从小到大排序
输入一个数判断是否时奇数
逻辑运算
格式:if [表达式1 -a 表达式2]
格式:if [表达式1] && [表达式2]
格式:if [表达式1 -o 表达式2]
格式:if [表达式1] || [表达式2]
判断表达式为真
if [$a -ne 0] --->if [$a]
判断表达式为假
if [$a -eq 0] --->if [ !$a ]
逻辑与
if [$a -ge 90 -a $a -le 100] --->if [$a -ge 90] && [$a -le 100]
逻辑非
if [$a -lt 0 -o $a -gt 100] --->if [$a -lt 0] || [$a -gt 100]
练习
输入一个年份,判断是否为闰年
#!/bin/bash
read -p " 输入一个年份" year
if test $((year%4)) -eq "0" -a $((year%100)) -ne "0" -o $((year%400)) -eq "0"
then
echo "是闰年"
else
echo "不是闰年"
fi
A:a=9
B:a=10
CD赋值左边需是变量,a++和++a不是变量
#include<>是直接在库文件下查找filename.h文件
#include""先在当前文件路径下查找,若找不到再到库文件中查找filename.h文件
char str[128]="";
gets(str);
int i=0;
fun(i,str);
void fun (int i,char* p)
{
while(*(p+i)=' ') //跳过空格
{
i++
}
int k=i;
if (*(p+i)=='-'||*(p+i)=='+') //判断+,-
i++;
int sum=0;
while(*(p+i)) //while(str[i]!='\0')
{
if (*(p+i)>='0'&&*(p+i)<='9')
{
sum=sum*10+(*(p+i)-'0');
}
else
break;
i++;
}
if(*(p+k)=='-')
sum=-sum;
printf("sum=%d\n",sum);
}