Shell Script

第一行一般这样写 #!/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