shell 编程

shell 编程

1.shell变量

  1. 定义变量
    定义变量时,变量名不需美元符号,变量名与等号之间不能有空格。
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,但是可以有下划线(_)
  • 不能使用标点符号,
  • 不能使用bash里的关键字。(可用help查看保留关键字)
    除了显式地赋值,还可以用语句给变量赋值,
for file in `ls /etc`
或
for file in $(ls /etc)
  1. 使用变量
    使用一个定义过的变量,只需在变量名前面加美元符即可:
string="abcd"
echo $string
  1. 只读变量
    使用readonly命令,将变量定义为只读变量,只读变量不能被改变
readonly string
  1. 删除变量
    使用unset命令,可以删除变量
  2. 变量类型
  • 局部变量
  • 环境变量
  • shell变量

2.shell 字符串

字符串可以用单引号,双引号,也可以不用引号。

  1. 单引号
  • 单引号的任何字符串都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字符串中,不能出现单独的一个单引号(转移符号+'也不行),但是可以成对出现,作为字符串的拼接使用。
  1. 双引号
your_name="abcd"
str1="hello,you are\"$your_name\"! \n"
echo -e $str1

双引号的优点:

  • 双引号里可以有变量
  • 双引号中可以有转义字符
  1. 拼接字符串
#双引号拼接
greeting="hello,"$your_name" !"
#单引号拼接
greeting="hello,'$your_name' !"
  1. 获取字符串的长度
    echo ${#str1}
  2. 提取子字符串
string1="abdadsjfafa"
#提取字符串的第2个字符开始截取4个字符
echo ${string1:1:4}
  1. 查找子字符串
    `

查找字符f或者a的位置

echo expr index "string1" fa
`

3.shell数组

  1. 定义数组
  • 用括号表示数组,数组元素用“空格”符号分开。
array_1=(1 2 3 4)
  • 还可以单独定义数组的各个分量
array_1[0]=1
array_1[1]=2
array_1[3]=3
  1. 读取数组
${数组名[下标]}
#使用@符号可以获取数组中的所有元素
echo ${array_1[@]}
  1. 获取数组长度
len1=${#array_1[@]}
#或者
len1=${#array_1[*]}
#取单个数组元素的长度
len2=${#array_1[n]}

4.shell传递参数

脚本内获取参数的格式为:$n。n=0为执行文件名(包含路径),n=1代表第一个参数,2为执行脚本的第二个参数,
另外还有几个特殊字符用来处理参数。

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个字符串显示所有参数
$@ *相同,使用时加引号,并在引号中返回每个参数,"@"的形式,输出为"1""2"..."$n"所有参数
$$ 脚本当前进程的ID号
$! 后台运行的最后一个ID号

5. shell中的[](包括双 中括号)

[]中与中间的代码应该有空格隔开
shell中的中括号可用于一些条件的测试:

  • 算术比较,比较一个变量是否为0,[ $var -eq 0 ]
  • 文件属性测试,比如一个文件是否存在,[ -e var ],是否为目录,[ -dvar ]
  • 字符串比较, [[ &var1 = $var2 ]]

6. shell基本运算符

  • 算术运算符
运算符 说明 例子
+ 加法 expr $a + $b
- 减法
* 乘法
/ 除法
% 取余
= 赋值
== 相等
!= 不相等
  • 关系运算符
运算符 说明 例子
-eq 检测两个数是否相等,相等返回True [ a -eqb ] 返回false
-ne 不相等返回True
-gt > ,返回True
-lt < ,返回True
-ge >=
-le <=
  • 布尔运算符
运算符 说明 例子
! 非运算 [ ! True ] 返回false
-o 或运算
-a 与运算
  • 字符串运算符
运算符 说明 例子
= 检测两个字符串是否相等,相等返回True [ a -eqb ] 返回false
!= 不相等返回True
-z 检测字符串长度是否为0 ,为0返回True
-n 检测字符串长度是否不为0 ,不为0 返回True
$ 检测字符串是否为空,不为空返回True
  • 文件测试运算符
操作符 说明 举例
-b file 检测文件是否是块设备文件
-c file 检测文件是否是字符设备文件
-d file 检测文件是否是目录
-f file 检测文件是否是普通文件(既不是目录也不是块设备)
-x file 检测文件是否可执行
-r file 检测文件是否可读
-w file 检测文件是否可写
-s file 检测文件是否为空(文件大小是否大于0)
-e file 检测文件是否存在

7.shell echo命令

echo 命令用于字符串的输出。
`
echo "it is a test"

双引号也可以省略

echo it is a test

显示转义字符

echo "" it is a test ""

结果是

"it is a test"
`

8 shell test命令

test 命令用于检查某个条件是否成立,他可以进行数值、字符、和文件三个方面的测试。
举例

a=5
b=6
if test $[a] -eq $[b]
then
    echo "两个数相等"
else
    echo "两个数不相等"
#if 反过来写,代表判断结构体结束
fi
#[]中括号代表执行基本的算术运算。
result=$[a+b]
echo $result

9 shell 流程控制

  1. if else
  • if
if condition
then
   command1
   command2
fi
  1. if else-if else
if conditon1
then
   command1
elif condition2
   command2
else
   command3
fi
  1. for 循环
    for 循环的一般格式
for var in item1 item2 ... itemn
do
    command1
    command2
    ...
done
  1. while 语句
    while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件,其格式为:
while condition
do
    command
done

无限循环

while
do
    command
done
#或者
while true
do
    command
done
  1. until 循环
    until循环执行一些列命令直至条件为true时停止。
    until 循环和while循环在处理方式上刚好相反。
    举例
a=0
until [ ! $a -lt 10 ]
do
    echo $a
    #let语句,用于执行一个或者多个表达式,变量中不需要加上$来表示变量,
    let "a++"
done
  1. case
    shell 的case语句为多选择语句,可以使用case语句匹配一个值与一个模式,如果匹配成功,执行相应命令。之后不再继续其他模式。如果无一匹配模式,使用*号捕获该值在执行后面的命令。
case 值 in
模式1)
    command1
    command2
    ...
    ;;
模式2)
    command1
    command2
    ...
    ;;
*)
    command1
    ;;
esac
  1. 跳出循环
  • break命令

  • continue 命令

10 shell函数

  1. 用户自定义函数
[ function ] funname [()]
{
    action;
    [return int;]
}
  • 1.可以带参数fun()定义,也可以不带任何参数
  • 2.参数返回,可以显示加 :return返回,如果不加,则以最后一条命令的运行结果作为返回值。
  1. 函数参数
    举例说明
funwithparam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "参数共有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funwithparam 1 2

11 shell 输入/输出重定向

重定向命令列表

命令 说明
command > file 将输出重定向到file
command < file 将输入重定向到file
command >> file 将输出以追加的方式重定向到file
n > file 将文件描述符为n的文件重定向到file
n >& m 将输出文件m和n合并
n <& m 将输入文件m和n合并
<<tag 将开始标记tag和结束标记tag之间的内容作为输入。

实例

who > users
#将who命令的完整输出重定向在用户文件中(users)。
#输出重定向会覆盖文件内容,
echo "abdansdf" > users
#此时users变为“abdansdf”,若果不希望内容被覆盖,可以使用>>将内容追加到文件末尾
  • 输入重定向
    和输出重定向一样,unix命令也可以从文件获取输入,语法为:
    command1 < file1
    实例
command1 < infile > outfile
#同时替换输入和输出,执行command1,从文件infile读取内容,然后 将输出写入到outfile中。
  • 重定向 深入讲解
    一般情况下,每个unix命令都会打开三个文件:
  • 标准输入文件(stdin):文件描述符为0
  • 标准输出文件(stdout):文件描述符为1
  • 标准错误文件(stderr):文件描述符为2
    默认情况下,command > file 将stdout重定向到file,command < file 将stdin重定向到file
    如果希望将stderr重定向到file,可以写成:
    command 2 > file
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354