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 编程的主要内容,如果未能解决你的问题,请参考以下文章