第一行一般这样写 #!/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>&1 或者 command >> file 2>&1
3.Here Document
格式:
command << delimiter documentdelimiter
注意:1.结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
2.开始的delimiter前后的空格会被忽略掉。
3.我试了下,delimiter可以写aaa,bbb什么的,这玩意只是用来界定开始结束的,网上一般大家都写EOF。
cat << aago lakersgo shellaa
/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.shsource ./t1.shecho "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 $usernamedone
执行完,再看看 grep myquota* /etc/passwd 发现已经删除掉了