shell编程编程1

一、变量和备注

1.1.备注:和普通的编程语言一样,用井号后面内容(#)来表示备注
1.2.变量:变量分为系统变量和用户变量,在shell中经常用到系统变量,通常使用 美元符号 变量名称 来引用变量

变量名和等号之间不能有空格。同时,变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用 bash 里的关键字(可用 help 命令查看保留关键字)
例如:

echo $PATH

除了直接赋值,还可以用语句给变量赋值

for file in `ls /etc`

注意:定义变量时等号前后不要有空格,$后面跟着变量名来引用
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://www.baidu.com"

=左右不要有空格
如果内容有空格,需要使用单引号或者双引号
双引号支持转移 $ 开头的遍历会被自动替换

1.3、变量的使用
echo $a
echo ${b}
echo "$a"
使用$var或者${var}来访问遍历 后者更为严谨
遍历不需要定义也可以使用,引用未定义的遍历,默认为空值

预定义变量


预定义变量

数组变量
使用()来定义数组变量,中间使用空格隔开
例如

array=(1 2 3 4)
array=('ls')

 echo ${array[2]};
echo ${array[*]}
echo ${#array[*]}
···

####二、获取用户输入
获取用户输入就需要用到read命令

echo "please input your name: "
read name
echo "You nam is $name"`

获取用户输入的多个输入

echo "please input your name: "
read name1 name2 name3
echo "You nam is name1,name2, $name3"`

按照空格取值,不够的输入空,多的在最后一个打印出来
想要换行 就是在read后面加入-p

read -p "please input your username: " name
read -sp "please input your password: " pw

这里的-s在密码输入的时候用到,输入过程看不到输入的内容

echo "Your nam is name"` echo "Your password ispw"`

这里要了解位置参数
从命令行传递到脚本的参数:```$0,$1,$2,$3...```
```$0 就是脚本文件自身的名字,$1 是第一个参数,$2 是第二个参数,$3 是第三个参数,然后是第四个。$9 之后的位置参数就必须用大括号括起来了,比如,${10},${11},${12}。
$# : 传递到脚本的参数个数
$* : 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9 个
$$ : 脚本运行的当前进程 ID 号
$! : 后台运行的最后一个进程的进程 ID 号
$@ : 与 $* 相同,但是使用时加引号,并在引号中返回每个参数
$: 显示 shell 使用的当前选项,与 set 命令功能相同
$? : 显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。

三、特殊符号

3.1.#注释

echo The # 这里开始一个注释
3.2.;(分号)

使用分号 ; 可以在同一行上写两个或两个以上的命令。

echo hello; echo there
3.3..(点号)
source filename.sh 
. filename.sh
3.4.引号

3.4.1单引号
阻止 STRING 中所有特殊字符的解释,这是一种比使用"更强烈的形式
3.4.2 双引号
阻止(解释)STRING 中大部分特殊的字符
3.5.斜线和反斜线
3.5.1斜线
文件名路径分隔符
例如D:\Program Files\MuMu

3.5.2反斜线

D:\Program Files\MuMu
\n 表示新的一行
\r 表示回车
\t 表示水平制表符
\v 表示垂直制表符
\b 表示后退符
\a 表示"alert"(蜂鸣或者闪烁)
\0xx 转换为八进制的 ASCII 码, 等价于 0xx
" 表示引号字面的意思

3.6.`(反引号)
cp `mkdir back` test.sh back
#先创建了 back 目录,然后复制 test.sh 到 back 目录。
3.7.:冒号

3.71.空命令
什么作用都没有
3.7.2变量扩展/子串替换
与 > 重定向操作符结合使用时,会把一个文件清空,不会修改这个文件的权限。如果之个文件并不存在,那么就创建这个文件

: > test.sh   # 文件“test.sh”现在被清空了
# 与 cat /dev/null > test.sh 的作用相同
# 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
3.8.?问号

测试操作符

 #!/bin/bash
 a=10
 (( t=a<50?8:9 ))
 echo $t
3.9.$一直在用

3.10.()小括号
命令组:在括号中的命令列表,将会作为一个子 shell 来运行

#!/bin/bash
a=123
( a=321; )
echo "$a" #括号将判断为局部变量,所以a的值为123而不是321

初始化数组

arr=(1 4 5 7 9 21)
echo ${arr[3]}
3.11、{} 大括号

文件名扩展

if [ ! -w 't.txt' ];
then
    touch t.txt
fi
echo 'test text' >> t.txt
cp t.{txt,back}#在大括号中不允许有空白,除非这个空白被引用或转义

代码块

3.12.[]中括号

3.12.1、条件测试

a=5
if [ $a -lt 10 ]
then
    echo "a: $a"
else
    echo 'a>=10'
fi

3.12.2、数组元素
在一个 array 结构的上下文中,中括号用来引用数组中每个元素的编号

arr=(11 21 31)
arr[0]=10
echo ${arr[0]}
3.13、< 和 > 尖括号

3.13.1、重定向
test.sh > filename:重定向 test.sh 的输出到文件 filename 中。如果 filename 存在的话,那么将会被覆盖。
test.sh &> filename:重定向 test.sh 的 stdout(标准输出)和 stderr(标准错误)到 filename 中。
test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。
test.sh >> filename:把 test.sh 的输出追加到文件 filename 中。如果 filename 不存在的话,将会被创建。

3.14.|(竖线)

分析前边命令的输出,并将输出作为后边命令的输入,产生命令链。

chmod 755 test.sh #给文件test.sh赋权限
ls -l | ./test.sh #输送 ls -l 的输出到一个脚本中
3.15.-(破折号)

3.15.1选项,前缀
在所有的命令内如果想使用选项参数的话,前边都要加上“-”
15.2用于重定向 stdin 或 stdout

#用于备份最后 24 小时当前目录下所有修改的文件
BACKUPFILE=backup-$(date +%m-%d-%Y)
# 在备份文件中嵌入时间.
archive=${1:-$BACKUPFILE}
#  如果在命令行中没有指定备份文件的文件名,
#  那么将默认使用"backup-MM-DD-YYYY.tar.gz".
tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
exit 0

四、基本的预算符号

4.1.算数运算符

例如:

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 == b"
fi
if [ $a != $b ]
then
   echo "a != b"
fi
原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
注意使用的反引号(esc 键下边)
表达式和运算符之间要有空格 $a + $b 写成 $a+$b 不行
条件表达式要放在方括号之间,并且要有空格 [ $a == $b ] 写成 [$a==$b] 不行
可以用expr判断一个字符串是否是整数
awk可以实现整数和小数计算:
awk "2.1 2.5"|awk '{print $1-$2}'
格式化显示可以用:
awk "3.134 2.532" |awk '{printf("%.2\n", $1-$2)}'
乘号(*)前边必须加反斜杠(\)才能实现乘法运算

4.2.关系运算符

-eq:检测左边的数是否相等,如果相等,返回true
-ne:检测左边的数是否不相等,如果不相等,返回true
-gt:检测左边的数是否大于右边的,如果是,返回true
-lt:检测左边的数是否小于右边的,如果是,返回true
-ge:检测左边的数是否大于等于右边的,如果是,返回true
-le:检测左边的数是否小于等于右边的,如果是,返回true
例如

a=5
b=10

if [ $a -eq $b ]
then
   echo "$a -eq $b : a == b"
else
   echo "$a -eq $b: a != b"
fi
4.3.逻辑运算符

&&: 逻辑的AND
|| :逻辑的OR

a=5
b=10
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "return true"
else
   echo "return false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "return true"
else
   echo "return false"
fi
4.4.字符串运算符
a="abc"
b="efg"
if [ $a = $b ]
then
   echo "$a = $b : a == b"
else
   echo "$a = $b: a != b"
fi
if [ -n $a ]
then
   echo "-n $a : The string length is not 0"
else
   echo "-n $a : The string length is  0"
fi
if [ $a ]
then
   echo "$a : The string is not empty"
else
   echo "$a : The string is empty"
fi
4.5字符串操作

取值

掐头趣味与内容替换

4.6.文件测试运算符
image.png
file="/home/shiyanlou/test.sh"
if [ -r $file ]
then
   echo "The file is readable"
else
   echo "The file is not readable"
fi
if [ -e $file ]
then
   echo "File exists"
else
   echo "File not exists"
fi
4.7.浮点型计算

bash默认是不支持浮点型数字计算,需要安装bc软件,然后通过bc才能计算浮点型。
安装bc

sudo apt-get update
sudo apt-get install bc

#加法运算
n1=3.45
n2=0.78
echo "3.45+0.78" | bc
#乘法运算
r=3.4
pi=3.14159
g=$(echo "scale=4; 3.14 * 2 * $r" | bc)
a=$(echo "scale=4; 3.14 * $r * $r" | bc)
echo "g=$g"
echo "a=$a"
注意:运行Bash的脚本的方式有:

sh filename.sh
bash filename.sh

../filename.sh

source filename.sh
. filename.sh

chomd u+rx filename.sh 赋权限并运行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342