博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shell Script
阅读量:5025 次
发布时间:2019-06-12

本文共 2863 字,大约阅读时间需要 9 分钟。

第一行一般这样写 #!/bin/bash

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

hello world

#!/bin/bash

echo "hello world"

保存为t.sh,然后 chmod +x ./t.sh  赋予这个文件可执行权限

变量

首个字符必须为字母,可以使用下划线_,不能使用标点符号,不能用bash的关键字,赋值变量的时候跟等号之间不能有空格

使用变量的时候,要在变量前加上$,变量最好加上花括号,比如

name="tracy"

echo ${name}

只读变量:只读变量的值不能被改变  

readonly name

 

运算符

原生的bash不支持简单的数学运算,但是可以通过其他的命令来实现。比如 awk 和 expr。expr最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。比如

val=`expr 2 + 2`

echo "val = $val"

结果:val = 4

注意:1.表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2 

2.完整的表达式要被 ` ` 包含 (esc下面这个键)

 

布尔运算符:! -o -a 分别代表非,或,与

 

流程控制

条件控制

name="tracy"

if [ $name = "tracy" ]

then

  echo 'name = tracy'

fi

注意判断语句要加上 [ ] ,并且要空格,如果then要写在上面一行的话,上一行要先加上分号隔开一下。比如

if [ $name = "tracy" ];then ..... 以后还有类似的情况,总之就是,如果写在一行要记得用分号隔开。

 

for循环

for loop in 1 2 3 4 5

do

  echo "the value is:$loop"

done

 

while循环

int=1

while(( int < 5 ))

do

  echo $int

  let 'int++'

done

 

函数

无参数,无返回值的函数

myfun(){

  echo 'my first shell fun'

}

myfun  #函数调用,不需要加括号

 

无参数,有返回值

sum(){

  echo "input a num"

  read num_a

  echo "input another num"

  read num_b

  return $(( $num_a + $num_b ))

}

sum

echo "sum is $? "

注意:在函数调用后使用$?来获取返回值

 

带参数的函数

funWithPara(){

  echo "the first para is $1"
  echo "the second para is $2"
  echo "the third para is $3"
}
funWithPara 1 2 3

通过$n来获取参数的值,$1表示第一个参数,以此类推。$#表示传进来的参数的总数,$*以字符串的形式显示所有传进来的参数

 

输入\输出重定向

通常来说, UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。

1.输出重定向

格式:command>file

echo "hello world" > a

cat a  # hello world

注意如果文件a里有内容,那么上面代码是会覆盖掉里面的内容的,如果不想覆盖,要使用 >> ,这样就会加在内容末尾(以追加的方式)

2.输入重定向

格式:command < file

wc -l < t.sh  # 打印出文件打行数

 

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件

 

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

如果希望 stderr 重定向到 file,可以这样写 

command 2 > file

 

如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

command > file 2>&或者  command >> file 2>&1

 

 

3.Here Document

格式:

command << delimiter

       document
delimiter

注意:1.结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。

2.开始的delimiter前后的空格会被忽略掉。

3.我试了下,delimiter可以写aaa,bbb什么的,这玩意只是用来界定开始结束的,网上一般大家都写EOF。

cat << aa

go lakers
go shell
aa

 

/dev/null

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null

command > /dev/null   比如  echo "hello world" > /dev/null

 

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

 

如果希望屏蔽 stdout 和 stderr,可以这样写:

command > /dev/null 2>&1

文件包含

包含一个文件用

. filename #注意点和filename之间的空格

或者

source filename这两种形式都可以包含进来

比如

新建一个文件t1.sh

#!/bin/bash

val="i am val"

 

新建一个文件t.sh

#!/bin/bash

#. ./t1.sh
source ./t1.sh
echo "the val is $val"

 

结果:    the val is i am val

注意:被包含的文件不需要可执行权限

 

删除多个账号

比如有5个账号分别是myquota1,myquota2,myquota3,myquota4,myquota5,要删掉他们,写如下脚本

#!/etc/bash

users=`grep "myquota*" /etc/passwd | cut -d ':' -f1`

for username in $users

do
userdel -r $username
done

 

执行完,再看看 grep myquota* /etc/passwd 发现已经删除掉了

 

转载于:https://www.cnblogs.com/i-love-kobe/p/7286097.html

你可能感兴趣的文章
python selenium向<sapn>标签中写入内容
查看>>
JS常用坐标
查看>>
使用”结构化的思考方式“来编码和使用”流程化的思考方式“来编码,孰优孰劣?...
查看>>
C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】...
查看>>
关于git的认证方式
查看>>
字符串按照字典序排列
查看>>
IOS 开发调用打电话,发短信
查看>>
CI 框架中的日志处理 以及 404异常处理
查看>>
keepalived介绍
查看>>
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>