技术流ken

运维拯救世界

DAY19: 课堂记录–shell编程(二)–技术流ken

变量定义

 

第一种方式:

[root@ken ~]# name=ken

 

第二种方式:

[root@ken ~]# age=’18’

 

第三种方式:

[root@ken ~]# gender=”male”

 

 

变量命名规范

 

变量的命名也要做到见名知意

 

1.变量的命名不能以数字开头

[root@ken ~]# 2name=ke
-bash: 2name=ke: command not found

 

2.数字只要不放在开头即可

[root@ken ~]# name2=ken

 

3. 可以以下划线开头  #下划线可以放在任意位置

[root@ken ~]# _name=ken

 

4. 以字母开头

[root@ken ~]# name=ken

 

使用变量

 

第一种方式:

变量名前加上$符号

[root@ken ~]# echo $name
ken

 

第二种方式:

[root@ken ~]# echo ${name}
ken

 

什么情况下使用花括号格式的那?

为了区分开来变量及后面的字符串,即变量和字符串写在一起的时候需要使用花括号进行变量的隔离

[root@ken ~]# echo “this is $names computer”
this is computer

[root@ken ~]# echo “this is ${name}s computer”
this is kens computer

 

[root@ken ~]# echo “this is ${name}\$s computer”   #多个$可以jia\进行转义
this is ken$s computer

 

临时变量和环境变量

 

临时变量只在当前shell生效

例子1:

[root@ken ~]# name=ken
[root@ken ~]# echo $name
ken
[root@ken ~]# bash
[root@ken ~]# echo $name

 

环境变量在当前和子shell中是生效的

[root@ken ~]# export name   #临时声明某个变量为环境变量

[root@ken ~]# bash
[root@ken ~]# echo $name
ken

 

修改变量的值

 

其实就是重新赋值

[root@ken ~]# name=ken
[root@ken ~]# echo $name
ken

[root@ken ~]# name=oscar
[root@ken ~]# echo $name
oscar

 

单引号,双引号,反引号的区别

单引号:所见即所得

例子1:

[root@ken ~]# name=oscar
[root@ken ~]# echo $name
oscar
[root@ken ~]# echo ‘this is $name’
this is $name

 

双引号:对变量进行转义解释

例子1:

[root@ken ~]# echo “this is $name”

this is oscar

 

反引号:执行命令

[root@ken ~]# list_root=`ls -l`
[root@ken ~]# echo $list_root
total 102432 -rw——-. 1 root root 1206 Feb 26 22:25 anaconda-ks.cfg -rw-r–r– 1 root root 0 Mar 11 19:08 a.out -rw-r–r– 1 root root 31 May 29 09:55 hello_w.sh drwxr-xr-x 3 root root 80 Mar 11 18:18 ken1 -rw-r–r– 1 root root 985 May 30 09:50 test lrwxrwxrwx 1 root root 4 Mar 12 11:06 test1 -> test -rw-r–r– 1 root root 4 Mar 12 11:09 test2 -rw-r–r– 1 root root 61 May 29 18:33 test2.sh -rw-r–r– 1 root root 30 May 29 18:34 test3.sh -rw-r–r– 1 root root 76 May 29 18:35 test4.sh -rw-r–r– 1 root root 61 May 29 20:35 test.sh -rw-r–r– 1 root root 104857600 Mar 12 18:03 test.txt

例子2:

[root@ken ~]# touch `date “+%F”`.txt
[root@ken ~]# ls
2019-05-30.txt

 

第一种写法:反引号

第二种写法:执行命令的另一种写法:$()

[root@ken ~]# com_file=$(find ./ -type f)
[root@ken ~]# echo $com_file
./.bash_logout ./.bash_profile ./.bashrc ./.cshrc ./.tcshrc ./anaconda-ks.cfg ./.bash_history ./test.txt ./ken1/1.txt ./ken1/2.txt ./ken1/3.txt ./ken1/4.txt ./ken1/5.txt ./.lesshst ./a.out ./test2 ./hello_w.sh ./test2.sh ./test3.sh ./test4.sh ./test ./test.sh ./2019-05-30.txt ./.viminfo

 

 

删除变量

 

[root@ken ~]# echo $name
oscar
[root@ken ~]# unset name
[root@ken ~]# echo $name

 

只读变量的定义:

[root@ken ~]# name=ken
[root@ken ~]# readonly name

 

尝试删除变量

[root@ken ~]# unset name
bash: unset: name: cannot unset: readonly variable

 

变量类型

 

局部变量

环境变量

shell变量

 

shell变量

 

[root@ken ~]# cat test.sh
#!/bin/bash
echo “脚本名称:$0”
echo “这是传递的第一个参数:$1”
echo “这是传递的第二个参数:$2”
echo “一共传递了$#个参数”
echo “这些传递的参数是:$*”

[root@ken ~]# bash test.sh ken 18
脚本名称:test.sh
这是传递的第一个参数:ken
这是传递的第二个参数:18
一共传递了2个参数
这些传递的参数是:ken 18

 

退出状态

 

$?可以表示上个命令的执行结果状态

如果是成功的则会返回0

如果失败则会返回非0

 

例子1:判断命令是否执行成功

[root@ken ~]# echo $?
127
[root@ken ~]# ls
2019-05-30.txt a.out ken1 test1 test2.sh test4.sh test.txt
anaconda-ks.cfg hello_w.sh test test2 test3.sh test.sh
[root@ken ~]# echo $?
0

 

 

整数比较符

 

-eq: equal 相等

-ne: not equal 不相等

-le: lesser equal 小于等于

-ge: greater equal 大于等于

-lt: lesser than小于

-gt: greate than 大于

 

条件判断

 

[]

[ 1 -eq 1 ]

1.条件表达式的括号里面前后都要有空格

 

例子1:

[root@ken ~]# [ 1 -eq 1 ] && echo “1” || echo “2”
1

 

例子2:

[root@ken ~]# [ 1 -eq 1 ] && echo “1” || echo “2” || echo “3”
1
[root@ken ~]# [ 1 -eq 1 ] && echo “1” || echo “2” && echo “3”
1
3

 

例子3:

[root@ken ~]# [ 1 -lt 1 ] && echo “1” || echo “2”
2

 

 

注释:

&&: 表示的含义是前面的命令执行成功,&&后面的命令才会执行

||:表示的含义是前面的命令执行失败,||后面的命令才会执行

 

例子1: eq

[root@ken ~]# [ 1 -eq 1 ] && echo 1 || echo 2
1

 

例子2:ne

[root@ken ~]# [ 1 -ne 1 ] && echo 1 || echo 2
2

 

例子3:le

[root@ken ~]# [ 1 -le 1 ] && echo 1 || echo 2
1

 

例子4:ge

[root@ken ~]# [ 1 -ge 1 ] && echo 1 || echo 2
1

 

例子5:lt

[root@ken ~]# [ 1 -lt 1 ] && echo 1 || echo 2
2

 

例子6:gt

[root@ken ~]# [ 1 -gt 1 ] && echo 1 || echo 2
2

 

字符串比较符

 

== : 判断两个字符串是否相等

!=: 判断两个字符串不相等

-n: 判断字符串是否不为空

-z: 判断字符串是否为空

 

注意:在判断字符串的时候一定要加上双引号!

 

例子1:==

[root@ken ~]# name=ken

[root@ken ~]# [ “$name” == “ken” ] && echo 1 || echo 2
1

 

例子2:!=

[root@ken ~]# [ “$name” != “ken” ] && echo 1 || echo 2
2

 

例子3:-n

[root@ken ~]# [ -n “$name” ] && echo 1 || echo 2
1

 

例子4:-z

[root@ken ~]# [ -z “$name” ] && echo 1 || echo 2
2

 

文件测试

 

-e: exist 存在即为真 #可以判断目录和文件

-f: 存在且为普通文件

-d: 存在且为目录

 

例子1:-e

[root@ken ~]# [ -e /etc/passwd ] && echo 1 || echo 2
1
[root@ken ~]# [ -e /etc/passwdd ] && echo 1 || echo 2
2
[root@ken ~]# [ -e /etc ] && echo 1 || echo 2
1
[root@ken ~]# [ -e /etcd ] && echo 1 || echo 2
2

 

例子2:-f

[root@ken ~]# [ -f /etc/passwd ] && echo 1 || echo 2
1
[root@ken ~]# [ -f /etc/passwdd ] && echo 1 || echo 2
2
[root@ken ~]# [ -f /etc ] && echo 1 || echo 2
2

 

例子3:-d

[root@ken ~]# [ -d /etc ] && echo 1 || echo 2
1
[root@ken ~]# [ -d /etc/passwd ] && echo 1 || echo 2
2
[root@ken ~]# [ -d /etc/passwddd ] && echo 1 || echo 2
2

 

布尔运算符

 

!: 取反

-a: && 和

-o:|| 或

布尔运算符通常用在[]

 

例子1:!

[root@ken ~]# [ ! 1 -eq 1 ] && echo 1 || echo 2
2

 

例子2:-a

[root@ken ~]# [ 1 -eq 1 -a 2 -lt 2 ] && echo 1 || echo 2
2

-a:

条件一:           条件二        合

true                    true             true

true                    false            false

false                   true             false

false                   false            false

 

例子3:-o

[root@ken ~]# [ 1 -eq 1 -o 2 -lt 2 ] && echo 1 || echo 2
1

 

[root@ken ~]# [ 1 -eq 2 -o 2 -lt 2 ] && echo 1 || echo 2
2

 

-o:

条件一:           条件二        合

true                    true             true

true                    false            true

false                   true             true

false                   false            false

 

逻辑判断符

 

第一种用法:

[root@ken ~]# [[ 1 -eq 1 && 2 -eq 2 ]] && echo 1 || echo 2
1

 

第二种用法:

[root@ken ~]# [ 1 -eq 1 ] && [ 2 -eq 2 ^C&& echo 1 || echo 2

&&: 前面的命令执行成功就会执行后面的命令

||: 前面的命令执行失败就会执行后面的命令

 

 

整数运算

 

例子1:*

[root@ken ~]# num=$((2*4))
[root@ken ~]# echo $num
8

 

例子2:+
[root@ken ~]# num1=$((2+4))
[root@ken ~]# echo $num1
6

 

例子3:-
[root@ken ~]# num2=$((num1-4))
[root@ken ~]# echo $num2
2

 

例子4:/
[root@ken ~]# num3=$((num2/2))
[root@ken ~]# echo $num3
1

 

例子5:%
[root@ken ~]# num4=$((5%2))
[root@ken ~]# echo $num4
1

 

例子6:**

[root@ken ~]# num5=$((5**2))
[root@ken ~]# echo $num5
25

 

例子7:

[root@ken ~]# num6=$((3/2))
[root@ken ~]# echo $num6
1

 

整数运算 — let

 

自加一

写法一:推荐写法

[root@ken ~]# num=1
[root@ken ~]# let num++
[root@ken ~]# echo $num
2

 

写法二:

[root@ken ~]# let num+=1
[root@ken ~]# echo $num
3

 

写法三:

[root@ken ~]# let num=num+1
[root@ken ~]# echo $num
4

 

自减–》上同

例子2:

[root@ken ~]# let num+=2
[root@ken ~]# echo $num
6

 

bc

[root@ken ~]# yum instal bc -y

 

例子1:

[root@ken ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.

1+1
2

3*6
18

 

例子2:

[root@ken ~]# echo “1+1” | bc
2

 

 

 

 

发表评论

电子邮件地址不会被公开。