第一个shell脚本
- shell 脚本通常是以#!起始的文本文件
Linux环境下的任何脚本文件都是以一个被称为 shebang 的特殊行作为起始的。
在这行中,字符 #! 被置于解释器路径之前。/bin/bash是Bash的绝对路径。
#!/bin/bash
- #!(shebang): # sharp,!bang
- 除了第一行#,其余#都是注释
- 命令有2种执行方式:
- 命令行
- 写在文件中作为脚本
- 脚本有2种执行方式:
- 将脚本作为sh命令的参数(bash解释文件)
- 将脚本文件作为具有执行权限的可执行文件(文件加上可执行权限)
shell程序读取脚本的首行,查看shebang行是否为#!/bin/bash/。它会自动识别/bin/bash.并在内部以如下命令执行该脚本文件。
变量
-
变量类型无需显示声明(在解释过程中自动判断)
- 统一按照字符串处理(sort时会发现10排在2前面)
- 根据对变量的操作变化类型
-
$取变量的值
$[]数值计算 -
赋值(a=10)不能空格(a = 10),否则会被认为是命令
清空变量(unset a)
-
变量区分大小写,系统变量一般大写
特殊变量
位置变量
- $0
- $n
- $*
- $@
- $#
状态变量
数组
-
索引数组(索引赋值,批量赋值)
-
关联数组
数组操作
- a+=(0 1 2 3 4 5 67 8) 数组追加会清空,并重新赋值
- a=(0 1 2 3 4 5 6 7 8) a=(8 7 6 5 4 3 2 1 0) 数组覆盖
- 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
和echo区别:没有默认的换行符,需要手动添加“\n”
函数
#!/bin/bash
function test() {
echo [$1]
}
test "kkb"
echo "[$1]"
- #function 函数名() {函数体}
- {}中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 $(( (ab)%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
- 正则表达式针对文本
在这里插入代码片
匹配单个字符 i .
匹配一组字符
[]
元字符
需要加上 -P 才会支持元字符
POSIX字符类
*不需要转义
其他的好像都要转义
加了-E就不用\转义了
-w表示独立的单词
匹配邮箱???
sed 专题
Linux三剑客 grep sed …
vim交互式的文本编辑器
sed非交互式 文本编辑器
、
语法规则
sed+选项+命令+ 文件
1a 对第一行进行追加
$a对最后一行追加
追加和插入的区别
追加在后面
插入在当前
awk专题
- 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中变量未返回给原变量