文档章节

Shell学习笔记

小灰灰Blog
 小灰灰Blog
发布于 2017/05/21 16:01
字数 1398
阅读 22
收藏 1
点赞 0
评论 0

1. 变量

声明变量

  • a-zA-Z 开头,不包含特殊字符
  • 等号两边没有空格
  • 不与保留字符重名
PATH="/user/yihui"

使用

  • 变量前加 $ 符号,表示引用变量, 可以用 {} 进行变量名的圈定
  • 支持变量的重新赋值
  • readonly修饰变量为不可更改
  • unset 删除变量(且无法再次声明和使用,只读变量无法删除)
PATH="/user/yihui"
echo "the path is ${PATH}/tmp"


PATH="/test"
echo "after modify, the new path is ${PATH}/tmp"


readonly PATH
PATH="/new"
// 输出为: 
the path is /user/yihui/tmp
after modify, the new path is /test/tmp
./in.sh: line 12: PATH: readonly variable

特殊变量

Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

  1. $$ 表示当前Shell进程的ID,即pid
  2. $0 当前的脚本名
  3. $# 传递给脚本或函数的参数个数。
  4. $n 传递给脚本或函数的参数。n是一个数字,表示第几个参数,例如,第一个参数是$1,第二个参数是$2
  5. $? 上个命令的退出状态,或函数的返回值
  6. $* 传递给脚本或函数的所有参数
  7. $@ 传递给脚本或函数的所有参数, 与$*区别在于被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
echo "current pid:$$"

echo "arg num: $#"

echo "shell name: $0"

echo "second arg: $2"

echo "last return $?"

for var in $*:
do
    echo "$var"
done

echo "\$*=" $*
echo "\$*=$*"



for var in $@:
do
    echo "$var"
done
echo "\$*=" $@
echo "\$@=$@"
current pid:36886
arg num: 4
shell name: ./in.sh
second arg: hello
last return 0
test
hello
wolrd
123:
$*= test hello wolrd 123
$*=test hello wolrd 123
test
hello
wolrd
123:
$*= test hello wolrd 123
$@=test hello wolrd 123

2. 替换

命令替换

限制性shell命令,并将结果保存在变量之中

用反引号,将shell命令包含起来即可

Data=`date`
echo "data is $Data"

UNUM=`who | wc -l`
echo "current user num: $UNUM"
data is 2017年 5月21日 星期日 14时54分19秒 CST
current user num:        2

变量替换

上面使用 ${varName} 来表示变量,放在双引号中时,会自动被值替换,下面给出一些扩展

  • 单引号('')之内的变量不会被替换
  • ${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值
  • ${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word
  • ${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。 若此替换出现在Shell脚本中,那么脚本将停止运行
  • ${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值

3. 运算&判断

数学运算

使用 expr xxx

  • expr $a + $b 表示两数相加

数学判断

  • -eq 是否相等 相当于 ==
  • -ne 是否不等 相当于 !=
  • -gt 大于
  • -ge 大于等于
  • -lt 小于
  • -le 小于等于

布尔运算

  • ! 取非
  • -o 或运算,有一个满足即可
  • -a 与运算,两个都满足才对

注意

条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]

#!/bin/sh

a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a is equal to b"
fi

if [ $a != $b ]
then
   echo "a is not equal to b"
fi

输出

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b

字符串运算

  • = 表示字符串是否相等
  • != 表示字符串是否不等
  • -Z 检测长度是否为0, 是则为true
  • -n 检测长度是否不为0,非0则为true
  • str 检测字符串是否为空 , 非空则为true
  • 字符串长度 ${#varName}
  • 字符串切割 ${arName:1:4}
a="hello"
b="world"

if [ $a = $b ];then
    echo "a equal b"
elif [ $a != $b ];then
    echo "a not equal b"
fi


if [ $a ];then
    echo "$a is not blank"
fi

if [ -n $a ];then
    echo "$a's length bigger then 0"
fi

echo "$a's length ${#a}"
echo "$a index of 1, 4 is ${a:1:4}"
a not equal b
hello is not blank
hello's length bigger then 0
hello's length 5
hello index of 1, 4 is ello

4. 数组

声明

ary=(value1 value2 value3)

读取

第0个元素: ${ary[0]}

所有元素: $ary[*] $ary[@]

长度 : ${#ary[*]}

ary=('hello' 'world' 'java' 'shell')
echo $ary

echo ${ary[1]}

echo "all cell is : ${ary[*]}"

echo "length ${#ary[*]}"
hello
world
all cell is : hello world java shell
length 4

5. 条件语句

if语句

语法:

if [ condition ]; then
  xxx
elif [ condition ]; then
  xxx
else 
  xxx
fi

switch语句

语法:

case value in:
v1)
  xxx
  xxx
  ;;
v2)
  xxx
  xxx
  ;;
*) 
  xxx
  ;;;
esac

测试

ary=('hello' 'world' 'java' 'shell')

if [ ${ary[0]} = 'helo' ];then
    echo "first cell is helo"
elif [ ${ary[0]} = 'hello' ];then
    echo "first cell is hello"
else
    echo "default"
fi


read option

case $option in
${ary[0]}):
    echo "print hello"
    ;;
${ary[1]}):
    echo "print world"
    ;;
${ary[2]}):
    echo "print java"
    ;;
${ary[3]}):
    echo "print shell"
    ;;
*):
    echo "print other"
    ;;
esac

输出

first cell is hello
java  <-- 这个是自己输入的
print java

6. 循环

for循环

语法

for 变量 in 列表:
do
  xxx
done

for ((i=0;i<$#;i++)):
do
  xxx
done
ary=('hello' 'world' 'java' 'shell')

for i in ${ary[*]}
do
    echo $i
done

for ((i=0;i<10;i++))
do
    printf "%d %s" $i ' '
done

输出

hello
world
java
shell
0  1  2  3  4  5  6  7  8  9

while循环

语法

while condition
do
  xxx
done
COUNTER=0
while [ $COUNTER -lt 5 ]
do
    COUNTER='expr $COUNTER+1'
    echo $COUNTER
done

until循环

循环执行,直到条件为true时停止,语法同while

ary=('hello' 'world' 'java' 'shell')

i=0
until [ ${ary[$i]} = 'world' ]
do
    i=`expr $i + 1`
    echo $i
done
1

break, continue

循环的控制

7. 引入文件

前面加一个点号, 引入文件,则可以直接访问文件中的变量

. fileName

© 著作权归作者所有

共有 人打赏支持
小灰灰Blog
粉丝 162
博文 162
码字总数 269342
作品 0
武汉
程序员

暂无文章

CoreText进阶(七)-添加自定义View和对其

CoreText进阶(七)-添加自定义View和对其 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更多...

aron1992
12分钟前
0
0
Python爬虫 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类。个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇。 据书上说...

p柯西
23分钟前
0
0
在Java中,你真的会日期转换吗

1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormatis a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows fo......

Java小铺
32分钟前
0
0
Linux系统梳理---系统搭建(二):tomcat的安装和使用

上一章讲到JDK的安装使用,这一章主要记录下服务器tomcat的安装以及部署一个项目. 1.下载tomcat,这里下载的是apache-tomcat-8.5.32.tar.gz 2.创建文件夹,便于管理,和JDK一样,在usr目录下创建t...

勤奋的蚂蚁
42分钟前
0
0
ES15-聚合

1.Terms Aggregation 分组聚合 2.Filter Aggregation 过滤聚合

贾峰uk
43分钟前
0
0
【2018.07.19学习笔记】【linux高级知识 20.27-20.30】

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数

lgsxp
46分钟前
0
0
10.32/10.33 rsync通过服务同步~10.35 screen工具

通过服务的方式同步要编辑配置文件:[root@linux-xl ~]# vim /etc/rsyncd.confport=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pidaddress=192.168.43.21[tes...

洗香香
49分钟前
0
0
与女儿谈商业模式 (3):沃尔玛的成功模式

分类:与女儿谈商业模式 | 标签: 经济学 沃尔玛 陈志武 2007-05-10 09:09阅读(11279)评论(30) 与女儿谈商业模式 (3):沃尔玛的成功模式 陈志武 /文 沃尔玛(Wal-Mart)是另一个有意思的财...

祖冲之
56分钟前
0
0
网页加载速度优化方法总结

1、减少请求 最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。 2、整合资源 对开发...

Jack088
今天
0
0
dubbo学习

https://blog.csdn.net/houshaolin/article/details/76408399

喵五郎
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部