[Linux] 10. shell编程基础《updating》

第一个shell脚本

  1. shell 脚本通常是以#!起始的文本文件
    Linux环境下的任何脚本文件都是以一个被称为 shebang 的特殊行作为起始的。
    在这行中,字符 #! 被置于解释器路径之前。/bin/bash是Bash的绝对路径。
#!/bin/bash
  1. #!(shebang): # sharp,!bang
  2. 除了第一行#,其余#都是注释
  3. 命令有2种执行方式:
    1. 命令行
    2. 写在文件中作为脚本
  4. 脚本有2种执行方式:
    1. 将脚本作为sh命令的参数(bash解释文件)
    2. 将脚本文件作为具有执行权限的可执行文件(文件加上可执行权限)
      shell程序读取脚本的首行,查看shebang行是否为#!/bin/bash/。它会自动识别/bin/bash.并在内部以如下命令执行该脚本文件。

变量

  1. 变量类型无需显示声明(在解释过程中自动判断)

    1. 统一按照字符串处理(sort时会发现10排在2前面)
    2. 根据对变量的操作变化类型
  2. $取变量的值
    $[]数值计算

  3. 赋值(a=10)不能空格(a = 10),否则会被认为是命令
    清空变量(unset a)

  4. 变量区分大小写,系统变量一般大写

特殊变量

位置变量

在这里插入图片描述

  1. $0
  2. $n
  3. $*
  4. $@
  5. $#

状态变量

数组

  1. 索引数组(索引赋值,批量赋值)

  2. 关联数组

数组操作

  1. a+=(0 1 2 3 4 5 67 8) 数组追加会清空,并重新赋值
  2. a=(0 1 2 3 4 5 6 7 8) a=(8 7 6 5 4 3 2 1 0) 数组覆盖
  3. unset arr[102]和arr[102]=""区别
    unset后下标102不再使用,第二种下标仍在使用

输入输出与流程控制

输入 read

#!/bin/bash

read -d efo n    #读入e结束,而不是读入"\n"结束
echo ${n}

read -a arr      #数组
echo ${arr[@]}   #数组元素
echo ${!arr[@]}  #数组下标

read -n 5 k      #5个字符
echo ${k}

read -t 5 -s -p "Please input a passwd : (8)" -n 8 pswd #-p提示,-s隐藏,-t 5等待5s超时
echo #换行,打印清晰
echo $pswd

输出

echo


print


和echo区别:没有默认的换行符,需要手动添加“\n”

函数

#!/bin/bash

function test() {
    echo [$1]
}

test "kkb"
echo "[$1]"
  1. #function 函数名() {函数体}
  2. {}中local的使用:局部变量与全局变量

shell脚本编程基础之for循环

举例更直观 local就是用于定义只允许于指定区块(由{}决定)的变量:
y:root:/tmp> cat yyy
#!/bin/bash

a=“abc”

func() {
local a=“def”
echo “local: $a”
}

echo “global: $a”
func

y:root:/tmp> ./yyy
global: abc
local: def


1、数字类型转字符类型

数字类型转字符类型,是比较常见的,也是必须容易实现的。大多时候系统能够自动进行转换,如:

aa=$((1+1));echo $aa

变量aa赋值为整数2,但echo 输出时已被当成字符型。当然也可以强制进行转换,如:

echo $aa""

通过与空字符串进行连接,强化将变量aa转化成了字符型。


2、上面的方法也同样适用于各种浮点数类型转字符类型。如:

aa=$(awk ‘BEGIN{print 7.01*5-4.01 }’);

echo $aa;

echo $aa"";

变量aa是算式(7.01*5-4.01 )的值,是个浮点数,可看到成功转化成字符。

=----------

3、字符类型转数值类型

反过来,字符类型转数值类型也是可以实现的。

如:

aa=12;

aa= ( ( (( ((a+4));

echo $aa;

在shell中,给变更赋值中的数字默认是被当作字符串的。

循环需要有进入条件和退出条件,如果没有退出条件,则就会一直循环下去

for 变量 in 列表;do
  循环体
done

$name 和 $url 之间之所以不能出现空格,是因为当字符串不被任何一种引号包围时,遇到空格就认为字符串结束了,空格后边的内容会作为其他变量或者命令解析

加{ }是为了帮助解释器识别变量的边界

${} 变量替换 就是把变量的真实值带入。

[ ] 和 []和 [](()) 是一组 标识的是 算术运算 ±*/

[ ] 是test 的另一种格式 注意左右需要空格。

[[ ]] 是加强的[] 可以有匹配 没有字符的分割。

(()) 是一种可以支持数学运算符的 条件判断 可当作 [] 用 只要其中的表达式符合c就可以。他和(())的区别是 [[]] 可以支持 ±*/ 而[[ ]] 支持 匹配
————————————————
版权声明:本文为CSDN博主「往事如风 随风即行」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sdc20102010/article/details/83277167


${ } :

用 于 变 量 替 换 。 一 般 情 况 下 , { }用于变量替换。一般情况下, var 与${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围。比如

$ A=B
$ echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,
但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来…
若使用 ${ } 就没问题了:
$ echo ${A}B
BB

$[] $(()) :

它们是一样的,都是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。

例:
$ a=5; b=7; c=2
$ echo $(( a+bc ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a
b)%c))
1

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * c ) ) 也 可 得 到 19 的 结 果 此 外 , c)) 也可得到 19 的结果 此外, c))19(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:
echo $((16#2a)) 结果为 42 (16进位转十进制)


shell的等号在赋值的时候两边不能有空格,在比较的时候两边必须有空格

大于 -gt (greater than)
小于 -lt (less than)
大于或等于 -ge (greater than or equal)
小于或等于 -le (less than or equal)
不相等 -ne (not equal)


  • 元字符:
    正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

单引号’'和双引号""

两者都是解决变量中间有空格的问题。

在bash中“空格”是一种很特殊的字符,比如在bash中这样定义str=this is String,这样就会报错,为了避免出错就得使用单引号’'和双引号""。

单引号’’,双引号"“的区别是单引号’‘剥夺了所有字符的特殊含义,单引号’'内就变成了单纯的字符。双引号”“则对于双引号”"内的参数替换($)和命令替换(``)是个例外。

比如说   n=3

echo ‘$n’

结果就是n3

改成双引号  echo “$n”,结果就是3

反引号``

反引号是命令替换,命令替换是指Shell可以先执行中的命令,将输出结果暂时保存,在适当的地方输出。语法:command


  1. 正则表达式针对文本
在这里插入代码片

匹配单个字符 i .

匹配一组字符
[]

元字符




需要加上 -P 才会支持元字符

POSIX字符类


*不需要转义
其他的好像都要转义


加了-E就不用\转义了

-w表示独立的单词

匹配邮箱???

sed 专题

Linux三剑客 grep sed …
vim交互式的文本编辑器
sed非交互式 文本编辑器

语法规则
sed+选项+命令+ 文件

1a 对第一行进行追加
$a对最后一行追加

追加和插入的区别
追加在后面
插入在当前

awk专题

  1. AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

lastb | grep -v “wtmp” | grep -v “^$” | cut -d " " -f 1 | sort | uniq -c | sort -rn | awk ‘BEGIN {printf(“hello\n”)} {printf("%-10s %-10s\n", $2, $1)} END {printf(“byebye\n”)}’

awk是编程语言环境,能实现c语言语言和变量赋值

cat /etc/passwd | awk -F: -v sum=0 ‘BEGIN {printf(“awk BEGIN\n”)} {if($3<1000){sum+=$3;printf("%s %s\n", $1, $3)}} END{printf(“awk END\nsum=%d\n”, sum)}’

命令行:
sum=0
cat /etc/passwd | awk -F: -v sum=$sum ‘BEGIN {printf(“awk BEGIN\n”)} {if($3<1000){sum+=$3;printf("%s %s\n", $1, $3)}} END{printf(“awk END\nsum=%d\n”, sum)}’
从外部赋值
echo $sum 输出0, awk中变量未返回给原变量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值