linuxC高级_day3
【1】shell脚本
1. 本质: shell命令的有序集合 不需要编译的 直接由bash来解析执行
2. shell脚本的语句三类: 说明性语句 功能性语句 结构性语句
1)说明性语句
以#开头的 不会被解释执行 相当于注释
2)功能性语句
shell命令 用户程序
3)结构性语句
多路分支 循环 控制 条件测试
【2】shell脚本创建步骤
1. touch xxx.sh
2. #!/bin/bash --- 告诉你的linux使用的是bash解析器
3. 修改文件的权限 chmod 777 xxx.sh
4. 执行shell脚本 ./xxx.sh
* 执行shell脚本的方式
./脚本名 -- 需要可执行权限 cd ~没有真的进去
bash 脚本名 -- 不需要权限也可以执行
source 脚本名 -- 不需要权限就可以执行 颜色? cd ~真的回到家目录下面了
./ bash这俩个命令执行脚本的时候 是在子终端里解析脚本 解析结果返回给你一个字符串
source真正在当前终端解析
【练习】
1. 在Desktop下面创建0531文件夹
2. 进入文件夹创建file1-file5五个文件
3. 删除file2 file3 (使用通配符)
4. 将0531打包压缩成.tar.gz
5. 拷贝压缩包到家目录下并解压
6. 删除压缩包
1.在用户家目录下创建subdir1 subdir2两个文件夹
2.将/etc/passwd拷贝到subdir1下面 /etc/group拷贝到subdir2下面
3.将subdir2重命名subdir
4.将subdir1打包压缩成xz格式
5.将打包的xz拷贝到subdir下面
6.解压并拆包
7.查看subdir下所有文件
【3】shell脚本变量
shell脚本的变量不需要定义可以直接使用 不支持数据类型 任何赋值都解释为字符串
1. 用户自定义变量
一般使用大写
VAR1=hello 不能有空格
VAR2='hello world' 可以有空格但是不能用$引用变量
VAR3="hello $VAR1" 可以有空格 也可以引用变量
*变量赋值的时候 等号两边不能有空格!
2.怎么输出?
echo $变量名
echo "hiiii"
*shell脚本能不能用printf输出?
3. 引用变量
$变量名
${变量名}
*$(变量名) $[变量名]都不可以获取变量的值!
4. 变量取消 unset
unset VAR1
【练习】 交换两个变量
VAR1="baidu" VAR2="google"
5. 位置变量 命令行的参数
【作业】 int main(int argc, const char *argv[])
argc是什么 argv是什么 -- printf打印看一下
$0 命令行的第一个参数(脚本名对应的字符串)
$1 $2 ....$9 第一个到第九个命令行参数
${10} ${11} 第十个 十一个参数
$@ $* 包含所有的命令行参数(但是不含脚本名字)
$# 命令行参数的个数(也不包含脚本名字)
$? 上一条命令退出的状态(0为真 1为假)
6. 环境变量 echo $HOME
7. 只读变量
readonly 变量名 相当于C语言的const关键字
8. 命令置换 ``
temp=`ls`
echo $temp
9.注释
单行注释 #
多行注释
: < 中间一般都拿来注释文字
!
【练习】 从命令行接收两条命令并交换
bash 3.sh ls -l ls .
#!/bin/bash
var1="$1 $2"
var2="$3 $4"
var1=`$var1`
var2=`$var2`
var3=$var1
var1=$var2
var2=$var3
echo $var1
echo $var2
【4】 功能性语句
1. read
read var1 var2 var3
把读入行中的第一个单词给var1 第二个给var2 剩下的给最后一个变量
#echo "please input:"
read var1 var2 var3
#read -p "please input:" var1 var2 var3
echo "var1=$var1 var2=$var2 var3=$var3"
2. expr 算术命令
用于简单的整数运算包括+ - * / %
#expr 12 + 5 \* 3
sum=`expr 12 + 5 \* 3`
echo $sum
乘号*要加转义的\ 否则会被当做通配符
括号()需要加转义\ \( \)
运算符和数字之间要加空格 如果有括号,括号的前后也要有空格
expr自带输出功能
expr不能进行++ --操作
var1=2
#expr $var1 ++
var1=`expr $var1 + 1`
echo $var1
如果想把expr的结果付给某个变量 要加``命令置换
【练习】 计算表达式 a*b+c/d a=2 b=3 c=15 d=18
从终端读入四个数值(read)
expr 字符串操作
1. expr求字符串的长度
expr length $str
2. 获取子字符串第一次在源字符串出现的位置
expr index $str "xx"
3. 从strat位置开始提取length个长度的字符
expr substr $str start length
4. 将子字符串从头开始与源字符串进行比较,成功返回自字符的长度,否则返回0
expr match $str "xxx"
3. let
#let n=1+2
#let num=n+3
num=3
let num=num**2 -- 表示的是平方
echo $num
注意:运算中不能有空格 结果必须赋值给一个变量 参与运算的变量可以不加$符号
4.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 测试文件是否存在
#read var
#test "$var" = "hello"
#echo $?
read num
test $num -eq 5
echo $?
5. (())用法
1. (())语法和C语言一样
2. 如果想要获取(())里的运算结果要加$符号
3. 如果(())内部有多个表达式,最后一个表达式的结果就是整条语句的结果
【练习】 判断是不是闰年
echo $((($1%4==0 && $1%100!=0)||($1%400==0)))
1-100求和?
sum=0
for ((i=0;i<=100;i++))
{
# ((sum+=i))
sum=`expr $sum + $i`
}
echo $sum
6. shell数组
1)shell中只有一维数组,没有多维数组
2)shell中数组的定义格式
int arr[10] = {0} // C语言
arr=(11 22 33 44)
arr=([0]=11 [6]=sadhaf)
arr=($0 $1 $2)
* read a b c
arr=($a $b $c)
read -p "please input" -p:加提示语句
read -a arr -a:表示后面的变量是一个数组
3)数组的成员如何访问
${arr[i]} : 访问数组某个成员
${arr[@]} ${arr[*]}: 访问数组中所有的成员
4)求大小、求长度
var1="lalalala" -- ${#var1}
${#变量名} 求某个变量字符串的长度
${#arr[i]} 数组中第i个成员的字符个数
${#arr[@]} 整个数组成员的个数(已被赋值的)
5)shell脚本中的数组没有大小限制
6)给数组增加一个新的成员
arr1=(111 222 333) 增加一个helloworld
arr1=(${arr1[@]} helloworld)
数组的合并
arr2=(abc efg) ---> arr1和arr2合并
arr3=(${arr1[*]} ${arr2[*]})