shell 编程

Posted zhuzbyin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 编程相关的知识,希望对你有一定的参考价值。

shell变量

一、shell的变量体系和规则

  1.shell变量的字符串化。shell 允许用户建立变量存储数据,但是不支持数据类型,将任何值赋给变量都解释为一串字符串

  2.shell变量赋值语法严格。变量赋值时等号两边必须不能有空格

3.shell的四大变量体系:

  1).用户自定义变量

  2).位置变量,即命令行参数(./a.out nihao nihao是第一个变量),$1,$2,$3等

  3).预定义变量

  4).环境变量  (终端内使用 env查看环境变量,set查看所有的变量包括环境变量)

二、用户自定义变量

1.定义变量并赋值,格式:变量=value

2.向终端输出变量的值 echo

  对echo的说明:echo 字符串     (如果字符串加引号表示一个整体,不加引号用空格隔开表示多个字符串)

         -n:echo输出字符串自动加了换行,如果不加换行需要使用  echo -n xxx

         -e:echo支持转义字符如\n \t,需要加上-e选项

3.特殊字符

  $:   取变量的值

  #:   注释一行

  反引号或者$(): 将命令的结果赋给一个变量,推荐是用$()

  ‘ ’:单引号内的特殊符号是去意义

  " ":双引号内的特殊字符失去特殊意义除了  $ \  `(反引号),正因如此强烈推荐使用双引号

  \  : 特殊符号失去特殊意义,比如\$,原本$去变脸的内容就无效了

4.关于注释:

注释一行
# …
注释多行
:<<! … !

5.位置变量(非常重要)

$0 与键入的命令行一样,包含脚本文件名
$1,$2,……$9 分别包含第一个到第九个命令行参数
$# :    包含命令行参数的个数
[email protected]:    包含所有命令行参数:“$1,$2,……$9”
$?:   包含前一个命令的退出状态
$*:    包含所有命令行参数:“$1,$2,……$9”
$$ :   包含正在执行进程的ID号

三、shell程序和语句

说明性语句:
  以#号开始到该行结束,不被解释执行
功能性语句:
  任意的shell命令、用户程序或其它shell程序。
结构性语句:
  条件测试语句、多路分支语句、循环语句、循环控制语句等。

1.功能性语句

  read

    从终端读取数据

read从标准输入读入一行, 并赋值给后面的变量,
其语法为: read var
把读入的数据全部赋给var

read var1 var2 var3
把读入行中的第一个单词(word)赋给var1,
第二个单词赋给var2, ……把其余所有的词赋给最后一个变量

选项:

-p  显示提示信息
-t  在规定的时间(秒数)内输入,如果时间到达时还没有输入,
则不会给任何一个变量赋值
-n   规定输入的字符数,如果字符数足够,则立即赋值
-s   将输入的内容隐藏起来

 

expr

执行基本算术运算

算术运算命令expr主要用于进行简单的整数运算,
包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。
例子:
A=`expr 10 + 20`

使用其他方式计算
let
eg:let C=$A+$B
(())
eg: C=$(($A + $B))
[]
eg: C=$[$A / $B]

关系运算符:  

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 -- 文件属性
按照文件类型
-e 文件是否存在
-s 文件是否非空
-b 是否是块设备文件
-c 是否是字符设备文件
-d 是否是目录文件
-f 是否是普通文件
-L 是否是链接文件
-S 是否是套接字文件
-p 是否是管道文件

按照文件权限
-r 文件是否可读
-w 文件是否可写
-x 文件是否可执行

两个文件之间的比较
文件1 -nt 文件2 1比2新
文件1 -ot 文件2 1比2旧
文件1 -ef 文件2 二者是否inode节点一样(可以用来判断是否是硬链接)

 

逻辑运算:

  -a  逻辑与

  -o 逻辑或

  ! 逻辑非  

4.控制语句:

  

结构性语句主要根据程序的运行状态、输入数据、变
量的取值、控制信号以及运行时间等因素来控制程序的运
行流程。
主要包括:条件测试语句(两路分支)、多路分支语
句、循环语句、循环控制语句和后台执行语句等。

 

1 -- 条件测试语句
if后面需要加中括号[]
基本形式
if…then…fi
if [ 表达式 ]
then
...
fi

一般形式
if…then…else…fi
if [ 表达式 ]
then
...
else
...
fi

阶梯形式
if…then…elif…then…else…fi
if [ 表达式1 ]
then
命令表1
elif [ 表达式2 ]
then
命令表2
...
else
命令表n
fi

 

2 -- 多路分支语句语句
case…esac

case 变量 in
模式1)
  命令表1
  ;;
模式2)
  命令表2
  ;;
模式3)
  命令表3
  ;;
...
*)
命令表n
esac

 

4 -- 循环语句之while循环
while 表达式
do
命令表
done

练习:输入一个数字n,创建n个文件,file0 file1 file2…

5 -- 循环语句之until循环
until 表达式
do
命令表
done

while循环是如果表达式为真,则执行命令表,直到循环为假,则循环结束
until循环是如果表达式为假,则执行命令表,直到循环为真,则循环结束

 

 1 read -p "please input yes or no >>> " S
 2 
 3 case $S in
 4     yes | YES | Yes)
 5         echo "yes"
 6         ;;
 7     no | NO | No)
 8         echo "no"
 9         ;;
10     *)
11         echo "input error"
12         ;;
13 esac

for ...do...done

for 变量 in 单词表
do
命令表
done

for FILE in `ls -l`
do
    echo "$FILE"
done


for ((i = 0; i <= 10; i++))#这种写法适用了c语言的语法,需要括号内加括号
do
    echo "i = $i"
done
sum=0;
for((i=0;i<100;i++))
do
sum=`expr $sum + $i`#expr内的加号两边必须有空格,强语法规则
done
                                                                             
echo "1+2+3+...+100=$sum"

 

 

 

 

  

以上是关于shell 编程的主要内容,如果未能解决你的问题,请参考以下文章

代码片段:Shell脚本实现重复执行和多进程

Linux bash基础特性二

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

使用 Pygments 检测代码片段的编程语言

面向面试编程代码片段之GC