LinuxC高级_day3
【1】shell脚本
- 本质: 命令的有序集合
- 1)说明性语句 # 不会被解释执行
2)功能性语句 shell命令 shell程序
3)结构性语句 条件测试 多路分支 循环控制 - 怎么创建一个shell脚本
1)touch test.sh
2)chmod 777 test.sh
给权限
3)vim test.sh
#! /bin/bash
— 告诉系统我要使用bash解析
4)./test.sh
执行脚本
- 执行脚本的方式
./脚本名
文件执行必须需要可执行权限
bash 脚本名
没有权限也可以执行
source 脚本名
没有权限也可以执行
./ bash
开一个新的子终端 执行之后把结果以字符串形式返还回来
source
直接在终端解析cd ~
会回到家目录
[练习1]
- 在Desktop下面创建0729文件夹
- 进入0729创建file1 到 file5 五个文件
- 删除file2 file3 使用通配符删除
- 将0729打包并压缩成.tar.gz
- 拷贝压缩包到家目录下并解压
- 删除压缩包
- 列出该目录下的详细内容
[练习2]
- 在用户主目录(家目录)下创建两个目录 subdir1 subdir2
- 将/etc/passwd 文件拷贝到subdir1 将/etc/group 文件拷贝到subdir2
- 将subdir2重命名为subdir
- 把subdir1打包并压缩为xz格式
- 拷贝压缩包到subdir下面
- 拆包并解压
- 查看subdir目录下所有的文件
【2】shell脚本的变量
shell脚本的变量不需要定义 不支持数据类型(int float都没有) 所有的都解释为字符串
- 用户自定义变量
1)一般情况使用大写
2)赋值的时候左右不能有空格
3)输出一个变量的值
$变量名
${变量名}
* echo $VAR1
printf怎么使用???
4)unset
删除一个变量的赋值
5)readonly
可以修饰一个只读变量 和const一样
- eg:
VAR1=hello #hello就是一个字符串了 不能有空格
echo $VAR1
VAR1='hello world' #''可以有空格但是不能引用变量
echo $VAR1
VAR1='hello world' #""既可以有空格 也可以引用变量
VAR2="haha $VAR1"
echo $VAR2
[练习] 交换两个变量的值
var1=“www.baidu.com”
var2=“www.google.com”
-
位置变量
$0
命令行参数 包含脚本的名字(脚本名对应的字符串)
$1 - $
9 命令行1-9个参数
${10}
第十个参数
$#
命令行参数的个数(不包含脚本名)
$* $@ = {$1...}
所有命令行的参数(不包含脚本名)
$?
前一个命令的退出状态 (0为真 1为假) -
环境变量
echo $HOME
-
命令置换 ``
temp=`ls -l`
echo $temp
- #注释
[练习] 从命令行交换两个命令
test.sh
bash test.sh ls -l ls . >
【3】功能性语句
-
read
read var1 var2 var3
把读入行的第一个参数给var1 第二个给var2 剩余的给var3
#echo "please input num:"
read -p "please input : " var1 var2 var3
echo $var1
echo $var2
echo $var3
-
expr
- 简单的算术运算
+ - \* / %
- 乘号加转义字符 *` 否则会认为是通配符
- 小括号要加转义字符
\( \)
expr
自带打印功能- 每一个算术运算符左右都要有空格
- 把
expr
结果给一个变量的时候要加命令置换或者$() expr
不能进行++ --
的操作- 算术运算引用变量的时候要加$符号
- 简单的算术运算
eg:
var1=5
var2=3
expr $var1 \* $var2
#expr $var1++
var1=`expr $var1 + 1`
var1=$(expr $var1 + 1)
echo $var1
[练习] 计算表达式 a*b+c-d/b a=2 b=3 c=15 d=18
从终端输入4个数字
2)字符串操作
- 求字符串的长度
expr length $str
str=www.baidu.com
expr length $str === 13
- 子字符串第一次在源字符串出现的位置
expr index 源字符串 子字符串
expr index $str "du" === 8
- 字符串截取
expr substr 源字符串 起始位置 长度
expr substr $str 5 5 === baidu
- 字符串比较
expr match 源字符串 子字符串
成功返回字符串长度 不成功返回0
expr match $str "www.baidu.com" === 13
expr match $str "www.baidu" === 0
let
- 不会自己打印
- 算术运算符左右两边不能有空格
- 引用变量的时候可以不加$
let num=1+2
let n=$num+3
let n=n**2 #表示取平方
echo $n
- test测试的对象有三种 字符串 整数 文件属性
1)字符串测试
s1 = s2
两个字符串内容是不是一致
s1 != s2
两个字符串内容是不是不一致
-z s1
s1长度是否为0
-n s1
s1长度是否不为0
2)整数的测试
a -eq b
测试a b是否相等
a -ne b
测试a b是否不相等
a -gt b
测试a是否大于b
a -ge b
测试a是否大于等于b
a -lt b
测试a是否小于b
a -le b
测试a是否小于等于b
3)文件属性测试
-d name
测试name是否是一个目录
-f name
测试name是否是一个普通文件
-e name
测试文件是否存在
eg:
read var
test "$var" = "hello"
echo $?
read num
test $num -eq 5
echo $?
- (())的用法
((表达式))
1)(())内部语法和C语言是一样
2)如果想要取得 (())的值 要加$
3) (())引用变量的时候可以加$ 也可以不加
4)((表达式1,表达式2,…表达式n))以最后一个表达式的结果作为整个的结果
5)(())可以写复杂的语句
eg:
echo $((($1%4==0 && $1%100!=0)||($1%400==0))) === 1
echo $? === 0
sum=0
for ((i=0;i<=100;i++))
{
((sum+=i))
}
echo $sum
【4】shell数组
- shell只存在一维数组 不存在多维数组
- shell数组没有大小
- 定义格式
arr=(11 22 33 44)
arr=($1 $2 $3)
arr=([0]=11 [5]=22 [10]=adbf)
read a b c d
arr=($a $b $c $d)
- 数组成员访问
${arr[i]}
访问数组的某一个成员
${arr[@]} ${arr[*]}
访问数组里所有的成员 - 求大小
${#arr[i]}
某一个成员的长度
${#arr[*]}
已被赋值的成员的个数
[练习]- 数组成员追加
arr1=(11 22 33)
给arr1增加一个成员hello
- 数组成员追加
arr1=(11 22 33)+0
#arr1[${#arr1[*]}]=hello
arr1=(${arr1[*]} hello)
echo ${arr1[@]}
-
数组的合并
arr2=(haha lala)
-
从命令行输入任意多个参数对他们求和