shell基础之bash
一直单单知道部署服务器等命令,shell语言还没有用心学习过,简单的学习下以供不时之需
.sh:bash脚本文件
很多时候需要多个命令来完成一项工作,而这个工作又常常是重复的,这个时候我们自然会想到将这些命令写成sh脚本,下次执行下这个脚本一切就都搞定了,下面就是发布代码的一个脚本示例。
需要注意的是,BASH 程序被执行后,实际上 Linux 系统是另外开设了一个进程来运行的。故,BASH 程序是在一个新的进程中运行的,所以该程序中的变量定义和赋值不会改变其他进程或原始 Shell 中同名变量的值,也不会影响他们的运行。
#在demo中编辑脚本执行命令
vi demo.sh
#声明文件类型,并且该文件是一个bash程序,需要由/bin目>录下的bash程序执行
#!/bin/bash #This is a very simple example #echo输出字符串,注意后面没有分号,-e开启转义
echo -e 'Hello Word\n' #注意,需要权限
chmod 777 demo.sh
#执行脚本
./demo.sh
查找:
#三个命令找出 bash 所在的位置
1.locate bash
2.find / -name bash 2> /dev/null
3.whereis bash
简单变量:
#!/bin/bash
echo str #输出null
str='hello word'
echo $str #hello word
局部变量:
#!/bin/bash
HELLO=Hello
function hello(){
local HELLO=World
echo HELLO } echo HELLO
hello
echo $HELLO
上述代码是错误的,报错:syntax error: unexpected end of file。原因是函数的最后一个命令须要以分号‘;’结尾(有的是因为文件格式错误,vi打开后:set ff须要是unix。因为这是在windows中编译好文件再复制到linux的,set ff=unix就可以了 )。当然即使敲上分号依然报错:
./shell_demo: line 10: syntax error near unexpected token `echo'
./shell_demo: line 10: `echo HELLO; } echo HELLO'
这就是语法错误了,正确语法应该是:
#!/bin/bash
HELLO=Hello
function hello(){
local HELLO=World
echo $HELLO;
}
echo HELLO
hello
echo $HELLO
输出
HELLO
World
Hello
可以看到,全局变量HELLO的值并没有改变,hello执行的只是函数中的值。
基本流程控制语法:
if...then...else:
#!/bin/bash
a=1
b=10
c=0
if [ $a -gt $b ]
then
echo 'Good,1'
elif [[ $a == 1 && $a == $b ]]
then
echo 'a等于1 且 a等于b'
elif [ $a -lt $b ]
then
echo 'OK,1'
else
echo 'Bad,'$a
fi if [ -z $c ]
then
echo '字符c为0'
else
echo '字符c不为0'
fi
变成一行就是
#!/bin/bash
a=1
b=10
c=0
if [ $a -gt $b ]; then echo 'Good,1'; elif [[ $a == 1 && $a == $b ]]; then echo 'a等于1 且 a等于b'; elif [ $a -lt $b ]; then echo 'OK,1'; else echo 'Bad,'$a; fi if [ -z $c ]
then
echo 'c字符长度为0,返回true'
else
echo 'c字符长度不为0'
fi
输出
OK,1
c字符长度不为0
note:if后要有空格;变量前后要有空格;符号‘[’前后也要有空格;符号‘]’后要有分号‘;’且,then echo后也要有‘;’;最后要以fi结尾,即倒写关键字。到处都是空格,不然command not found。初次调试,找了好久...
另,关系运算符还有-eq、-ne、-ge、-le、!=就不举例子了。布尔运算符还有||。字符运算符还有-n(字符串长度是否为0,不为0返回 true)、str(字符串是否为空,不为空返回 true)。
for...in...:
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day done
done
输出
Sun done
Mon done
Tue done
Wed done
Thu done
Fri done
Sat done
while:
#!/bin/bash
a=1
while [ $a -lt 5 ]
do
echo $a done
let 'a++'
done
输出
1 done
2 done
3 done
4 done
until:
#!/bin/bash
a=0
until [ ! $a -lt 5 ]
do
echo $a
a=`expr $a + 1`
done
输出
0
1
2
3
4
until 也是循环控制语句,不过条件返回为true时才停止循环
case:
#!/bin/bash
echo '请输入键盘上任意字符:'
echo '你输入的字符为:'
read Keypress
case "$Keypress" in
[a-z]) echo "Lowercase letter";;
[A-Z]) echo "Uppercase letter";;
[0-9]) echo "Digit";;
*) echo "Punctuation,whitespace,or other";;
esac
输出
请输入键盘上任意字符:
你输入的字符为:
6
Digit
"read Keypress" 一句中的 read 语句表示从键盘上读取输入
待续...
break:退出循环
#!/bin/bash
a=1
while [ $a -lt 5 ]
do
if [ $a == 3 ]
then
echo $a done
break
fi
let 'a++'
done
输出
3 done
continue:退出当前循环,进入下个循环
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
if [ $day == Tue ]
then
continue
else
echo $day done
fi
done
输出
Sun done
Mon done
Wed done
Thu done
Fri done
Sat done
函数的使用:
function fuc(){
echo '我是fuc函数';
}
fuc2(){
echo '我是fuc2函数'
}
fuc
fuc2
输出
我是fuc函数
我是fuc2函数
文件包含:
. shell_demo2
./shell_demo2
source ./shell_demo2
输出
我是shell_demo2文件
我是shell_demo2文件
我是shell_demo2文件
expr表达式计算:
a=`expr 2 + 2`
echo $a
输出
4
note:注意符号‘`’。其他的还有-、*、/、%就不举例了
test检查某个文件是否存在:
if test -e ./bush
then
echo "文件存在"
else
echo "文件不存在"
fi
输出
文件不存在
printf打印输出:
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
输出
郭靖 男 66.12
note:“-”表示左对齐,没有表示右对齐,10表示字符宽度,s表示显示字符串,4.2f表示4位float数字保留两位小数。
数组:
array=(1 9 66 78 as8 -)
echo '默认读取第一个:'${array}
echo '读取下标为0的:'${array[0]}
echo '读取下标为1的:'${array[1]}
echo '读取所有的:'${array[*]}
echo '还是读取所有的:'${array[@]}
echo '获取数组长度:'${#array[@]}
echo '还是获取数组长度:'${#array[*]}
输出
默认读取第一个:1
读取下标为0的:1
读取下标为1的:9
读取所有的:1 9 66 78 as8 -
还是读取所有的:1 9 66 78 as8 -
获取数组长度:6
还是获取数组长度:6
note:bash只支持一维数组,不支持多维数组,并且没有限定数组的大小
文件测试运算符:
#!/bin/bash
file="/home/demo" if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
输出
文件可读
文件可写
文件可执行
文件为特殊文件
文件是个目录
文件不为空
文件存在
当然还有很多,这里只是一些常用的
参数传递:
echo '参数1:'$1
echo '参数2:'$2
echo '参数3:'$3
输出
[root@localhost demo]# ./shell_demo 我是参数1 我是参数2 我是参数3
参数1:我是参数1
参数2:我是参数2
参数3:我是参数3
敲了这么多,有一点要切记,空格狠重要。空格狠重要。空格狠重要。
还有很多,常用的应该就这么多了,待续...
shell基础之bash的更多相关文章
- Linux学习笔记(16)shell基础之Bash变量
1. 用户自定义变量 (1)变量设置规则 ① 变量名称可由字母.数字和下划线组成,但不能以数字开头: ② 变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型: ③ 变量用等号连接 ...
- Linux学习笔记(15)shell基础之Bash基本功能
1 shell概述 shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序.用户可以用shell启动.挂起.停止甚至是编写一些程序. shell是一个功能强大 ...
- linux笔记:shell基础和bash的基本功能
shell的优势:可以直接调用linux系统命令 shell脚本的基本写法:脚本名以.sh结尾程序的第一行为#!/bin/bash,告诉系统这是一个shell脚本以#作为注释shell脚本的执行方式: ...
- Shell基础 - Bash基础功能
历史命令 history选项: -c 清空历史命令 -w 立即保存历史命令Linux 下输入过的历史命令,都会保存在根目录下的:~/root/.bash_history 文件中默认保存 1000 条, ...
- Shell基础学习小结
0 shell基础概念 Shell是解释性语言,使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象:缺点是它们的效率通常不如编译型语言.Shell命令有本 ...
- shell基础二十篇 一些笔记
shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...
- Linux实战教学笔记17:精简shell基础
第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...
- shell基础及变量
一 Shell概述 1.Shell的作用——命令解释器,“翻译官” shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上. ...
- Linux基础学习(10)--Shell基础
第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...
随机推荐
- Linux系统下手把手完成无人值守安装服务
刚入职的运维新手经常会被要求去做一些安装操作系统的工作,如果按照用镜像光盘安装操作系统,效率会相当低下.那么如何提升效率,搭建出一套可以批量安装Linux系统的无人值守的安装系统? PXE+TFTP+ ...
- django--orm关系字段(ForeignKey、OneToOneField、ManyToManyField)详解
django中的关系字段 1.ForeignKey字段,即外键字段,对应一对多的情况,列如:一本书对应一个出版社,一个出版社可对应多本书. 2.ManyToManyFiled字段,即多对多字段,对应数 ...
- Codeforces Round #443 Div. 1
A:考虑每一位的改变情况,分为强制变为1.强制变为0.不变.反转四种,得到这个之后and一发or一发xor一发就行了. #include<iostream> #include<cst ...
- 大学java教案之MySQL安装图解
一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行"setup.exe". 2.选择安装类型,有"Typ ...
- 【AGC014E】Blue and Red Tree 并查集 启发式合并
题目描述 有一棵\(n\)个点的树,最开始所有边都是蓝边.每次你可以选择一条全是蓝边的路径,删掉其中一条,再把这两个端点之间连一条红边.再给你一棵树,这棵树的所有边都是红边,问你最终能不能把原来的树变 ...
- Xadmin 组件基础使用以及全局配置
xadmin 的安装 方式一 pip 安装 会因为编码问题导致报错 因此需要下载 更改 README.rst 后本地安装 详情点击这里 方式二 源码方式安装 在 github 上下载源码后 将 xad ...
- pytorch kaggle 泰坦尼克生存预测
也不知道对不对,就凭着自己的思路写了一个 数据集:https://www.kaggle.com/c/titanic/data import torch import torch.nn as nn im ...
- 爬虫_拉勾网(解析ajax)
拉勾网反爬虫做的比较严,请求头多添加几个参数才能不被网站识别 找到真正的请求网址,返回的是一个json串,解析这个json串即可,而且注意是post传值 通过改变data中pn的值来控制翻页 job_ ...
- 用户队列服务API
/// <summary> /// 用户队列服务API /// </summary> public interface ICustomerQueueManager : ISer ...
- 「HNOI2016」网络 解题报告
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...