Linux学习c高级:day3 — shell脚本

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[*]})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值