shell脚本语言

基础知识

  1. #bin/bash告知 linux 内核用哪个 shell 来执行所指定的 shell 脚本
  2. shell 识别三种基本命令
    (1)内建命令:就是 linux 的命令,例如 cd,ls,mkdir 等,这些命令是由于其必要性才内建的,内外一种命令的村子啊是为了效率,其中最典型的就是 test,
    (2)shell 函数: 功能健全的一系列程序代码,用 shell 语言写成,可以像使用命令一样使用,就是在 C++ 中调用函数。
    (3)外部命令:是由 shell 的副本(新的进程)所执行的命令,还是命令。
  3. shell 中的变量
    (1)变量的赋值方式: 变量名 = 值,中间不能有任何的空格。
    (2)用单引号包起来的后果是单引号里面的所有特殊符号都不具备特殊含义,用双引号包起来代表特殊符号有特殊含义。
  4. printf 命令
    (1)echo 会提供自动换行,printf 不会提供自动换行
    (2)printf 命令的完整语法分为两部分:
printf format-string [arguments....]
printf “%d,%s\n” 1 abc这里输出的是 1, abc。有没有引号都可以。

分析:printf 是命令,不解释。format-string 为格式控制字符串,arguments 为参数列表。
printf 命令不用加括号。 format-string 可以没有引号,但是最好加上,单双引号均可。参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换 arguments:使用空格分割,不用逗号。

如果没有 arguments %s 用 NULL 表示,%d 用 0 表示
例如 :printf “%s , %d\n” 输出结果为 0

  1. #基本的 I/O 重定向
    (1)使用 < 改变标准输入
    program<file` 可将 program 的标准输入修改为 file
    (2)使用 > 改变标准输出
    program>file` 可将 program 的标准输出修改为 file
    (3)使用 >> 附加到文件
    program>>file 可以将 program 的标准输出追加到 file 的结尾处。
    (4)以 | 符号建立管道
    program1 | program2 可将 program 的标准输出修改为 program2 的标准输入
  2. shell 中的两个特殊文件 “/dev/null” 和 “/dev/tty”
    (1)/dev/null 当被用作重定向输出时,程序的输出被直接丢弃。该文件用在哪些不关心程序输出的地方。 当被用作重定向输入时,输入则是文件结束。
    (2) /dev/tty 当被用作重定向时,表示重定向到终端。

正则表达式

  1. 正则表达式
    (1)元字符
    定义:元字符是这样一类字符,他们表达的是不同于字面本身的含义
  • shell元字符(也叫通配符) :由shell来解析,如rm -rf *
  • 正则表达式元字符:由各种执行模式匹配操作的程序来解析,如vi,grep,sed,python
    (2)基本元字符
  • ^: 匹配行首位置
  • $: 匹配行尾位置
  • .: 匹配单个字符
  • *: 匹配前导符0到多次
    如ro*t可以匹配出rt、root、rot等
  • .*: 任意多个字符
  • []: 匹配指定范围内的一个字符
    如[Rr]oot可以匹配出Root或root
  • [^]:取反
    如[^Rr]oot可以匹配出不是Root或root的字符
  • \:转义
  • \<:词首定位符,指前面不包含任何单词
  • \>:词尾定位符,指后面不包含任何单词
  • \(…\ ): 匹配稍后使用的字符的标签
    如 在vi中一般替换写成:%s/172.16.130.1/172.16.130.5/ 现在变成 :%s/ \(172.16.130.\)1 / \1.5/
  • x{m}:字符x重复出现m次
  • x{m,}:字符重复出现m次以上
  • x{m,n}:字符重复出现m到n次
    (3)扩展元字符
  • +:匹配一个或多个前导字符
  • ?: 匹配零个或一个前导字符
  • a|b:匹配a或b
  • ():组字符
  • (…)(…)\1\2 :标签匹配字符
  • x{m} :字符x重复m次
  • x{m,} :字符x重复至少m次
  • x{m,n} :字符x重复m到n次
  1. grep命令
    (1)格式
    grep [选项] PATTERN filename filename...
    如#grep 'Tom' /etc/passwd
    找到: grep返回的退出状态为0
    没找到: grep返回的退出状态为1
    找不到指定文件:grep返回的退出状态为2
    (2)grep程序的输入可以来自标准输入或管道,而不仅仅是文件
    (3)grep使用的元字符
    grep:使用基本元字符集
    egrep:使用扩展元字符集

\w 所有字母与数字,称为字符[a-zA-Z0-9]
\W 所有字母与数字之外的字符,称为非字符
\b 词边界 如‘\<love\>’ ====> '\blove\b

  1. sed命令
  2. awk命令

基础速查

一、变量
1、定义:
variable=value
variable='value'
variable="value"

单引号会对其原样输出,双引号会进行相应替换

2、${variable} 
	
{}用来标识边界 可以省略

3、将命令的结果赋值给变量
variable=`command`
variable=$(command)

4、只读变量
readonly myUrl

5、删除变量
unset variable_name


二、变量的作用域
1、全局变量
所谓全局变量,就是指变量在当前的整个 Shell 会话中都有效
函数内部定义的也是全局变量

2、局部变量
 local a=99
 
3、环境变量
全局变量只在当前 Shell 会话中有效,如果使用export命令
将它导出,那么它就在所有的子 Shell 中也有效了,这称为“环境变量”

$ export a    #将a导出为环境变量

三、Shell位置参数(命令行参数)
例如:
#!/bin/bash
echo "Language: $1"
echo "URL: $2"

运行:$ . ./a.sh Shell http://c.biancheng.net/shell/
运行结果:
Language: Shell
URL: http://c.biancheng.net/shell/
其中Shell是第一个位置参数,http://c.biancheng.net/shell/是第二个位置参数。

注意事项
如果参数个数太多,达到或者超过了 10 个,那么就得用${n}的形式来接收了,例如 ${10}、${23}。{ }的作用是为了帮助解释器识别参数的边界,这跟使用变量时加{ }是一样的效果。

四、Shell特殊变量
$0			当前脚本的文件名。
$n(n≥1)	传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
$#			传递给脚本或函数的参数个数。
$*			传递给脚本或函数的所有参数。
$@			传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同
$?			上个命令的退出状态,或函数的返回值,我们将在《Shell $?》一节中详细讲解。
$$			当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

注意:
当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔
但是当它们被双引号" "包含时,就会有区别了:
"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
从for循环可以看出来
对于"$*",只循环了 1 次,因为它只有 1 分数据;对于"$@",循环了 5 次,因为它有 5 份数据。

五、shell字符串
1、例如:
#!/bin/bash
n=74
str1=c.biancheng.net$n str2="shell \"script\" $n"
str3='C语言中文网 $n'
echo $str1
echo $str2
echo $str3

运行结果:
c.biancheng.net74
shell "script" 74
C语言中文网 $n

2、获取字符串长度
${#string_name}

六、shell数组
1、例如:
nums=(29 100 13 8 91 44)  可以直接nums[6]=88 增加元素
arr=(20 56 "http://c.biancheng.net/shell/") 弱类型
ages=([3]=24 [5]=19 [10]=12)  数组赋值

2、获取数组元素的值
${array_name[index]}	echo ${nums[3]}

@或*可以获取数组中的所有元素
${nums[*]} 
${nums[@]}
例如:
nums=(29 100 13 8 91 44)
echo ${nums[@]}  #输出所有数组元素
nums[10]=66  #给第10个元素赋值(此时会增加数组长度)
echo ${nums[*]}  #输出所有数组元素
echo ${nums[4]}  #输出第4个元素

运行结果:
29 100 13 8 91 44
29 100 13 8 91 44 66
91

3、获取数组长度
${#array_name[@]}
${#array_name[*]}

七、shell数组拼接
array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})

八、删除数组元素
unset array_name[index]

unset array_name  删除整个数组


九、流程控制

1、if语句

				if condition
then
    command1 
    command2
    ...
    commandN 
fi

				if-else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

				if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

2、for循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

3、while循环

while condition
do
    command
done

4、case
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac```
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值